防止子窗口多次打开

时间:2016-04-11 13:01:30

标签: python wxpython

我正在使用语言wxPython创建一个应用程序。 我有一个简单的问题,我无法在互联网上找到解决方案。

我有一个带菜单栏的主用户界面,其中包含一个名为new file的菜单。 通过单击新文件,将出现一个新窗口,要求用户填写必要的信息。

问题是,通过多次单击菜单(新文件),应用程序将打开多个窗口。

我该如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

以下代码创建一个新子帧(如果尚未存在)。 如果它确实存在,则使用现有的子帧。

请注意,代码使用最新的wxpython phoenix和classic进行测试。

import wx
from wx.lib import sized_controls


class MultiMessageFrame(sized_controls.SizedFrame):

    def __init__(self, *args, **kwargs):
        super(MultiMessageFrame, self).__init__(*args, **kwargs)
        pane = self.GetContentsPane()
        text_ctrl = wx.TextCtrl(
            pane, style=wx.TE_READONLY | wx.TE_CENTRE | wx.TE_MULTILINE)
        text_ctrl.SetSizerProps(proportion=1, expand=True)
        text_ctrl.SetBackgroundColour('White')
        self.text_ctrl = text_ctrl

        pane_btns = sized_controls.SizedPanel(pane)
        pane_btns.SetSizerType('horizontal')
        pane_btns.SetSizerProps(align='center')

        button_ok = wx.Button(pane_btns, wx.ID_OK)
        button_ok.Bind(wx.EVT_BUTTON, self.on_button_ok)

    def append_msg(self, title_text, msg_text):
        self.SetTitle(title_text)
        self.text_ctrl.AppendText(msg_text)

    def on_button_ok(self, event):
        self.Close()


class MainFrame(sized_controls.SizedFrame):

    def __init__(self, *args, **kwargs):
        super(MainFrame, self).__init__(*args, **kwargs)
        self.SetInitialSize((800, 600))
        self.CreateStatusBar()
        menubar = wx.MenuBar()
        self.SetMenuBar(menubar)
        menu_file = wx.Menu()
        menu_file.Append(
            wx.ID_NEW, 'Show msg', 'Add a new message to message frame')
        menubar.Append(menu_file, '&File')
        self.Bind(wx.EVT_MENU, self.on_new, id=wx.ID_NEW)

        self.count = 1
        self.multi_message_frame = None

    def on_new(self, event):
        title_text = 'MultiMessageFrame already exists'

        if not self.multi_message_frame:
            title_text = 'Newly created MultiMessageFrame'
            self.multi_message_frame = MultiMessageFrame(
                self, style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_FLOAT_ON_PARENT)
            self.multi_message_frame.Bind(
                wx.EVT_CLOSE, self.on_multi_message_frame_close)
            self.multi_message_frame.Center()
            self.multi_message_frame.Show()

        self.multi_message_frame.append_msg(
            title_text, 'message no.{}\n'.format(self.count))
        self.count += 1

    def on_multi_message_frame_close(self, event):
        self.multi_message_frame = None
        event.Skip()


if __name__ == '__main__':
    app = wx.App(False)
    main_frame = MainFrame(None)
    main_frame.Show()
    app.MainLoop()