2016-07-28 4 views
0

В принципе, я создал поток, который непрерывно пишет глобальную переменную в бесконечном цикле. Тогда у меня есть мэйнфрейм, который должен читать и отображать эту переменную.Python3: Постоянное обновление переменных в Mainframe

Проблема заключается в том, что после запуска мэйнфрейма отображается только значение переменной, которое она читала во время запуска, и не постоянно обновляет себя. Как получить мэйнфрейм для обновления его значений переменных с заданным интервалом?

переменной в вопросе называется «данные»:

Примечания: если вы запустите код, как есть, переменная «данные» будет установлен нет. Добавление «time.sleep (5)» перед выполнением мэйнфрейма позволит время установить переменную из http-запроса, и вы увидите заполненные данные.

Спасибо за помощь!

#!/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() 

ответ

0

Сохраните ссылку на метку, а затем настройте функцию, которая обновляет метку, а затем организует для себя повторный вызов. В следующем примере метка будет обновляться один раз в секунду.

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

Спасибо, Брайан, это сработало отлично! , , , Есть ли онлайн-ресурс, специфичный для Tkinter, который вы бы рекомендовали читать? –

Смежные вопросы