【问题标题】:Python/Glade/PyGTK - Not detecting handler correctlyPython/Glade/PyGTK - 未正确检测处理程序
【发布时间】:2011-11-15 18:31:27
【问题描述】:

我整个上午都在尝试调试,但似乎找不到解决方案。我有一个简单的 Glade/PyGTK 脚本,其中包含三个复选框和一个提交按钮。我一直在尝试确保使用 Glade GTKObject 的 Destroy Signal 为 gtk.main_quit 设置正确的处理程序,但即使在 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>

【问题讨论】:

    标签: python gtk pygtk glade


    【解决方案1】:

    我真的不明白你在用你的信号字典做什么。你说#Create our dictionary and connect it,但你似乎从来没有“连接”过它。

    如果你只是将他们的名字 self.Destroy 更改为 self.on_MainWindow_destroy 对我来说很好。

    builder.connect_signals 方法在 glade 文件中查找信号,并在脚本中匹配它们的同名函数。我不知道有什么方法可以用字典来做到这一点,但如果有的话,你似乎没有实现它。

    【讨论】:

    • 如果把过时的教程和最近的教程放在一起,那将是我的错误……叹息……感谢您的帮助! :D
    • @root45,阅读文档:pygtk.org/docs/pygtk/… 确实需要一本字典。
    • @ptomato 我觉得很傻。我略读了一遍,没有仔细阅读。谢谢。
    【解决方案2】:

    connect_signals() 调用之前创建您的字典dic,然后说

    self.builder.connect_signals(dic)
    

    connect_signals() 的第一个参数必须是字典或处理程序名称到处理程序的映射。 PyGTK 中的一个常见习惯用法是将self 作为这个字典传递,因为类自动也​​是映射到函数的函数名字典。但是,要使其工作,您的类中的函数必须与 Glade 文件中的处理程序具有相同的名称,正如 root45 指出的那样。如果您不想或不能给它们起相同的名称,请使用字典。

    【讨论】:

      【解决方案3】:

      同样的事情发生在我身上。当我将 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        相关资源
        最近更新 更多