Python / Glade / PyGTK - Неправильный поиск обработчика - PullRequest
2 голосов
/ 15 ноября 2011

Я пытался отладить все это утро, но не могу найти решение.У меня есть простой скрипт Glade / PyGTK с тремя флажками и кнопкой отправки.Я пытался убедиться, что у меня есть правильная настройка обработчика для gtk.main_quit с помощью Glade GTKObject Destroy Signal, но даже после правильной настройки в Glade мой скрипт Python не обнаруживает обработчик, зависает приложение и возвращает этоошибка.

E:\Projects\DED\test.py:34: RuntimeWarning: missing handler 'on_MainWindow_destroy'
  self.builder.connect_signals(self)

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

Python Скрипт:

import sys
try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)


class GladeTest:

    def __init__(self):

        #Set the Glade file
        filename = "gui.glade"
        self.builder = gtk.Builder()
        self.builder.add_from_file(filename)
        self.builder.connect_signals(self)

        #Create our dictionay and connect it
        dic = { "btnSubmit_clicked" : self.btnSubmit_clicked,
        "on_MainWindow_destroy" : self.Destroy }

    def btnSubmit_clicked(self, widget):
        chkbt_chrome = self.builder.get_object("chkboxDropbox")
        print "ACTIVE--",chkbt_chrome.get_active()


    def Destroy(self, obj):
        gtk.main_quit() #make the program quit



if __name__ == "__main__":
    GladeTest()
    gtk.main()

print "All Done"

Файл Glade (gui.glade):

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="MainWindow">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">MainWindow</property>
    <property name="resizable">False</property>
    <property name="window_position">center</property>
    <signal name="destroy" handler="on_MainWindow_destroy" swapped="no"/>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Downloader</property>
            <attributes>
              <attribute name="style" value="normal"/>
              <attribute name="size" value="300"/>
            </attributes>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkCheckButton" id="chkboxDropbox">
            <property name="label" translatable="yes">Dropbox</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">False</property>
            <property name="use_action_appearance">False</property>
            <property name="draw_indicator">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkCheckButton" id="chkboxPython">
            <property name="label" translatable="yes">Python</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">False</property>
            <property name="use_action_appearance">False</property>
            <property name="draw_indicator">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
        <child>
          <object class="GtkCheckButton" id="chkboxChrome">
            <property name="label" translatable="yes">Google Chrome</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">False</property>
            <property name="use_action_appearance">False</property>
            <property name="draw_indicator">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">3</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="btnSubmit">
            <property name="label" translatable="yes">Download/Run</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="use_action_appearance">False</property>
            <signal name="clicked" handler="btnSubmit_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">4</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Я не совсем понимаю, что вы делаете со своим словарем сигналов. Вы говорите #Create our dictionary and connect it, но вы, кажется, никогда не «подключаете» его.

Если вы просто измените их имя self.Destroy на self.on_MainWindow_destroy, у меня это будет нормально работать.

Метод builder.connect_signals ищет сигналы в файле glade и сопоставляет их функции с тем же именем в вашем скрипте. Я не знаю ни одного способа сделать это с помощью словаря, но если он есть, вы, похоже, не реализовали его.

0 голосов
/ 28 января 2015

То же самое случилось со мной. Проблема исчезла, когда я отделил часть init () от части show (). Возможно, gtk / python требуется инициализация для полного обнаружения функций класса.

   class MyApp():
     ...
     def __init__(self):
        try:
            builder = gtk.Builder()
            builder.add_from_file("carte.glade")
        except:
            self.error_message("Failed to load UI XML file: carte.glade")
            sys.exit(1)

       # connect signals
        builder.connect_signals(self)        

     def main(self):
        self.window.show()
        gtk.main()
0 голосов
/ 16 ноября 2011

Создайте свой словарь dic перед вызовом connect_signals() и затем произнесите

self.builder.connect_signals(dic)

Первый аргумент connect_signals() должен быть словарем или отображением имен обработчиков в обработчики. Обычная идиома в PyGTK - передавать self в качестве этого словаря, поскольку класс автоматически также является словарем имен функций, сопоставленных с функциями. Однако, чтобы это работало, функции в вашем классе должны иметь те же имена, что и обработчики в файле Glade, как указывает root45. Если вы не хотите или не можете дать им одинаковые имена, используйте словарь.

...