启动 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 应用程序至少需要以下内容:
wx.App
的实例或派生自 wx.App
的子class
- 顶级 UI 元素的实例,例如
wx.Frame
、wx.Dialog
或派生的 class,已显示
- 事件循环,几乎总是通过调用应用程序对象的
MainLoop
方法来实现。
鉴于该列表,我担心您在 main
方法中显示的 while 循环,因为不使用主事件循环,或阻止控制返回它,将导致比您想在刚学习工具包时处理。您可以将 while 循环替换为类似以下内容,这将使您走上正确的轨道:
app = wx.App()
frame = wxexample.Example(None, title="Example Frame")
app.MainLoop()
你还需要给 mycallback
一个额外的参数,因为事件处理程序总是传递一个事件对象,即使他们不需要它。
如果您还没有,我建议您阅读此站点上的教程:http://zetcode.com/wxpython/
我正在从 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 应用程序至少需要以下内容:
wx.App
的实例或派生自wx.App
的子class
- 顶级 UI 元素的实例,例如
wx.Frame
、wx.Dialog
或派生的 class,已显示 - 事件循环,几乎总是通过调用应用程序对象的
MainLoop
方法来实现。
鉴于该列表,我担心您在 main
方法中显示的 while 循环,因为不使用主事件循环,或阻止控制返回它,将导致比您想在刚学习工具包时处理。您可以将 while 循环替换为类似以下内容,这将使您走上正确的轨道:
app = wx.App()
frame = wxexample.Example(None, title="Example Frame")
app.MainLoop()
你还需要给 mycallback
一个额外的参数,因为事件处理程序总是传递一个事件对象,即使他们不需要它。
如果您还没有,我建议您阅读此站点上的教程:http://zetcode.com/wxpython/