启动wxPython并扩展另一个类

时间:2016-07-21 18:52:35

标签: python inheritance wxpython

我正在从tkinter切换到wxPython,当使用类似于下面的wxexample类的模板wxPython脚本时,我对继承感到困惑。鉴于我的三个脚本(mainClass.py,wxexample.py,callbacks.py),我该怎么做:

1)从mainClass正确启动wxPython窗口;

2)让Example类扩展下面的回调类。

mainClass.py:

from time import sleep
import callbacks as clb
import wxexample

class mainClass(clb.callbacks): #, wxexample.Example):
    def main(self):
        #Here start the wxPython UI in wxexample!
        ...
        #while 1:  Edited
        #   sleep(0.5)

if __name__ == "__main__":
    instance = mainClass()
    instance.main()

wxexample.py:

import wx
class Example(wx.Frame):
    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw)         
        self.InitUI()

    def InitUI(self):
        pnl = wx.Panel(self)
        btn=wx.Button(pnl, label='Button', pos=(20, 30))
        #Here I would like to call callbacks.mycallback as self.mycallback:
        btn.Bind(wx.EVT_BUTTON, self.mycallback)  
        self.Show(True)

callbacks.py:

class callbacks():
    def mycallback(self, e): #EDITED
        print("callbacks.mycallback")

已解决:我回到基础并发现了这个解决方案。我很困惑,因为在我的实际实现中,mainClass因为其他原因而扩展了wxexample.Example,这会引发错误(无法为基础创建一致的方法解析顺序(MRO)示例,回调)

import callbacks as clb
import wxexample

class mainClass(clb.Callbacks): #, wxexample.Example):
    def main(self):
        wxexample.main()

if __name__ == "__main__":
    instance = mainClass()
    instance.main()

wxexample.py:

import wx
import callbacks as clb
class Example(wx.Frame, clb.Callbacks):
    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw)         
        self.InitUI()

    def InitUI(self):
        pnl = wx.Panel(self)
        btn=wx.Button(pnl, label='Button', pos=(20, 30))
        #Here I would like to call callbacks.mycallback as self.mycallback:
        btn.Bind(wx.EVT_BUTTON, self.mycallback)  
        self.Show(True)

def main():    
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

所有wxPython应用程序至少需要以下内容:

  1. wx.App的实例或从wx.App
  2. 派生的子类
  3. 已显示的顶级UI元素的实例,例如wx.Framewx.Dialog或派生类
  4. 一个事件循环,几乎总是通过调用应用程序对象的MainLoop方法来实现。
  5. 根据该列表,我担心你在main方法中显示的while循环,因为没有使用主事件循环,或阻止控制返回它,会导致比你想要的更多的问题在学习工具包时要处理。您可以使用以下内容替换while循环,这将使您走上正确的轨道:

    app = wx.App()
    frame = wxexample.Example(None, title="Example Frame")
    app.MainLoop()
    

    你还需要给mycallback一个额外的参数,因为事件处理程序总是传递给一个事件对象,即使他们不需要它。

    如果您还没有,我建议您阅读本网站上的教程:http://zetcode.com/wxpython/