2017-06-01 139 views
1

每次按下特定按钮时,都需要更新标签的值。但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() 
+1

'root.update()'允许GUI直观地反映状态的变化,在没有正在运行的主循环(这不是你所面临的情况)的情况下;一个典型的用途是在阻塞主循环的长时间运行任务期间显示移动进度条。它没有为你做任何事情,因为你没有改变任何事情的状态,并且无论如何都有一个工作的主循环。你使用'ResultFunction()'在正确的轨道上,但它总是将标签设置为完全相同的文本,因为你仍然使用程序最初运行时生成的相同的两个随机数。 – jasonharper

回答

0

你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类实例的属性会更好。

+0

谢谢,但现在我的第二个按钮应该显示结果不起作用(你甚至在你的代码中删除它) –

+0

@MikayilAliyev我删除它,因为我不明白为什么它需要。在我的版本中,每次单击按钮时都会生成一对新的随机数,计算结果并显示所有3个值。这不是你想要的吗?如果我的代码没有做到你想要的,请在你的问题中解释你想要的程序。 –

+0

这个操作必须首先计算,然后人应该检查他是否正确 –