我正在使用 wxpython 构建一个 gui 应用程序,我在两个不同的文件中创建了两个单独的窗口,即 app1.py 和 app2.py,我想使用单击第一个窗口(app1.py)的按钮打开第二个窗口(app2.py)。 py)。我如何做到这一点。如果有人能帮忙就太好了,谢谢!!
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!
- - -编辑 - - -
我发现这个可能有帮助的问题:在 wxPython 中创建主框架的子框架
请详细告诉我们您要做什么?wxPython 也有“对话框”,如果您所做的只是向用户显示消息或询问更多信息,它会比框架更好。http://wxpython.org/docs/api/wx.Dialog-class.html
这实际上取决于您要完成的工作。除非您解释您要解决的问题,否则我们无法帮助您。
-----编辑阿吉安-----
看起来问这个问题的人确实想要一个 wx.Dialog。有关教程,请参阅http://zetcode.com/wxpython/dialogs/另请参阅Python WX - 从 wx 对话框返回用户输入