我正在使用wxPython語言創建應用程序。 我有一個簡單的問題,我無法真正在互聯網上找到解決方案。防止子窗口多次打開
我有一個主菜單欄,其中包含一個名爲new file的菜單。 通過單擊新文件,會出現一個新窗口,要求用戶填寫必要的信息。
問題是,通過多次點擊菜單(新文件),應用程序會打開多個窗口。
我該如何預防?
我正在使用wxPython語言創建應用程序。 我有一個簡單的問題,我無法真正在互聯網上找到解決方案。防止子窗口多次打開
我有一個主菜單欄,其中包含一個名爲new file的菜單。 通過單擊新文件,會出現一個新窗口,要求用戶填寫必要的信息。
問題是,通過多次點擊菜單(新文件),應用程序會打開多個窗口。
我該如何預防?
下面的代碼創建一個新的子框架,如果一個不存在。 如果它已經存在,它使用現有的子框架。
注意代碼是用最新的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()
我不知道wxPython的,但一個簡單的方法來處理是通過使用[模態對話框(http://wxpython.org/Phoenix/docs/html/Dialog.html#phoenix-title -modal和 - 無模式)。 –