Многопоточность решит вашу проблему, но есть более простое решение, включенное в tkinter after()
, , этот ответ хорошо объясняет это :
after (delay_ms, callback = None, * args)
Регистрирует аварийный обратный вызов, который вызывается через определенное время.
Это позволяет вам вызывать функцию послеопределенный период времени.Таким образом, используя это, мы можем изменить ваш цикл while на функцию, передавая функции виджет, который нам нужно обновить, и добавив еще один after()
в конце функции, чтобы продолжить цикл:
def func(label2):
data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&forUsername="+name+"&key="+key).read()
subs = json.loads(data)["items"][0]["statistics"]["subscriberCount"]
subc =("{:,d}".format(int(subs)))
label2.config(text=subc)
label2.update()
root.after(10, lambda:func(label2))
Мызатем нужно где-то начать это с:
func(label2)
С некоторыми другими изменениями, чтобы эта работа работала в вашей программе, мы получаем следующее:
import urllib.request
import json
from tkinter import*
name ="pewdiepie"
key = "AIzaSyDAOUFomRB1lxdb_fvSKKaG-FSZDRoVt_s"
def func(label2):
data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&forUsername="+name+"&key="+key).read()
subs = json.loads(data)["items"][0]["statistics"]["subscriberCount"]
subc =("{:,d}".format(int(subs)))
label2.config(text=subc)
label2.update()
root.after(10, lambda:func(label2))
root = Tk()
root.geometry("900x600")
root.title("Sub Counter")
label1 = Label(text="Sub Count:", font=("Comic Sans MS", 45), fg="Brown")
label2 = Label(font=("Comic Sans MS", 45), fg="Red")
label1.place(x=10, y=20)
label2.place(x=10, y=130)
func(label2)
root.mainloop()
Вкл.примечание, вы можете оптимизировать это, используя ООП:
import urllib.request
import json
from tkinter import*
class App():
def __init__(self, root):
self.root = root
self.name = "pewdiepie"
self.key = "AIzaSyDAOUFomRB1lxdb_fvSKKaG-FSZDRoVt_s"
self.root.geometry("900x600")
self.root.title("Sub Counter")
self.label1 = Label(text="Sub Count:", font=("Comic Sans MS", 45), fg="Brown")
self.label2 = Label(font=("Comic Sans MS", 45), fg="Red")
self.label1.place(x=10, y=20)
self.label2.place(x=10, y=130)
self.root.after(0, self.func)
def func(self, *args):
self.data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&forUsername="+self.name+"&key="+self.key).read()
self.subs = json.loads(self.data)["items"][0]["statistics"]["subscriberCount"]
self.subc =("{:,d}".format(int(self.subs)))
self.label2.config(text=self.subc)
self.label2.update()
root.after(10, self.func)
root = Tk()
App(root)
root.mainloop()