【问题标题】:traitsui file dialog changes active windowtraitsui 文件对话框更改活动窗口
【发布时间】:2013-03-28 18:14:49
【问题描述】:

我有一个包含许多小窗口的大型应用程序。我想使用 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 窗口,而不是返回到 Subwindow 窗口(以便用户可以在单击确定之前选择一些附加选项)。

【问题讨论】:

  • 这是什么操作系统?
  • CentOS 6 x64,epd 7.3-1

标签: python enthought traitsui


【解决方案1】:

像往常一样,我找到了一个 hacky 解决方法。但这种行为仍然是一个错误。

解决方法是在旧窗口的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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 2013-01-05
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多