当前位置: 首页 > 知识库问答 >
问题:

在循环运行时显示Tkinter GUI

祖麻雀
2023-03-14

基本上,我正在Python中的一个订阅计数器应用程序的“草案”上工作。我使用YouTube数据API从YouTube获取数据,然后循环这段代码以更新订阅者计数。但是由于我的GUI代码在循环之后,它永远不会开始,因为循环是无限的,永远不会结束。我尝试将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个答案

万俟高峻
2023-03-14

线程可以解决你遇到的问题,但是在()之后有一个更简单的解决方案,这个答案很好地解释了它:

之后(延迟毫秒,回调=无,*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()

另一方面,您可以使用OOP进一步优化这一点:

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()
 类似资料:
  • 此方法重复读取命令并执行它们,直到游戏结束。完成的变量为true时,表示玩家/用户点击了退出并想要结束游戏——从而退出循环并执行到方法结束。 但我观察到循环有一种奇怪的行为。它循环得非常好(省略以下行时显示stopWatch.getTime()的连续计数: 但是当我把它们放回去时,它会停止显示秒表的连续递增时间,因为它会朝着时间限制增加(在这一点上,它应该停止)。即使玩家没有输入任何命令或输入。

  • 我已经安装了tomcat 9.0.11,但是tomcat 9服务器名称没有看到它。要配置它,请提供解决方案 在此输入图像描述

  • 问题内容: 我有以下5个文件: gui.py functions.py 线程处理程序 variables.py 和start.py 执行start.py之后,我收到消息:“ QCoreApplication:exec:事件循环已在运行 ” 我发现,这与计时器有关 从 start.py 和功能 在 functions.py中 有人可以向我解释问题是什么吗?我不知道代码有什么问题… 问题答案: 我认为

  • 错误:函数中的错误(type,msg,asError=TRUE):Recv失败:对等点重置连接 附加基包:[1]stats4并行stats图形grDevices utils数据集方法基 RCurl版本:1.98-1.3

  • 我正在使用Jacoco插件计算Spring启动应用程序的代码覆盖率。build.gradle的Jacoco配置如下: } 和 } } 有人能帮我吗?