【问题标题】:(Tkinter) How to display time in GUI without duplicating to occur?(Tkinter) 如何在 GUI 中显示时间而不发生重复?
【发布时间】:2020-09-29 11:39:57
【问题描述】:

我正在创建一个简单的 GUI 来显示巴士到达时间和当前时间。但是,当我尝试显示时间并每秒刷新一次时,时间重复了window.after(1000, time)

下面是代码

import json
import datetime
from tkinter import *

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

frame = LabelFrame(window,bg='black',bd = 0)
frame.pack(anchor = NW, side = LEFT)

timeWidget = LabelFrame(window, bg ='black', bd =0)
timeWidget.pack(anchor = NE, side = RIGHT)

def time():
    now = datetime.datetime.now()
    Time = now.strftime("%H:%M")
    Day = now.strftime("%A")
    Date = now.strftime("%b %d, %Y")


    displayTime = Label(timeWidget, text= Time, font=("Helvetica", 50), bg="black", fg="white")
    displayTime.pack(anchor = E, side = TOP)
    displayDay = Label(timeWidget, text= Day, font=("Helvetica", 15), bg="black", fg="white")
    displayDay.pack(anchor = E, side = TOP)
    displayDate = Label(timeWidget, text= Date, font=("Helvetica", 15), bg="black", fg="white")
    displayDate.pack(anchor = E, side = TOP)

    window.after(1000, time)



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

    z = len(values)

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

    BusNo = Label(frame, text="   Bus   ", font=("Helvetica", 30), bg="black", fg="white")
    BusNo.grid(row=0, column=0)
    NextBus = Label(frame, text=" Next Bus ", font=("Helvetica", 30), bg="black", fg="white")
    NextBus.grid(row=0, column=1)
    SubBus = Label(frame, text=" Subsequent Bus ", font=("Helvetica", 30), bg="black", fg="white")
    SubBus.grid(row=0, column=2)

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


        ServiceNo = Label(frame, text=BusService[x], font=("Helvetica", 30), bg="black", fg="white")
        ServiceNo.grid(row=x+1, column=0)
        Bus1 = Label(frame, text=BusArr1[x], font=("Helvetica", 30), bg="black", fg="white")
        Bus1.grid(row=x+1, column=1)
        Bus1 = Label(frame, text=BusArr2[x], font=("Helvetica", 30), bg="black", fg="white")
        Bus1.grid(row=x+1, column=2)

    window.after(1000, data)


time()
data()
window.mainloop()

After a few seconds, the time displays multiple times

【问题讨论】:

  • 您应该在time() 之外创建标签并使用config(text=...) 更新其文本。

标签: python-3.x tkinter


【解决方案1】:

每次您调用time()date() 时,您也在创建和打包小部件。因此,您只需创建一次,然后使用widget_label.configure(text=UpdatedValue)StringVar() 更改文本变量。

示例 1:

from tkinter import *
import datetime

window = Tk()


def time():

    now = datetime.datetime.now()
    Time = now.strftime("%H:%M:%S")
    Day = now.strftime("%A")
    Date = now.strftime("%b %d, %Y")
    # set new values to variables
    time_var.set(Time)
    day_var.set(Day)
    date_var.set(Date)


# Firstly create and pack widgets outside function:
time_var = StringVar()
day_var = StringVar()
date_var = StringVar()
displayTime = Label(window, textvariable=time_var, font=("Helvetica", 50), bg="black", fg="white")
displayTime.pack(anchor=E, side=TOP)
displayDay = Label(window, textvariable=day_var, font=("Helvetica", 15), bg="black", fg="white")
displayDay.pack(anchor=E, side=TOP)
displayDate = Label(window, textvariable=date_var, font=("Helvetica", 15), bg="black", fg="white")
displayDate.pack(anchor=E, side=TOP)

time()

window.mainloop()

示例 2:

from tkinter import *
import datetime

window = Tk()


def time():

    now = datetime.datetime.now()
    Time = now.strftime("%H:%M:%S")
    Day = now.strftime("%A")
    Date = now.strftime("%b %d, %Y")
    # configure text in widget
    displayTime.configure(text=Time)
    displayDay.configure(text=Day)
    displayDate.configure(text=Date)
    window.after(1000, time)


# Firstly create and pack widgets outside function:   
displayTime = Label(window, text='', font=("Helvetica", 50), bg="black", fg="white")
displayTime.pack(anchor=E, side=TOP)
displayDay = Label(window, text='', font=("Helvetica", 15), bg="black", fg="white")
displayDay.pack(anchor=E, side=TOP)
displayDate = Label(window, text='', font=("Helvetica", 15), bg="black", fg="white")
displayDate.pack(anchor=E, side=TOP)

time()

window.mainloop()

【讨论】:

  • @Nicholaschua 我的最后一个答案只是将 .pack 放在函数之外,这意味着仍然创建了小部件,但只有最后一个可见。抱歉之前的困惑。现在小部件只创建一次,文本刚刚更新。
猜你喜欢
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2019-08-12
  • 2020-02-02
  • 1970-01-01
  • 2017-11-14
  • 2015-12-12
相关资源
最近更新 更多