启动 wxPython 并扩展另一个 class

Starting wxPython and extending another class

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

1) 从mainClass正确启动wxPython window;

2) 让示例 class 扩展下面的回调 class。

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()

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

  1. wx.App 的实例或派生自 wx.App
  2. 的子class
  3. 顶级 UI 元素的实例,例如 wx.Framewx.Dialog 或派生的 class,已显示
  4. 事件循环,几乎总是通过调用应用程序对象的 MainLoop 方法来实现。

鉴于该列表,我担心您在 main 方法中显示的 while 循环,因为不使用主事件循环,或阻止控制返回它,将导致比您想在刚学习工具包时处理。您可以将 while 循环替换为类似以下内容,这将使您走上正确的轨道:

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

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

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