2017-12-24 27 views
0

내 응용 프로그램에서 API에서 새 데이터를 가져올 때 레이블 텍스트를 변경하려고합니다. 내 문제는 내 GUI가 전화를 끊은 후입니다. 항상 30 분 동안 실행 한 후에 가끔은 그 응용 프로그램을 실행하기 시작한 후 바로 그것의 somtimes 그것의 바로 매달리기가 동시에 그것의 시간에 있지 않습니다.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 User Guide의 example을보십시오. 또한 섹션 맨 아래에있는 스레드 : FAQ 절을 읽으십시오.

이렇게하는 또 다른 방법은 큐 또는 파이프를 사용하여 기본 GUI 스레드와 작업자 스레드간에 통신하는 것입니다. 주 스레드가 GUI를 변경하게합니다.