【问题标题】:Building a gui app using wxPython使用 wxPython 构建一个 gui 应用程序
【发布时间】:2012-05-19 12:30:49
【问题描述】:

我正在使用 wxpython 构建一个 gui 应用程序,我在两个不同的文件中创建了两个单独的窗口,即 app1.py 和 app2.py,我想使用单击第一个窗口的按钮打开第二个窗口(app2.py) (app1.py)。我如何做到这一点。如果有人能帮忙就太好了,谢谢!!

【问题讨论】:

    标签: user-interface wxpython


    【解决方案1】:

    我假设您使用的是 wxPython 的“窗口”定义(即在 GUI 中实际可见的任何内容),而不是“带有东西的单独框和角落里的 X 按钮”的常规定义(其中wxPython 调用一个“框架”)

    当我编写我的第一个 wxPython GUI 时,我遇到了类似的问题。我希望一个面板中的操作能够影响另一个面板中显示的数据。我的第一个解决方案是编写方法,将请求盲目地传递给面板的父级,直到它到达顶层(我的“主框架”,如果你愿意的话)。这行得通,但显然这是一个糟糕的解决方案。

    我的第二个解决方案是使用 wxPython 事件,就像捕捉 wx.Panel 的按钮按下一样。我的想法是我会在一帧中创建一个按钮,然后将 wx.EVT_BUTTON 与该按钮的 ID 绑定到另一帧中。我制作了自定义事件和命令事件。在尝试实施此解决方案时,我发现不传播并且 CommandEvents 只会通过父母传播。因此,如果未捕获 CommandEvent 最终会击中您的“主框架”,但它永远不会击中第二个面板,除非该面板恰好是事件来源的父级。显然,这对你不起作用,因为父母不能隐藏,但孩子是可见的。此外,它会使您的主框架中充斥着代码和委托命令的方法。

    终于,我找到了答案! wx.lib.pubsub!基本上,您在 app1.py 中绑定按钮按下,就像平常一样。现在,在处理程序中,您使用 pubsub 发布自定义消息。接下来,在 app2.py 的 init 中,您使用 pubsub 订阅您的自定义消息(我喜欢有一个“message.py”,其中我将所有消息声明为常量)。当您订阅消息时,您会分配一个处理程序方法,就像事件一样。\

    阅读:http://wiki.wxpython.org/WxLibPubSub

    既然你说你想让窗口出现,也许在 app2.py 的 init 方法中你调用 Hide() 方法,然后当你收到消息时调用 Show()。

    当我在我的应用程序中实现它时,我使用的是 wxPython2.8。我现在使用的是 2.9,所以我不知道这是否仍然需要,但我发现我需要顶部导入才能调用 pubsub.subscribe() 和 pubsub.sendMessage()。否则我不断收到错误。我不记得我是怎么想出来的,我想我在代码示例中看到了它,并拼命地添加它以使我的代码正常工作。我建议您阅读我上面链接的文档,并尝试在不先导入的情况下实现您的代码。

    import wx
    from wx.lib.pubsub import setupkwargs #I need this to force pubsub to work. I don't know why.
    from wx.lib.pubsub import pub
    
    ID_MYBUTTON = wx.NewId()
    
    class App1(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init___(self, parent)
    
            button = wx.Button(self, ID_MYBUTTON, "Show App2")
            self.Bind(wx.EVT_BUTTON, self.handleButton, id=ID_MYBUTTON
    
        def handleButton(self, event):
            pubsub.sendMessage("mybutton.pressed") #send the message
    
    class App2(wx.Window):
        def __init__(self, parent):
            wx.Window.__init__(self, parent)
    
            self.Hide() #I don't want to be seen yet
    
            pubsub.subscribe(self.gotMessage, "mybutton.pressed") #listen for the message
    
        def gotMessage(self):
            self.Show() #Now I want to be seen!
    

    -----编辑-----

    我发现这个问题可能会有所帮助:Creating child frames of main frame in wxPython

    请详细告诉我们您要做什么? wxPython 也有“对话框”,如果您所做的只是向用户显示消息或询问更多信息,它会比框架更好。 http://wxpython.org/docs/api/wx.Dialog-class.html

    这真的取决于你想要完成什么。除非您解释您要解决的问题,否则我们无法为您提供帮助。

    -----编辑 AGIAN-----

    看起来提问的人确实想要一个 wx.Dialog。教程见http://zetcode.com/wxpython/dialogs/另见Python WX - Returning user input from wx Dialog

    【讨论】:

    • 我试过这个方法,它对我的​​应用程序没问题我在 app1.py 中创建了一个框架,它有按钮。当我点击按钮时,它应该打开第二个框架,为此我已将代码写入单独的文件 app2.py 我的问题是当我单击第一帧上的按钮时如何调用第二帧显示?我无法链接两个单独的 gui 文件,请帮助!!!
    • 正在创建一个应用程序,用户在其中输入一个值,如果其为真,则显示第二个窗口,他必须再次在文本字段中输入几个值,所以我将两个框架创建为我之前告诉过你,app1.py 和 app2.py 都在不同的程序和文件中,但是我无法通过第一帧打开第二帧。我试图寻找解决方案,但到处我发现子框架和父框架的代码写在同一个程序中,我想把子框架和父框架的代码放在单独的文件中,并通过父框架打开子框架!!!
    • 输入值后第二个窗口会关闭吗?如果是这样,答案是 wx.Dialog:zetcode.com/wxpython/dialogs
    • 但是我可以将值存储在对话框中输入的数据库中吗?
    • 我也试过把我的代码放在这个专栏里,但是它被作为一个段落发布了!!!你如何发布代码?这样我就可以给你看我写了什么!!
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2013-08-30
    • 2012-02-09
    • 2012-10-17
    • 2012-06-17
    • 2012-10-02
    • 2018-08-31
    • 2012-06-12
    相关资源
    最近更新 更多