关闭Tkinter后运行wxPython

时间:2015-06-24 01:46:45

标签: python loops events tkinter wxpython

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

以下内容在Tkinter应用中的root.destroy之后有效: os.system('python wxGUI.py')

最终程序需要捆绑到多个操作系统的独立应用程序中,因此只有在为wxPython应用程序创建单独的py2apppy2exe并以此方式调用时,此解决方案才有效(这不是理想的)。

1 个答案:

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