2016-04-11 12 views
0

言語wxPythonを使用してアプリケーションを作成しています。 私は本当にインターネット上で解決策を見つけることができないという単純な問題があります。サブウィンドウが複数回開くのを防ぐ

私は新しいファイルと呼ばれるメニューを含むメニューバーを持つメインのユーザーインターフェイスを持っています。 新しいファイルをクリックすると、ユーザーに必要な情報を入力するよう要求する新しいウィンドウが表示されます。

問題は、メニュー(新規ファイル)を複数回クリックすると、アプリケーションが複数のウィンドウを開くことです。

どうすればこの問題を防ぐことができますか?

+1

私はwxPythonのを知らないが、それを処理するための簡単な方法は、使用している[モーダルダイアログ](http://wxpython.org/Phoenix/docs/html/Dialog.html#phoenix-title -modal-and-modeless)である。 –

答えて

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はsized_controlsをインポートできません。なぜpthonがこのモジュールをインポートできないのか分かりますか? – maximus

+0

@maximus - あなたが使用しているかもしれないし、古いバージョンのwxpythonにはsizes_controlsがありません。使用しているバージョンは何ですか、私は今、古典とフェニックスの両方でOKになるようにコードをテストしました。 – Yoriz

+0

ok..anyhow、私はあなたのアルゴリズムを使用して私の問題を解決することができました。ありがとう – maximus

関連する問題