【问题标题】:Running wxPython after closing Tkinter关闭 Tkinter 后运行 wxPython
【发布时间】:2015-09-10 01:08:13
【问题描述】:

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

虽然在 Tkinter 应用程序中 root.destroy 之后确实可以使用以下内容: os.system('python wxGUI.py')

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

【问题讨论】:

    标签: python loops events tkinter wxpython


    【解决方案1】:

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

    【讨论】:

    • 感谢您提出的解决方案。此代码成功加载TKinter,但在选择“WX”按钮时,程序在带有TCL_ServiceModelhook的Mac上崩溃:Notifier未初始化中止陷阱:6错误。我尝试多处理来调用 wxpython 模块,但收到以下警告:此程序需要访问屏幕。请使用 Python 的框架构建运行,并且仅当您在 Mac 的主显示屏上登录时运行。
    • 我没有方便的 Mac 进行测试。这在我的 Xubuntu 盒子上运行良好。我认为框架构建错误可能来自 wxPython。我认为某些版本的 wxPython 没有它或类似的东西就无法工作。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多