2016-07-28 4 views
0

Grundsätzlich habe ich einen Thread erstellt, der kontinuierlich eine globale Variable in eine Endlosschleife schreibt. Dann habe ich den Mainframe, der diese Variable lesen und anzeigen soll.Python3: Kontinuierliche Variablenaktualisierung im Mainframe

Das Problem ist, dass sobald der Mainframe ausgeführt wird, zeigt es nur den Wert der Variablen an, die es zum Zeitpunkt des Starts gelesen hat, und aktualisiert sich nicht ständig selbst. Wie bekomme ich den Mainframe, um seine Variablenwerte mit einem bestimmten Intervall zu aktualisieren?

Die Variable in Frage „Daten“ genannt:

Anmerkungen: Wenn Sie den Code wie es ist, die „Daten“ Variable auf none gesetzt werden ausgeführt. Das Hinzufügen eines "time.sleep (5)" vor dem Ausführen des Mainframes ermöglicht es, die Variable aus der HTTP-Anforderung zu setzen, und die Daten werden aufgefüllt.

Danke für die Hilfe!

#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3 
# -*- coding: utf-8 -*- 

from tkinter import * 
import time 
import urllib.request 
from bs4 import BeautifulSoup 
import threading 
from queue import Queue 

data = None 

class httpReq(threading.Thread): 
    def run(self): 

     global data 

     while True: 
      url = "https://twitter.com/realDonaldTrump" 
      page = urllib.request.urlopen(url) 
      soup = BeautifulSoup(page, "html.parser") 
      data = soup.title.text 
      print(data) 

x = httpReq() 
x.start() 

class Example(Frame): 

     global data 

     def __init__(self, parent): 
      Frame.__init__(self, parent) 
      self.parent = parent 
      self.initUI() 

     def initUI(self): 
      self.parent.title("Example App") 
      self.pack(fill=BOTH, expand=True) 

      frame1 = Frame(self) 
      frame1.pack(fill=X) 

      lbl1 = Label(frame1, text="Title Data:", width= 20) 
      lbl1.pack(side=LEFT, padx=5, pady=5) 

      lbl2 = Label(frame1, text= data) 
      lbl2.pack(fill=X, padx=5, expand=True) 

def main(): 
    root = Tk() 
    root.geometry("600x200") 
    app = Example(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Antwort

0

einen Verweis auf das Etikett speichern, und dann eine Funktion, die das Etikett aktualisiert einrichten und ordnet dann selbst wieder aufgerufen werden. Im folgenden Beispiel wird das Label einmal pro Sekunde aktualisiert.

class Example(Frame): 
    def __init__(self, parent): 
     ... 
     # call this once, after the UI has been initialized 
     self.update_data() 
    ... 
    def initUI(self): 
     ... 
     # save a reference to the label that shows the data 
     self.lbl2 = Label(frame1, text= data) 
     self.lbl2.pack(fill=X, padx=5, expand=True) 
     ... 

    def update_data(self): 
     # reset the label 
     self.lbl2.configure(text=data) 

     # call this function again in one second 
     self.lbl2.after(1000, self.update_data) 
+0

Danke Bryan, das hat perfekt funktioniert! . . . Gibt es eine spezifische Online-Ressource für Tkinter, die Sie weiterempfehlen würden? –