wxpython:只要第二帧打开就暂停代码

wxpython: pause code as long as second frame is open

我几乎是一个 Python 初学者,最近才开始使用 wxpython,现在有以下问题:

我正在编写一个应用程序,其中一个 window 打开并通过单击一个按钮,用户打开第二个 window,他们应该在其中输入他们的名字并单击另一个按钮.我的问题是我不知道如何暂停通过单击 Button1 执行的 'event code',直到用户在第二个 window 中完成他们的操作.

有没有办法暂停 OnButton1 中的代码(在行 secondframe.Show() 之后,直到用户在 SecondFrame[ 中输入他们的名字=25=] 并点击 OnButton2?

基本上我的目标是首先打印用户名,然后才打印 完成

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel = wx.Panel(self)
        self.Button1 = wx.Button(self.panel, label='Button 1', pos=(20, 10), size=(90, 25))

        #Set event handlers
        self.Button1.Bind(wx.EVT_BUTTON, self.OnButton1)

    def OnButton1(self, e):
        secondframe = SecondFrame(None)
        secondframe.Show()
        print("Done")



class SecondFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel = wx.Panel(self)
        self.Button2 = wx.Button(self.panel, label='Button 2', pos=(50, 20), size=(90, 25))
        self.NameBox = wx.TextCtrl(self.panel, value="Type Your Name", pos=(50, 60), size=(200, -1))


        #Set event handlers
        self.Button2.Bind(wx.EVT_BUTTON, self.OnButton2)

    def OnButton2(self, e):
        Name = self.NameBox.GetValue()
        print(Name)


app = wx.App(False)
frame = MainFrame(None)
frame.Show()
app.MainLoop()

我不知道有什么方法可以真正阻止那里的代码。 (另外,一般来说,阻塞从来都不是一个好主意。)
但是你可以获得这样的相同行为:

  • 打开第二个 window,在第一个 Window 中调用 self.Disable()
  • 当创建第二个 window 时,您还将对第一个 window 的引用传递给它(即 secondframe = SecondFrame(None, self)),调整构造函数(def __init__(self, parent, main):)和将它存储在一个变量中 (self.mainFrame = main)。
  • 您向 MainFrame 添加一个方法,例如reenable(self)
  • 你叫self.Enable()
  • 完成第二帧后,您只需调用 self.mainFrame.reenable()

总而言之,这将是这样的:

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel = wx.Panel(self)
        self.Button1 = wx.Button(self.panel, label='Button 1', pos=(20, 10), size=(90, 25))

        #Set event handlers
        self.Button1.Bind(wx.EVT_BUTTON, self.OnButton1)

    def OnButton1(self, e):
        secondframe = SecondFrame(None, self)
        self.Disable()
        secondframe.Show()

    def reenable(self):
        self.Enable()
        print("done")



class SecondFrame(wx.Frame):
    def __init__(self, parent, main):
        wx.Frame.__init__(self, parent)
        self.mainFrame = main

        self.panel = wx.Panel(self)
        self.Button2 = wx.Button(self.panel, label='Button 2', pos=(50, 20), size=(90, 25))
        self.NameBox = wx.TextCtrl(self.panel, value="Type Your Name", pos=(50, 60), size=(200, -1))


        #Set event handlers
        self.Button2.Bind(wx.EVT_BUTTON, self.OnButton2)

    def OnButton2(self, e):
        Name = self.NameBox.GetValue()
        print(Name)
        self.mainFrame.reenable()


app = wx.App(False)
frame = MainFrame(None)
frame.Show()
app.MainLoop()