2016-04-11 109 views
0

我正在使用wxPython语言创建应用程序。 我有一个简单的问题,我无法真正在互联网上找到解决方案。防止子窗口多次打开

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

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

我该如何预防?

+1

我不知道wxPython的,但一个简单的方法来处理是通过使用[模态对话框(http://wxpython.org/Phoenix/docs/html/Dialog.html#phoenix-title -modal和 - 无模式)。 –

回答

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() 
+0

对不起,当我尝试启动你的代码时,python无法导入sizes_controls。你知道为什么pthon不能导入这个模块吗? – maximus

+0

@maximus - 也许你使用的是没有size_controls的wxpython的旧版本。你使用的是什么版本,现在我已经测试了代码与classic和phoenix兼容。 – Yoriz

+0

好..但是,我设法通过使用你的算法来解决我的问题。谢谢 – maximus