2015-06-24 70 views
3

我们有两个应用程序,一个使用Tkinter界面开发,另一个使用wxPython构建。两者都相当复杂。当完成运行Tkinter应用程序时,我希望在Tkinter应用程序中选择一个按钮后运行wxPython应用程序。是否有切换事件循环,以便Tkinter应用程序可以无缝切换到wxPython GUI?关闭Tkinter后运行wxPython

虽然下面做工作root.destroy后,在Tkinter的应用: os.system('python wxGUI.py')

最终方案需要被捆绑到了多个操作系统的独立的应用程序,所以如果我创建一个单独的py2app这一解决方案只会工作或用于wxPython应用程序的py2exe,并以此方式调用它(这不太理想)。

回答

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工具包的问题是它们的主循环可能会相互干扰。您可能不得不使用多处理模块而不是线程模块来解决这个问题。我不太确定。但是这应该让你开始。

+0

谢谢您提出的解决方案。此代码成功加载Tkinter,但是当选择“Wx”按钮时,程序在Mac上使用Tcl_ServiceModelHook崩溃:Notifier未初始化中止陷阱:6错误。我尝试了多处理来调用wxpython模块,但得到以下警告:该程序需要访问屏幕。 请使用python的Framework版本运行,并且只有当您在Mac的主显示器上登录到 时才运行。 – nateS

+0

我没有一个Mac可以用来测试。这在我的Xubuntu盒子上工作得很好。我认为框架构建错误可能来自wxPython。我认为某些版本的wxPython没有它或类似的东西就无法工作。 –