我们有两个应用程序,一个使用Tkinter接口开发,另一个使用wxPython构建。两者都相当复杂。完成运行Tkinter应用程序后,我希望在选择Tkinter应用程序中的按钮后运行wxPython应用程序。是否可以切换事件循环,以便Tkinter应用程序可以无缝切换到wxPython GUI?
以下内容在Tkinter应用中的root.destroy
之后有效:
os.system('python wxGUI.py')
最终程序需要捆绑到多个操作系统的独立应用程序中,因此只有在为wxPython应用程序创建单独的py2app
或py2exe
并以此方式调用时,此解决方案才有效(这不是理想的)。
答案 0 :(得分:0)
实现这一目标的最简单方法可能是将wxPython放入一个单独的线程中,只需要在调用wxPython应用程序时隐藏Tkinter应用程序即可。我只是一起鞭打这个例子,它似乎对我有用:
import Tkinter
import wxapp
import wx
from threading import Thread
########################################################################
class WxThread(Thread):
""""""
#----------------------------------------------------------------------
def __init__(self):
""""""
Thread.__init__(self)
self.start()
#----------------------------------------------------------------------
def run(self):
""""""
app = wx.App(False)
frame = wxapp.MyFrame()
app.MainLoop()
########################################################################
class MyApp(object):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
self.root = parent
self.root.title = "Tkinter App"
self.frame = Tkinter.Frame(parent)
self.frame.pack()
btn = Tkinter.Button(self.frame, text="Open wxPython App",
command=self.run_wx)
btn.pack()
def run_wx(self):
self.root.withdraw()
thread = WxThread()
thread.join()
self.root.deiconify()
#----------------------------------------------------------------------
if __name__ == "__main__":
root = Tkinter.Tk()
root.geometry("800x600")
app = MyApp(root)
root.mainloop()
这就是我在wxapp.py
模块中所拥有的:
import wx
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="wxPython App")
panel = wx.Panel(self)
self.Show()
您可能需要进行一些实验,因为运行两个不同的GUI工具包的主要问题之一是它们的主循环可能会相互干扰。您可能必须使用多处理模块而不是线程模块来解决这个问题。我不太确定。但无论如何这应该让你开始。