2016-11-14 5 views
0

Als ein erstes Projekt habe ich beschlossen, eine App zu bauen, die mir den aktuellen Ölpreis zeigen wird, so dass ich nicht die ganze Zeit auf die Forex Charts schauen muss.Constant Tkinter window update

Das Problem mit dieser App ist, dass die "Update" -Schleife nur Ölpreis alle 3 Sekunden druckt, also weiß ich, dass diese Schleife ständig ausgeführt wird, aber es aktualisiert nicht nur den Text im Fenster, aber es stürzt auch ab es, während Shell den Ölpreis druckt.

Ich habe versucht, Multiprocessing-Modul zu verwenden, aber es machte keinen Unterschied.

def window(): 
    root = Tk() 
    screen_width = root.winfo_screenwidth() 
    screen_height = root.winfo_screenheight() 
    mylabel = Label(root, text = "") 
    mylabel.pack() 

def update(): 
    while True: 
     global string_price 
     request = requests.get("http://www.biznesradar.pl/notowania/BRENT-OIL-ROPA-BRENT#1d_lin_lin") 
     content = request.content 
     soup = BeautifulSoup(content, "html.parser") 
     element = soup.find("span", { "class": "q_ch_act" }) 
     string_price = (element.text.strip()) 
     print(string_price) 
     mylabel.configure(text = str(string_price)) 

     time.sleep(3) 

root.after(400, update) 
mainloop() 

Antwort

2

.after Methode, tut schon, was Sie von while True und sleep zugleich wollte. Entfernen Sie beide sleep und while und fügen Sie einen weiteren after hinein, um ständig anzurufen.

def custom_update(): 
    global string_price 
    request = requests.get("http://www.biznesradar.pl/notowania/BRENT-OIL-ROPA-BRENT#1d_lin_lin") 
    content = request.content 
    soup = BeautifulSoup(content, "html.parser") 
    element = soup.find("span", {"class": "q_ch_act"}) 
    string_price = (element.text.strip()) 
    print(string_price) 
    mylabel.configure(text=str(string_price)) 
    root.after(3000, custom_update) #notice it calls itself after every 3 seconds 

custom_update() #since you want to check right after opening no need to call after here as Bryan commented 
+0

Danke! Es hat sehr geholfen! Ich habe auch den Zeitwert in der "root.after" ganz unten in Ihrem Code für "0" geändert, so dass die App den Ölpreis direkt nach dem Öffnen überprüft. –

+0

Sie brauchen 'nicht' nach dem ersten Anruf zu verwenden. Sie können 'update()' direkt aufrufen. Sie sollten jedoch die Funktion wahrscheinlich etwas anderes nennen. Alle Widgets haben eine "update" -Methode, so dass eine eigene "update" -Methode verwirrend sein kann. –

+0

@KarolMularski überprüfen Sie bitte auch nach Änderungen. Einige Änderungen wurden gemäß den Vorschlägen von Bryan angewendet. – Lafexlos