2017-04-15 3 views
0

私は自分のプログラム全体に散在するイベントを持っています。データベースにコミットされた変更を行うたびに、任意の情報を含むModelChangedイベントを起動し、さまざまなGUI要素で取り上げて画面を更新します。しかし、私はこれがどのように機能しているかについて少しリファクタリングしています。 GUI要素が起動するとすぐにイベントをキャプチャする代わりに、別のイベントが発生するまでイベントを一時停止したいと考えています。だから、代わりにこのことを:イベントをキューに入れる前にイベントをキューに入れる方法

火災イベントを - >バインディングは、私はそれがこれをしたいイベント

を受け取る:

火災イベント - >火災に別の独立したイベントが発生するのを待つ - >バインディングは、元のイベントを受け取ります。コンソールに出力

import wxversion 
wxversion.select(['3.0', '2.8']) 
import wx 
import wx.lib.newevent 

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent() 
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent() 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event") 
     self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal) 

     self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event") 
     self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent) 

     self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND) 
     self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND) 

     self.SetSizer(self.sizer) 
     self.SetAutoLayout(1) 
     self.sizer.Fit(self) 

     self.Bind(ORIGINAL_EVT, self.captureOriginal) 
     self.Bind(RELEASE_EVT, self.captureRelease) 
     self.Show(True) 

    def fireOriginal(self, evt): 
     wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4])) 

    def releaseEvent(self, evt): 
     wx.PostEvent(self, ReleaseEvent()) 

    def captureOriginal(self, evt): 
     print "Event captured" 

    def captureRelease(self, evt): 
     print "Release captured" 

app = wx.App(False) 
frame = MyFrame(None, 'Small editor') 
app.MainLoop() 

現在、あなたは火のイベントをクリックすると、あなたが買ってあげるテキスト:ここ

はいくつかのコードです。私は "Fire Event"ボタンをクリックすることができますが、フレームが元のイベントを取得してコンソールに表示される前に "Release Event"ボタンをクリックするまで待つ必要があります。

自分のイベントクラスを書く方法については十分にわかりません。イベントを出すかどうかを指定するためにオーバーライドできるものがあります。助言がありますか?

ありがとうございます!

+0

これは、代わりに 'wx.EVT_IDLE'を使用できるものですか? – otterb

+0

いいえ、実際はありません - https://wxpython.org/docs/api/wx.IdleEvent-class.html –

答えて

0

wxPythonは他のすべてのGUIツールキットのようにイベント駆動型です。イベントを一時停止して2番目のイベントを待つ方法はありません。代わりに、Fire Eventボタンが押されたことを知らせるプロパティを設定し、2番目のイベントでそのプロパティを使用して、何をすべきかを判断することができます。ここに例があります:

import wxversion 
wxversion.select(['3.0', '2.8']) 
import wx 
import wx.lib.newevent 

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent() 
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent() 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 
     self.fire_event = False 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event") 
     self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal) 

     self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event") 
     self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent) 

     self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND) 
     self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND) 

     self.SetSizer(self.sizer) 
     self.SetAutoLayout(1) 
     self.sizer.Fit(self) 

     self.Bind(ORIGINAL_EVT, self.captureOriginal) 
     self.Bind(RELEASE_EVT, self.captureRelease) 
     self.Show(True) 

    def fireOriginal(self, evt): 
     self.fire_event = True 

    def releaseEvent(self, evt): 
     wx.PostEvent(self, ReleaseEvent()) 
     if self.fire_event: 
      wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4])) 
      self.fire_event = False 

    def captureOriginal(self, evt): 
     print "Event captured" 

    def captureRelease(self, evt): 
     print "Release captured" 

app = wx.App(False) 
frame = MyFrame(None, 'Small editor') 
app.MainLoop() 
関連する問題