使用事件创建PyGTK GUI以重新加载自身

时间:2011-02-04 20:28:45

标签: user-interface gtk pygtk reload

我正在使用PyGTK进行原型设计GUI布局,有时候使用glade / builder没有,并且以下场景无休止地重复:

  1. 修改代码
  2. 运行GUI脚本
  3. 判断结果
  4. 再次修改
  5. 再次跑步......
  6. 所以,既然我听说Python允许重新加载模块,我想知道是否可以在不关闭窗口的情况下修改代码,然后从窗口本身,例如,点击按钮,“重新加载“窗口反映了代码的变化。

    由于这是一个概念性问题,我没有任何特定的代码可供展示。

    感谢您的关注

1 个答案:

答案 0 :(得分:1)

我认为如果您执行以下操作是可能的:

  1. 在按下按钮时识别并隔离要查看更新的窗口小部件W(如果要查看整个窗口的更新,则在窗口中添加任何内容,而不是窗口本身)。
  2. 编写一个创建并返回此小部件的函数(或类)
  3. 将此功能或类放入您将重新加载的模块中
  4. 在W外部创建按钮并将其连接到执行以下操作的功能
    • 从窗口中删除当前的W
    • 重新加载模块
    • 创建W
    • 的新实例
    • 将其添加到窗口
  5. 当然,这里的关键步骤是“重新加载模块”。我想你必须确保没有来自模块的代码正在运行,并且没有其他模块依赖于在该模块上定义的变量。

    编辑:我有一段时间,所以我制作了一个原型。更改widget_module.py中的标签,然后点击Update

    gui.py

    # Load in pygtk and gtk
    
    import pygtk
    pygtk.require('2.0')
    import gtk
    import widget_module
    
    # Define the main window
    
    class Whc:
        def __init__(self):
            # Window and framework
            self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.window.connect("destroy", self.destroy)
    
            # A Button, with an action
            # Add it to the geometry
            # show the button
            self.button = gtk.Button("Update")
            self.button.connect("clicked", self.update, None)
    
            self.vbox = gtk.VBox()
            self.vbox.pack_start(self.button)
            self.widget = widget_module.get_widget()
            self.vbox.pack_start(self.widget)
    
            self.window.add(self.vbox)
    
    
            # Show the window
            self.window.show_all()
    
        # Callback function for use when the button is pressed
    
        def update(self, widget, data=None):
            print "Update"
            self.vbox.remove(self.widget)
            reload(widget_module)
            self.widget = widget_module.get_widget()
            self.vbox.pack_start(self.widget)
            self.widget.show()
    
    
        # Destroy method causes appliaction to exit
        # when main window closed
    
        def destroy(self, widget, data=None):
            gtk.main_quit()
    
        # All PyGTK applicatons need a main method - event loop
    
        def main(self):
            gtk.main()
    
    if __name__ == "__main__":
        base = Whc()
        base.main()
    

    widget_module.py

    import pygtk
    import gtk
    
    def get_widget():
        return gtk.Label("hello")