問題のプログララムは
あるスレッドからのデータを取得するとのことです、
もちろん、スレッドには興味はないのですが。。
イベント作成してバインドして取得しましたが、ボタンなどGUIのフォーカスが当たらなく
wx.Yieldなど(前にtime.sleepが必要とのこと)ですが全然だめでした。
また、その処理自体をスレッドするのもよいのかもしれませんが
自分は
自分のイベントどリブデンを作成して、その問題を解決しようと思いました。
参考のソースです。
app =MyApp()
app.MainLoop()
exit(0)
"""Drives the main wx event loop."""
evtloop = wx.EventLoop()
wx.EventLoop.SetActive( evtloop)
i =0
while 1:
while evtloop.Pending(): # if there is at least one event to be processed
evtloop.Dispatch() # process one event
#~ time.sleep(0.10)
evtloop.ProcessIdle()
#~ abc()
このソースは、通常に行えるようになっています。
"""
app =MyApp()
app.MainLoop()
exit(0)
"""
なをかつ、いベントではなくキューによりデータをスレッドより取得するように変更しました。
なぜなら、
自作イベントを作成してスレッドからデータを取得しようとすると、画面が固まって
しまうからです。
その解決として、自作のイベントループを作成しました。
ただ、ここで後でわかった事ですが、自作イベントは不十分な機能でありました、
ネットでは、このソースでの参照が多いのですが、以下が問題です。
1.ターマー割り込みが使えない
2.toolTipが使えない
3.キューを使用していたが、オープンダイアログが別イベンドどリブデン機能なので、そこで問題が発生する。
(オープンダイアログを開くと、そちらのイベントドリブデン「上記ソース」が機能しなくない自身のそれが機能しておかしな動きになる)
self.que.task_done()
self.que = None
#~ if self.que != None:
#~ self.que = None
#~ while not self.que.empty():
#~ c = queData.get()
#~ print "xxx=",c
#~ self.que.task_done()
これで、キューデータが消えて処理を中断できたのだったが、あの忌々しいオープンダイアログ
で問題が以前の状態になってしまった。
自作のイベント処理機能
self.que.task_done()
self.que = None
#~ if self.que != None:
#~ self.que = None
#~ while not self.que.empty():
#~ c = queData.get()
#~ print "xxx=",c
#~ self.que.task_done()
機能しなくなった為である、ネットで読んだことがあったので、ピンときた、
ダイアログボックスのイベント処理機能が別に存在して、悪さをしていろのかと思った。
◎最後には解決策が見つかった。
キューでスレッドとのデータ受け取り(受信のみ)は、正解です。
画面はかたまりません。
以下にソースを。。。
wx.Frame.__init__(self, *args, **kwargs)
#~ wx.Frame.__init__(self, wx.ID_ANY, u"pdb9 (ver3.0)", size=(600,400),
#~ style=wx.DEFAULT_FRAME_STYLE|wx.WS_EX_PROCESS_IDLE )
#~ self.frame = FrameEx(None, wx.ID_ANY, u"pdb9 (ver3.0)", size=(600,400))
#----------------------------------------------------------------------
def OnIdle(self, evt):
#~ print "kita", self.ix
#~ self.ix +=1
#~ time.sleep( 0.0001)
config.dbg.procQue()
evt.RequestMore()
大切なところ。。。
wx.WS_EX_PROCESS_IDLE
かな
では、
次回は、ツールチップが動作しなったので、自作をしてしまいました。
以下が参考
value = s.strip()
if value[:3] !="***":
wx.CallAfter(config.edPaneInst.fileInst.SetToolTipString, "%s = %s" % (expr, value))
#~ tip = wx.TipWindow(config.edPaneInst.fileInst, "ddddddd", 30)
#~ rect = wx.Rect( 0,0, 500,500)
#~ tip.SetBoundingRect(rect)
#~ print "toolTip test"
self.pdbData = ""
self.stepStep = 0
wx.TipWindow
を使用して自作のツールチップについで書きたいと思います。
では、コンビニに行き、楽天ドリンクを買ってきます。
いつもの店員さんいるかな?
では