2017-12-24 16 views
0

私のアプリケーションで私は、APIから新しいデータを取得するときにラベルテキストを変更しようとしています。私の問題は、私のGUIがハングアップする少しの時間の後です。それと同時に、常にそれが半時間ぶりに実行された後に、アプリケーションを実行することを開始した後に、その一時停止がいつもそうであるとは限りません。PyGObjectラベルの問題

唯一のGUIがハングアップすると、プログラム自体が実行され続け、コンソールに出力されます。

ラベルテキストの更新は余分なスレッドで実行されます。

class GUI(): 
def get_assets(self,trader): 
    assets={} 
    if trader=="kraken": 
     pass 
    elif trader=="cex": 
     query=info_CEX() 
     res=query.get_balance() 
     for key in res: 
      try: 
       assets[key]={} 
       assets[key]["available"]=res[key]["available"] 
       assets[key]["orders"]=res[key]["orders"] 
      except(KeyError,TypeError): 
       continue 
     return assets 

def update_asset_labels(self,trader): 
    assets=self.get_assets(trader) 
    for key in assets: 
     try: 
      label=self.builder.get_object("BX"+key) 
      label.set_text(str(float(assets[key]["available"]))+"/"+str(float(assets[key]["orders"]))) 
     except(AttributeError): 
      if key=="EUR": 
       label=self.builder.get_object("kapital") 
       label.set_text(str(float(assets[key]["available"]))) 
      continue 





def app(self): 
    """Initialisiert die graphischen Oberfläche. 
    """ 
    UI_FILE = PFAD+"/PYtraderGUI.ui" 
    self.builder = Gtk.Builder() 
    self.builder.add_from_file(UI_FILE) 
    self.builder.connect_signals(self) 
    self.window = self.builder.get_object("window1") 
    """self.window.maximize()""" 
    self.window.show_all() 


    def update_info(): 
     price=["None"] * 11 
     oldprice=["None"] * 11 
     chan=0 
     start_price=0 
     query=infokraken.infokraken() 
     trader="cex" 
     while True: 
      try: 
       self.update_asset_labels(trader) 
       pass 
      except (ValueError): 
       continue 

    thread1 = threading.Thread(target=update_info) 
    thread1.daemon = True 
    thread1.start() 

if __name__ == "__main__": 
    GObject.threads_init() 
    GO=GUI() 
    GO.connect("delete-event", Gtk.main_quit) 
    GO.show_all() 
    GO.app() 
    Gtk.main() 

答えて

0

GTK +で読むことをお勧めします。スレッドで動作しています。 IIRC(それはしばらくしています)では、スレッドからGUIに直接変更するべきではありません。代わりに、GLibのidle_add(callable)関数を使用してください。この関数は、GUIがアイドル状態のときの変更をスケジュールする必要があります。

PyGObjectユーザガイドのexampleを、スレッドと同時実行性について見てみましょう。また、セクションの下部にある「スレッド:よくある質問」のセクションを読んでください。

これを行うもう1つの方法は、キューまたはパイプを使用して、メインのGUIスレッドとワーカースレッド間の通信を行うことです。メインスレッドにGUIを変更させる。

関連する問題