当前位置: 首页 > 知识库问答 >
问题:

关闭Tkinter后运行wxPython

夹谷志
2023-03-14

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

而在根目录之后,以下命令不起作用。销毁Tkinter应用程序中的:操作系统。系统('pythonwxgui.py')

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

共有1个答案

尤俊誉
2023-03-14

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

 类似资料:
  • 我使用ActiveMQ使用mvn构建运行集成测试。这是我的pom。xml首先触发activemq,然后触发集成测试,以便它们可以使用上面的activemq实例传输消息。 它工作正常,但不能顺利关闭..当mvn构建结束并且所有测试都成功时,构建看起来很好。但是activemq在关闭时会显示以下错误:- 有没有一种方法可以让Maven在maven构建完成时顺利关闭activeMQ而没有上述例外?以下是

  • 问题内容: Firefox可以运行,但是在测试执行完毕后,Firefox仍然可以运行。 这是在带有Firefox 3.6的Debian Linux上。 问题答案: 解决方案是将Selenium指向firefox-bin文件而不是firefox文件,如果它位于/ usr / bin / firefox,则默认情况下可以使用它。

  • 问题内容: 我在停止“供稿”时遇到问题;cancel参数似乎对after方法没有任何影响。尽管“进纸停止”已打印到控制台。 我尝试使用一个按钮将启动供稿,而另一个按钮将停止供稿。 随着输出: 问题答案: 问题是,即使你打电话与停止循环,已经有等待消防挂起的工作。按下停止按钮不会触发新的作业,但是旧的作业仍然存在,并且当它自己调用时,它将传入False,这将导致循环继续。 您需要取消待处理的作业,以

  • 我有问题关闭我的javaFX应用程序,当我点击关闭按钮从我的阶段,我的应用程序消失,但如果我寻找它在我的任务管理器我的应用程序仍然没有关闭。我尝试使用下面的代码强制关闭主线程和所有子线程,但是问题仍然存在。

  • 我有带oauth2安全mySql数据库连接和一些控制器的Spring Boot应用程序。我已经在AWS服务器上部署了它,它工作得很好,但它在一段时间后关闭了,它没有得到很多API调用,所以没有理由DDOS失败或outOfMemmory错误,我可以在日志中看到以下消息 2018-10-28 10:58:55.979信息1253---[线程-3]ConfigServletWebServerApplic

  • 我正在使用VS代码来编辑和运行Android项目。模拟器将打开,我看到程序启动,然后是程序的编译和运行。但是,在关闭了Android模拟器和VS代码之后,OpenJDK继续运行。 这是正常行为吗?有没有办法在模拟器/VSC退出后关闭OpenJDK JRE? 我主要关心的是电池寿命,因为我正在使用笔记本电脑。 系统:Windows 10 Pro(1909) Visual Studio代码版本:1.4