2016-04-11 150 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