вопрос на pygtk glade: почему этот простой скрипт не работает?

StackOverflow https://stackoverflow.com/questions/308913

  •  08-07-2019
  •  | 
  •  

Вопрос

Я пишу для написания небольшого приложения pygtk, использующего glade для создания пользовательских интерфейсов. Я уже создал несколько окон, которые работают, но по какой-то причине это не работает. Я получаю следующую трассировку:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    class TestClass:
  File "test.py", line 10, in TestClass
    self.wTree.signal_autoconnect(self)
NameError: name 'self' is not defined

Вот содержимое test.py:

#!/usr/bin/env python

import pygtk
import gtk
import gtk.glade

class TestClass:
    def __init__(self):
        self.wTree = gtk.glade.XML("test.glade")
        self.wTree.signal_autoconnect(self)

    def on_TestClass_destroy(self, widget, data):
        gtk.main_quit()

if __name__ == "__main__":
    window = TestClass()
    gtk.main()

А вот файл glade, test.glade:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Fri Nov 21 08:53:53 2008 -->
<glade-interface>
  <widget class="GtkWindow" id="TestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <signal name="destroy" handler="on_TestClass_destroy"/>
    <child>
      <placeholder/>
    </child>
  </widget>
</glade-interface>

Странно то, что если я уберу вызов signal_autoconnect (self), откроется окно. Но если я заменю этот вызов на «self.on_TestClass_destroy (self, None, None)», то quot; вместо этого он возвращает то же исключение NameError.

Я действительно не понимаю, почему это не работает, так как я создал несколько других оконных классов, которые работают нормально.

Работает ли здесь следующий код?

Это было полезно?

Решение

Этот код, окно и сигнальное соединение здесь работают нормально.

Хотя при вызове обработчика сигнала есть небольшая ошибка. Обработчик сигнала не должен иметь аргумент данных, поскольку в качестве аргумента передается только виджет.

def on_TestClass_destroy(self, widget):
    gtk.main_quit()

Аргумент (ы) данных - это только аргументы, предоставляемые при подключении, если вам требуется дополнительное состояние для обработчика сигнала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top