Tkinter - 无论顺序如何,在写入两个Entry Widgets时触发事件

时间:2017-10-19 09:52:37

标签: python events tkinter tkinter-entry

我刚开始 Tkinter 一周前,我正在尝试将GUI链接到用 Python 编写的自动代码生成脚本。我已经在这个论坛的大力帮助下覆盖了几乎所有的案例,但这个特别让我感到难过。

我需要2个Entry Widgets并在输入后立即计算它们之间的关系(即没有用于触发函数的Button小部件)。我意识到必须完成一些事件,所以经过一些尝试后,我想出了下面的工作,但感觉我不是' pythonic'关于它。

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()&amp; check_var2())基本上与我想要合并为一个函数相同。 只要任何Entry小部件注册更改,就需要执行检查。

因此,在短期,我想办法,只要任一输入构件被键入在调用的 check_var1()功能,无论所述命令的它们在键入。

我们将非常感谢任何正确方向的帮助或推动。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你需要什么,那么听起来就像你最好使用.trace()功能一样。

这允许您在写入或读取变量时引发回调。

在这种情况下,我们会创建两个变量var1var2(为了简单起见)并为这些变量赋值StringVar()

然后,我们将每个textvariable小部件的属性Entry分别设置为var1var2

然后我们需要设置.trace()本身,所以我们调用var1.trace("w", callback)var2.trace("w", callback)(其中"w"表示写),每次运行回调函数变量写入。

这意味着无论先修改哪个Entry,我们都会得到一个回调,更重要的是我们会在每次修改时得到一个回调。

请参阅下面的工作示例:

from tkinter import *

class App:
    def __init__(self, root):
        self.root = root
        self.var1 = StringVar()
        self.var2 = StringVar()
        self.var1.trace("w", self.callback)
        self.var2.trace("w", self.callback)
        self.entry1 = Entry(self.root, text="Ok", textvariable=self.var1)
        self.entry2 = Entry(self.root, text="Ok", textvariable=self.var2)
        self.label = Label(self.root)
        self.entry1.pack()
        self.entry2.pack()
        self.label.pack()
    def callback(self, *args):
        self.label.configure(text=self.entry1.get()+self.entry2.get())

root = Tk()
App(root)
root.mainloop()