Отображать графический интерфейс Tkinter во время работы цикла - PullRequest
0 голосов
/ 29 ноября 2018

По сути, я работаю над «черновиком» приложения счетчика подписчиков на python.Я использую API данных YouTube для получения данных с YouTube, а затем зацикливаю этот фрагмент кода для обновления количества подписчиков.Но поскольку код моего GUI находится после цикла, он никогда не запускается, поскольку цикл бесконечен и никогда не заканчивается.Я попытался поместить часть GUI перед кодом, чтобы получить подсчет, но ни одна из переменных не была определена, поэтому возвращаются ошибки.Так что в основном мой вопрос заключается в том, как мне реорганизовать это так, чтобы оно работало, а подсчет обновлений обновлялся в графическом интерфейсе.Я слышал о людях, использующих модуль потоков, но у меня нет большого опыта с этим.

import urllib.request
import json
from tkinter import*

name ="pewdiepie"
key = "AIzaSyDAOUFomRB1lxdb_fvSKKaG-FSZDRoVt_s"


i = 1
while i<99999999:
    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)))
    print(subc)
    i = i + 1


root = Tk()
root.geometry("900x600")
root.title("Sub Counter")

label1 = Label(text="Sub Count:", font=("Comic Sans MS", 45), fg="Brown").place(x=10, y=20)
label2 = Label(text=subc, font=("Comic Sans MS", 45), fg="Red").place(x=10, y=130)

root.mainloop()

1 Ответ

0 голосов
/ 29 ноября 2018

Многопоточность решит вашу проблему, но есть более простое решение, включенное в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...