我一周前刚开始Tkinter,我正试图将GUI链接到用Python编写的自动代码生成脚本。在这个论坛的大力帮助下,我几乎涵盖了所有的案例,但这个特别的案例却让我左右为难。在
我需要2个条目小部件,并在输入后立即计算它们之间的关系(即没有按钮小部件来触发函数)。我意识到这必须与事件一起完成,所以经过一番尝试,我想出了以下的方法,但感觉我并不是“Python”。在
from Tkinter import *
root = Tk()
root.title("Test")
def OnValidate(S):
if S.isdigit():
return True
else:
return False
def insert_text_widg(widg,msg):
widg.delete(1.0,END)
widg.insert(INSERT,msg)
# Checks the required conditions
def check_var1(event):
try:
temp1=int(var1_ent.get())
temp2=int(var2_ent.get())
except ValueError:
return
if(temp2 > temp1):
insert_text_widg(log_text,"ERROR: Var2 cannot be greater than Var1")
for ent in [var1_ent,var2_ent]:
ent.configure(bg='indian red',fg='white')
elif ((temp1 - temp2) % 2) == 1:
insert_text_widg(log_text,"ERROR: Difference cannot be odd")
for ent in [var1_ent,var2_ent]:
ent.configure(bg='indian red',fg='white')
else:
log_text.delete(1.0,END)
for ent in [var1_ent,var2_ent]:
ent.configure(bg='white',fg='black')
# Duplicate of check_var1
def check_var2(event):
try:
temp2=int(var2_ent.get())
temp1=int(var1_ent.get())
except ValueError:
return
if(temp2 > temp1):
for ent in [var1_ent,var2_ent]:
ent.configure(bg='indian red',fg='white')
insert_text_widg(log_text,"ERROR: Var2 cannot be greater than Var1")
elif ((temp1 - temp2) % 2) == 1:
for ent in [var1_ent,var2_ent]:
ent.configure(bg='indian red',fg='white')
insert_text_widg(log_text,"ERROR: Difference cannot be odd")
else:
log_text.delete(1.0,END)
for ent in [var1_ent,var2_ent]:
ent.configure(bg='white',fg='black')
# App Configuration
vcmd = (root.register(OnValidate),'%S')
var1_lab = Label(root,text='Var1 :')
var1_lab.pack()
var1_ent = Entry(root,validate="key",validatecommand=vcmd)
var1_ent.bind("<KeyRelease>",check_var1)
var1_ent.pack()
var2_lab = Label(root,text='Var2 :')
var2_lab.pack()
var2_ent = Entry(root,validate="key",validatecommand=vcmd)
var2_ent.bind("<KeyRelease>",check_var2)
var2_ent.pack()
log_text = Text(root)
log_text.pack()
root.mainloop()
有两个函数(check_var1()&check_var2()),它们基本上与我希望合并为一个函数的功能相同。 一旦任何条目小部件注册了更改,就需要执行检查。在
简而言之,我希望有一种方法可以在输入任何条目小部件后立即调用check_var1()函数,而不管输入的顺序如何。在
任何帮助或朝着正确方向轻推都将不胜感激。在
如果我正确地理解了您需要什么,那么我觉得您最好使用
.trace()
函数。在这允许您在每次写入或读取变量时引发回调。在
在本例中,我们将创建两个变量}(为了简单起见),并为它们赋值
var1
和{StringVar()
。在然后我们将每个}。在
Entry
小部件的属性textvariable
分别设置为var1
和{然后我们需要设置}(其中{}表示写入),这两个函数在每次写入变量时都会运行回调函数。在
.trace()
本身,因此我们调用var1.trace("w", callback)
和{这意味着,无论先修改哪个
Entry
,我们都会得到一个回调,更重要的是,每次修改都会得到一个回调。在工作示例如下:
相关问题 更多 >
编程相关推荐