Tkinter:通过按下按钮更新标签的值
每次按下特定按钮时,都需要更新标签的值。但root.update()不起作用,而且,我没有找到任何信息如何更新标签或至少整个GUI形式来获得新的值!那么,有人可以帮助吗? 下面是代码:Tkinter:通过按下按钮更新标签的值
from tkinter import *
import random
import decimal
# random numbers
random1 = decimal.Decimal(random.randrange(-155, 548))/100
random2 = decimal.Decimal(random.randrange(-155, 548))/100
root = Tk()
root.title("Cheking numbers")
root.geometry("640x480")
root.resizable(width=False, height=False)
# creating click event function
def ResultFunction():
if random1 - random2 > 1.30:
ResultLabel.configure(text='Result:' + str(random1 - random2))
elif random1 < - 0.80 and random2 > -0.80:
ResultLabel.configure(text='Result:' + str(random1))
elif random1 > - 0.80 and random2 < -1.30:
ResultLabel.configure(text='Result:' + str(random2))
elif random1 < -0.80 and random2 < -1.30 and random1 < random2:
ResultLabel.configure(text='Result:' + str(random1))
elif random1 < -0.80 and random2 < -1.30 and random1 < random2:
ResultLabel.configure(text='Result:' + str(random2))
else:
ResultLabel.configure(text='Result: 0')
# creating function for refreshing labels
def RefreshLabels():
root.update()
# Labels
Number1Label = Label(root, text=str(random1), font='georgia 20')
Number1Label.pack()
Number2Label = Label(root, text=str(random2), font='georgia 20')
Number2Label.pack()
ResultLabel = Label(root, text='Result:', font='georgia 20')
ResultLabel.pack()
# Buttons
ResultButton = Button(root, text='Result', width=5, height=1, bg='white', fg='green', font='georgia 20', command=ResultFunction)
ResultButton.pack()
NextButton = Button(root, text='Next', width=6, height=1, bg='white', fg='green', font='georgia 20', command=RefreshLabels)
NextButton.pack()
mainloop()
你ResultLabel是越来越单击ResultButton每一次更新,但好像没有任何反应,因为相同的随机值习惯于每次。所以你需要每次生成一对新的随机数。
我简化了你的程序,并且改变了名字以符合PEP-0008风格指南。我也用更明智的东西取代了可怕的“明星”导入。
这个任务不需要高精度的十进制数,简单的浮点数就足够了。
在您的ResultFunction中,最后两个elif
子句具有完全相同的条件。我认为这是一个错字,所以我将第二个改为我认为你想要的。 )
import tkinter as tk
import random
root = tk.Tk()
root.title("Checking numbers")
root.geometry("320x200")
root.resizable(width=False, height=False)
def show_result():
random1 = random.randrange(-155, 548)/100
random2 = random.randrange(-155, 548)/100
number1_label.configure(text=str(random1))
number2_label.configure(text=str(random2))
if random1 - random2 > 1.30:
v = random1 - random2
elif random1 < -0.80 < random2:
v = random1
elif random1 > -0.80 and random2 < -1.30:
v = random2
elif random1 < -0.80 and random2 < -1.30 and random1 < random2:
v = random1
elif random1 < -0.80 and random2 < -1.30 and random2 < random1:
v = random2
else:
v = 0.0
result_label.configure(text='Result: {:.2f}'.format(v))
font = 'georgia 20'
# Labels
number1_label = tk.Label(root, text='', font=font)
number1_label.pack()
number2_label = tk.Label(root, text='', font=font)
number2_label.pack()
result_label = tk.Label(root, text='', font=font)
result_label.pack()
# Buttons
result_button = tk.Button(root, text='Result', width=5, height=1,
bg='white', fg='green', font=font, command=show_result)
result_button.pack()
# Initialize
show_result()
root.mainloop()
这个版本有两个按钮。 “下一步”按钮生成&显示一对新的随机数,它也清除“结果”标签。 “结果”按钮执行计算&显示结果。
import tkinter as tk
import random
root = tk.Tk()
root.title("Checking numbers")
root.geometry("320x240")
root.resizable(width=False, height=False)
random1 = random2 = 0
# 'Next' button callback
def do_randoms():
global random1, random2
random1 = random.randrange(-155, 548)/100
random2 = random.randrange(-155, 548)/100
number1_label.configure(text=str(random1))
number2_label.configure(text=str(random2))
result_label.configure(text='Result:')
# 'Result' button callback
def show_result():
global random1, random2
if random1 - random2 > 1.30:
v = random1 - random2
elif random1 < -0.80 < random2:
v = random1
elif random1 > -0.80 and random2 < -1.30:
v = random2
elif random1 < -0.80 and random2 < -1.30 and random1 < random2:
v = random1
elif random1 < -0.80 and random2 < -1.30 and random2 < random1:
v = random2
else:
v = 0.0
result_label.configure(text='Result: {:.2f}'.format(v))
font = 'georgia 20'
# Labels
number1_label = tk.Label(root, text='', font=font)
number1_label.pack()
number2_label = tk.Label(root, text='', font=font)
number2_label.pack()
result_label = tk.Label(root, text='Result:', font=font)
result_label.pack()
# Buttons
b = tk.Button(root, text='Next', width=6, height=1,
bg='white', fg='green', font=font, command=do_randoms)
b.pack()
b = tk.Button(root, text='Result', width=5, height=1,
bg='white', fg='green', font=font, command=show_result)
b.pack()
# Initialize
do_randoms()
root.mainloop()
我已经使用全局变量来存储随机数。将GUI包装到类中并将随机数存储为GUI类实例的属性会更好。
谢谢,但现在我的第二个按钮应该显示结果不起作用(你甚至在你的代码中删除它) –
@MikayilAliyev我删除它,因为我不明白为什么它需要。在我的版本中,每次单击按钮时都会生成一对新的随机数,计算结果并显示所有3个值。这不是你想要的吗?如果我的代码没有做到你想要的,请在你的问题中解释你想要的程序。 –
这个操作必须首先计算,然后人应该检查他是否正确 –
'root.update()'允许GUI直观地反映状态的变化,在没有正在运行的主循环(这不是你所面临的情况)的情况下;一个典型的用途是在阻塞主循环的长时间运行任务期间显示移动进度条。它没有为你做任何事情,因为你没有改变任何事情的状态,并且无论如何都有一个工作的主循环。你使用'ResultFunction()'在正确的轨道上,但它总是将标签设置为完全相同的文本,因为你仍然使用程序最初运行时生成的相同的两个随机数。 – jasonharper