2012-06-14 5 views
2

TraitsUI를 사용하는 응용 프로그램에서 작업하고 있습니다.확인을 클릭하지 않고 TraitsUI 창 닫기

일부 값을 요청하는 창을 팝업해야합니다.

ProcessValues ​​버튼과 SaveValues ​​버튼과 같은 것이 있습니다. SaveValues을 클릭하면 ProcessValues을 클릭하면

  • , 뭔가 수행해야합니다, 다음 창이
  • 을 닫아야합니다, 뭔가 다른이 창을 너무 폐쇄해야 수행해야합니다.

이 더 OK 버튼 아래의 예제 코드에서

에게 수 없습니다, 버튼을 클릭하면 처리기에서 메시지를 인쇄 할 수 있습니다,하지만 난 그 자체 창을 닫습니다하기 위해 무엇을 해야할지하지 않습니다한다 프레임에서 [x]를 클릭하는 것 이외에는

close() 오버로드가 트릭을 수행하지 않는 것처럼 보입니다. AFTER OK를 클릭 할 때 호출됩니다. 아마도 close_window 이벤트를 생성하는 방법이있을 수도 있고 아니면 뭔가 다른 것일 수도 있습니다.

아무도 도와 줄 수 있습니까?

from enthought.traits.api import HasTraits, Instance, Str, Int, List, Any, DelegatesTo 
from enthought.traits.ui.api import Handler, View, Item, Action 

class MyPanelHandler(Handler): 
    def _process_values(self, info): 
     #>>>reach process_values() through info and call 
     print 'values processed OK' 
     #>>> what goes here so that the window is closed? 
    def _save_values(self, info): 
     #>>>reach save_values() through info and call 
     print 'values saved OK' 
     #>>> what goes here so that the window is closed? 

class MyPanel(HasTraits): 
    model = Any 
    name = Str 
    age = Int 
    process_values_button = Action(name = 'Process Values', action = '_process_values') 
    save_values_button = Action(name = 'Save Params', action = '_save_values') 

    view = View('name', 'age', handler = MyPanelHandler(), 
      buttons = [process_values_button, save_values_button],) 

class MyApp(HasTraits): 
    panel = Instance(MyPanel) 

    def __init__(self): 
     self.panel = MyPanel(model = self) 
    def get_values(self): 
     self.panel.configure_traits() 
    def save_values(self, name, age): 
     print '... doing whatever to save values' 
    def process_values(self): 
     print '... doing whatever to process values' 

if __name__ == '__main__': 
    a = MyApp() 
    a.get_values() 

답변

4

해결책은 다른 곳에서 발견되었습니다. Handler에서 메소드를 호출하는 Action을 클릭하여 창을 닫으려면 Handler에서 info.ui.dispose()를 호출하십시오 (info는 self가 아닌 Handler 메소드에 전달되는 유일한 매개 변수 임).

다음은 수정 된 더미 프로그램입니다. "if.info.initialized"부분을주의하십시오. 어떤 이유에서든 uiinfo 객체가 너무 오래 채워지면 예외가 발생할 수 있습니다.

from enthought.traits.api import HasTraits, Instance, Str, Int, List, Any, DelegatesTo 
from enthought.traits.ui.api import Handler, View, Item, Action 

class MyPanelHandler(Handler): 
    def _process_values(self, info): 
     if not info.initialized: 
      return # do this in case info takes long to initialize 
     # invoke methods 
     info.object.model.process_values(info.object.name, info.object.age) 
     print 'values have been processed' 
     info.ui.dispose() # THIS IS WHAT I WAS ACTUALLY ASKING FOR 
    def _save_values(self, info): 
     if not info.initialized: return 
     info.object.model.save_values(info.object.name, info.object.age) 
     print 'values have been saved' 
     info.ui.dispose() 

class MyPanel(HasTraits): 
    model = Any 
    name = Str 
    age = Int 
    process_values_button = Action(name = 'Process Values', action = '_process_values') 
    save_values_button = Action(name = 'Save Params', action = '_save_values') 
    view = View('name', 'age', handler = MyPanelHandler(), 
      buttons = [process_values_button, save_values_button],) 

class MyApp(HasTraits): 
    panel = Instance(MyPanel) 
    def __init__(self): 
     self.panel = MyPanel(model = self) 
    def get_values(self): 
     self.panel.configure_traits() 
    def save_values(self, name, age): 
     print '... saving (%s, %s)' % (name, age) 
    def process_values(self, name, age): 
     print '... processing (%s, %s)' % (name, age) 

if __name__ == '__main__': 
    a = MyApp() 
    a.get_values()