2017-08-24 37 views
0

WxPythonではモーダルフレームで厄介な動作が発生しました。 モーダルウィンドウが現れると、それはフォアグラウンド(メインウィンドウの最上部)に表示され、メインウィンドウはアクセス不可能になります(クリックなどの応答はありません)。WxPython - モーダルウィンドウの動作が不正確

これは、Windowsの開始(ステータス)バーを使用するまで、ネストされたWxFramesで期待どおりに動作しています。 Windowsバーのメインフレームをクリックすると、2番目のフレームの上に表示されます。ユーザーは何が起こっているのか理解できず、ウィンドウにアクセスできない理由が完全に間違っています。

最初の解決策は、最初のフレームのアクティベーションイベントをバインドし、2番目のフレームをフォアグラウンドにプログラム的に設定します(&)。しかし、WxPythonではこの動作が自然に行われているわけではないことが私には奇妙なようです。

誰もが考えているのですか、それともネイティブ/汎用ソリューションですか?

+0

"ネストされたモーダルフレーム"は最初から恐ろしいアイデアのように聞こえます。あなたは、実際に焦点を当てているもののための狩猟の混乱した位置でうまく終わることができます。 –

+0

「入れ子になった」という言葉は忘れてしまった!私は混乱している場合は、タイトルからこの単語を削除します。この問題は "1つの"モーダルフレームでのみ発生し、モーダルウィンドウを使用するのはひどい考えです。 –

+0

モーダルウィンドウは、モーダルウィンドウが閉じられるまで、トップレベルプログラムの他のすべてのワークフローをブロックします。モーダルウィンドウは、ユーザーの注意を引くことを目的としています。ユーザーは、モーダルウィンドウに注意が必要であることを認識せず、メインウィンドウが応答しないという混乱を招きます。重大なケースでは、同じプログラムによって制御される別のウィンドウの後ろにモーダルウィンドウが表示され、モーダルウィンドウを手動で配置できるようになるまでプログラム全体が応答しなくなる可能性があります。 https://en.wikipedia.org/wiki/Modal_window –

答えて

0

私が私の質問で示唆したように、私はすべての子供のウィンドウを上げるイベントを起動しました。これは期待どおりに動作します。最初に最上位のウィンドウに移動し、最初のウィンドウから上げてすべての子フレームを常に上げることができます。しかし、いつもwxPythonによって自然に管理されていないことは私には奇妙です。

def __init__(self, parent): 
    wx.Frame.__init__(...) 
    ... 
    self.Bind(wx.EVT_ACTIVATE, self.on_activate_window) 

def on_activate_window(self, event): 
    """ 
    Set modal windows to foreground by their hierarchical order 
    """ 
    self.set_children_to_top(self.GetChildren()) 

def set_children_to_top(self, children): 
    """ 
    Loops all children of the given windows, if any other modal window is found, it raises the new window to foreground 
    """ 
    for child in children: 
     if isinstance(child, wx.Frame) and child.is_modal: 
      child.Raise() 
     try: 
      child_window = child.GetChildren() 
      if child_window: 
       self.set_children_to_top(child_window) 
     except AttributeError: 
      continue 
0

あなたがモーダルウィンドウを必要とするとき、そのように動作するように最初から設計されたとして、wx.Dialogを使用することがはるかに優れています。実際には、フレームのためにMakeModalメソッドが削除されましたが、矛盾があるため、実際には回避策があります。

+0

私たちにはたくさんのwxFrameがある巨大なプロジェクトがあります。だから私は安全で簡単にそれらをすべてwxDialogに移行することはできないと思う(正直言って私の回避策を好む) 私が知っている限り、wxFrameはメニューバーを備えたアプリケーションのメインウィンドウとして設計されている。ツールバーとステータスバー。これらの機能はすべて、wxDialogによってネイティブにサポートされていません。 –

関連する問題