0

小さなウィンドウが多数ある大きなアプリケーションがあります。traitsui のファイル ダイアログを使用して、これらのウィンドウからいくつかのファイルを開きたいと思いました。ただし、ファイルダイアログはファイルを正しく生成して選択しますが、終了後にアクティブなウィンドウを望ましくないウィンドウに一貫して切り替えます。なぜだか本当に困っています。

同じ問題を表示する簡単なテストを次に示します。

from traitsui.api import *
from traits.api import *
from traitsui.file_dialog import *

class BigApplication(HasTraits):
  subwindow=Instance(HasTraits)
  open_subwindow=Button('clickme')

  traits_view=View(Item(name='open_subwindow'),height=500,width=500)

  def _subwindow_default(self):
    return Subwindow()

  def _open_subwindow_fired(self):
    self.subwindow.edit_traits()

class Subwindow(HasTraits):
  f=File
  some_option = Bool
  openf=Button('Browse for file')

  traits_view=View(Item(name='f',style='text'),
                Item(name='some_option'),
                Item(name='openf'),buttons=OKCancelButtons)

  def _openf_fired(self):
    self.f=open_file()

BigApplication().configure_traits()

open_file が戻って目的のファイルを選択すると、アクティブなウィンドウは BigApplication ウィンドウに切り替わり、サブウィンドウ ウィンドウには戻りません (ユーザーが [OK] をクリックする前にいくつかの追加オプションを選択できるようにするため)。

4

1 に答える 1

0

いつものように、ハックな回避策を見つけました。しかし、この動作はまだバグです。

回避策はdispose()、古いウィンドウを削除edit_traits()してから呼び出すことです。Fileこれは特性を編集し、たまたまそれをアクティブなウィンドウにします。ウィンドウの破棄は、ハンドラー内で手動で行う必要があり、予想よりも少し複雑です。

from traits.api import *
from traitsui.api import *
from traitsui.file_dialog import *

class BigApplication(Handler):
  subwindow=Instance(Handler)
  open_subwindow=Button('clickme')

  traits_view=View(Item(name='open_subwindow'),height=200,width=200)

  def _subwindow_default(self):
    return Subwindow()

  def _open_subwindow_fired(self):
    self.subwindow.edit_traits()

class Subwindow(Handler):
  f=File
  some_additional_option=Bool
  openf=Button('Browse')

  traits_view=View(Item(name='f',style='text'),
    Item(name='some_additional_option'),
    Item(name='openf'),
    buttons=OKCancelButtons)

  def _openf_fired(self):
    self.f=open_file()
    self.do_dispose(self.info)
    self.edit_traits()

  #handler methods
  def init_info(self,info):
    self.info=info
  def do_dispose(self,info):
    info.ui.dispose()

BigApplication().configure_traits()
于 2013-07-11T20:20:31.913 に答える