使用wxPython构建一个gui应用程序

时间:2012-05-19 12:30:49

标签: user-interface wxpython

使用wxpython构建一个gui应用程序,我在两个不同的文件中创建了两个单独的窗口,即app1.py和app2.py,我想使用第一个窗口上的按钮打开第二个窗口(app2.py) (app1.py)。我如何实现这一目标。如果有人可以提供帮助,那就太好了,谢谢!!

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

既然你说你想让窗口显示为APPEAR,可能在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