4

TraitsUI を使用してアプリケーションに取り組んでいます。

いくつかの値を要求するウィンドウをポップアップする必要があります。

ProcessValues ボタンと SaveValues ボタンのようなものがあります。

  • ProcessValues がクリックされた場合は、何かを実行してから、ウィンドウを閉じる必要があります
  • SaveValues がクリックされた場合は、別の処理を行う必要があり、ウィンドウも閉じる必要があります。

OKボタンはないはず

以下のコード例では、ボタンをクリックするとハンドラー内のメッセージが出力されますが、フレーム内の [x] をクリックする以外にウィンドウを閉じる方法がわかりません。

close() のオーバーロードは、[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

1 に答える 1

7

私は他の場所で解決策を見つけました。Handler のメソッドを呼び出すアクションをクリックしてウィンドウを閉じるには、Handler から「info.ui.dispose()」を呼び出します (info は、self 以外の、handler メソッドに渡される唯一のパラメーターです)。

これが修正されたダミー プログラムです。「if not 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()
于 2012-06-15T10:55:46.190 に答える