2018年4月30日月曜日

wxPytyhon 画面がかたまる

イベント駆動での問題で解決を試みたが、大変でした。

問題のプログララムは

あるスレッドからのデータを取得するとのことです、

もちろん、スレッドには興味はないのですが。。

イベント作成してバインドして取得しましたが、ボタンなど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
を使用して自作のツールチップについで書きたいと思います。


では、コンビニに行き、楽天ドリンクを買ってきます。

いつもの店員さんいるかな?

では


先日からは、ゴールデンウーィクです。
今は最中なので。。。

三日間は、pdb9という、ソフトのメンテナ酢で開けるくていました。

やったことは、
その前に、このブログシステム個人を監視しているせいかもしれないが、英語のインターフェースになったいます。

仕組みは、個人を特定。
どの言語の参照が多いかをデータベースかして、その個人が関係したしたら、その言語を表示する
仕組みでしょうか。。。。

日本人なのに、日本語の投稿しかしていないのに、ゴーグルのAIはこれから。。。

なのか。。。。



さて本題は、個人メモですが、


パイソンのでデバッカーpdbについてです(自分は、pdb9というデバッカー+エディターんppdb9を作成していますが)


作成している関係、以下の問題を発見しました。
いくつかのサイトで指摘がありましたが、そのデバッカーに問題があるとの感じの投稿が多かったみたいです。

問題
呼び出した関数内での、変数変更ができない

自分が検証した結果は、変数変更後にwhereコマンドを行っては行けない、
値が反映されません。

以上です。

悩む人は、結構いると思いますよ!!!