简体   繁体   English

(Tkinter)如何循环程序以在 GUI 上显示新数据?

[英](Tkinter) How to loop program to display new data on GUI?

I am creating a simple GUI to display bus arrival time.我正在创建一个简单的 GUI 来显示巴士到达时间。 How can I refresh the program every minute to get updated data?如何每分钟刷新一次程序以获取更新的数据? I have tried using while loops but it prevents the window to open.我曾尝试使用 while 循环,但它会阻止 window 打开。

Below is the code下面是代码

import json
from tkinter import *

window = Tk()
window.title("Welcome to the Smart Bus Stop")
window.configure(bg='black')

#Tried using while loop from here onwards but it didn't work

jsonFile = open('bus_arrival.json', 'r')
values = json.load(jsonFile)

z = len(values)

BusService = ['', '', '', '', '']
BusArr1 = ['', '', '', '', '']
BusArr2 = ['', '', '', '', '']


for x in range(z):
    BusService[x] = values[x]["Bus Service"]
    BusArr1[x] = values[x]["1st Bus"]
    BusArr2[x] = values[x]["2st Bus"]

    print("\n")
    print(BusService[x])
    print(BusArr1[x])
    print(BusArr2[x])

    BusNo = Label(window, text="Bus", font=("Arial Bold", 30), bg="black", fg="white")
    BusNo.grid(row=x, column=0)
    ServiceNo = Label(window, text=BusService[x], font=("Arial Bold", 30), bg="black", fg="white")
    ServiceNo.grid(row=x, column=1)
    Bus1 = Label(window, text=BusArr1[x], font=("Arial Bold", 30), bg="black", fg="white")
    Bus1.grid(row=x, column=2)
    Bus1 = Label(window, text=BusArr2[x], font=("Arial Bold", 30), bg="black", fg="white")
    Bus1.grid(row=x, column=3)


window.mainloop()

This is the json data, I have another program that is constantly running to update this data这是 json 数据,我有另一个程序不断运行以更新此数据

[
    {
        "Bus Service": "127",
        "1st Bus": "13:21:17",
        "2st Bus": "13:34:30"
    },
    {
        "Bus Service": "168",
        "1st Bus": "13:16:50",
        "2st Bus": "13:30:35"
    },
    {
        "Bus Service": "27",
        "1st Bus": "13:12:38",
        "2st Bus": "13:21:00"
    },
    {
        "Bus Service": "72",
        "1st Bus": "13:13:24",
        "2st Bus": "13:20:45"
    },
    {
        "Bus Service": "",
        "1st Bus": "",
        "2st Bus": ""
    }
]

In Tkinter, the correct way to do a recurring/periodic task is to use after , which puts the task in the event queue which will be executed periodically after the time period that you specify.在 Tkinter 中,执行循环/周期性任务的正确方法是使用after ,它将任务放入事件队列中,该队列将在您指定的时间段后定期执行。

import json
import tkinter as tk

window = tk.Tk()
window.title("Welcome to the Smart Bus Stop")
window.configure(bg='black')
with open('bus_arrival.json', 'r') as json_file:
        values = json.load(json_file)

z = len(values)

BusService = ['', '', '', '', '']
BusArr1 = ['', '', '', '', '']
BusArr2 = ['', '', '', '', '']

labels = []
for x in range(z):
    BusService[x] = values[x]["Bus Service"]
    BusArr1[x] = values[x]["1st Bus"]
    BusArr2[x] = values[x]["2st Bus"]

    BusNo = tk.Label(window, text="Bus", font=("Arial Bold", 30), bg="black", fg="white")
    BusNo.grid(row=x, column=0)
    ServiceNo = tk.Label(window, text=BusService[x], font=("Arial Bold", 30), bg="black", fg="white")
    ServiceNo.grid(row=x, column=1)
    Bus1 = tk.Label(window, text=BusArr1[x], font=("Arial Bold", 30), bg="black", fg="white")
    Bus1.grid(row=x, column=2)
    Bus2 = tk.Label(window, text=BusArr2[x], font=("Arial Bold", 30), bg="black", fg="white")
    Bus2.grid(row=x, column=3)
    labels.append([ServiceNo, Bus1, Bus2])

def data():
    with open('bus_arrival.json', 'r') as json_file:
        values = json.load(json_file)
    z = len(values)

    for x in range(z):
        BusService[x] = values[x]["Bus Service"]
        BusArr1[x] = values[x]["1st Bus"]
        BusArr2[x] = values[x]["2st Bus"]
        labels[x][0]['text']=BusService[x]
        labels[x][1]['text']=BusArr1[x]
        labels[x][2]['text']=BusArr2[x] 
    window.after(3000, data) #Update labels after 3 seconds

data()
window.mainloop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM