2017-06-17 16 views
0

ジャイロスコープの位置データを表示するプログラムを作成しようとしています。私はこの目的のためにthreading.Threadモジュールを使用しています。私もバットからクラッシュするのを防ぐためにtime.sleep()を使用する必要があります。私の問題は、プログラムが凍ることがしばらく続いてからです。これは次のように実装されています:Python Gtkアプリケーションでスレッドする

def get_gyro_data(): 
    return <the data from the gyro> 

class Handler: 
    def __init__(self): 
     self.label = builder.get_object("my_label") 
     threading.Thread(target=self.pos_data_update).start() 

    def pos_data_update(self, *args): 
     while True: 
      self.label.set_text(get_gyro_data()) 
      time.sleep(.5) 

何か提案がありますか?また、私はtime.sleepを使わずにこれを行う方法がありますか?

答えて

1

Gtkはスレッドセーフではありません。 GUIに対するすべての変更は、メインスレッド(メインループを実行するスレッド)から行う必要があります。

私は次の関数を使用したい:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gdk, GLib 

def mainloop_do(callback, *args, **kwargs): 
    def cb(_None): 
     callback(*args, **kwargs) 
     return False 
    Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT, cb, None) 

これは、あなたのコードに最小限の変更で、メインスレッドに仕事を渡すことができます:

def pos_data_update(self, *args): 
    while True: 
     mainloop_do(self.label.set_text, get_gyro_data()) 
     time.sleep(.5) 
+0

しようとしたとき、私は次のエラーを取得します トレースバック(最新の呼び出しの最後):この機能を使用するには ファイル "program.py"、ライン25、CBで コールバック(* argsを、** kwargsから) はTypeError: 'タプル' オブジェクトは、オランダカイウではありませんBLE トレースバック(最新の呼び出しの最後):CBで ファイル "program.py"、25行、 コールバック(* argsを、** kwargsから) 例外TypeError:あなたが渡されたように 'タプル' オブジェクトが呼び出すことはできません –

+0

@DanielCopleyが鳴ります'callback'パラメータとしてのタプル。私はこの機能を定期的に使用しています。 –

+0

私は自分が間違っていることを認識しました。私はmainloop_doパラメータに "self"を挿入しましたが、実行時にはまだフリーズしています。プログラムの実行中にラベルを更新するには、これが必要です。 –

関連する問題