2017-10-19 59 views
0

我刚开始Tkinter的一个星期前,我试图向GUI链接写在的Python自动代码生成脚本。在这个论坛的帮助下,我几乎涵盖了所有的案例,但是这个特别的案例让我难以置信。Tkinter的 - 当两个输入小写入触发一个事件,无论为了

我需要2个输入小部件,并且一旦输入它们就计算它们之间的关系(即没有按钮小部件来触发一个功能)。我意识到必须完成事件,所以经过一番尝试,我已经提出了以下这些工作,但感觉就像我不是'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()& check_var2())基本上做到这一点,我希望合并成一个同样的事情。 只要任何一个Entry小部件注册了一个更改,就需要执行检查。

因此,在短期,我想一个方法调用check_var1()功能,只要任一输入窗口小部件类型中,不分先后顺序的,他们在键入。

任何帮助或向正确方向微调将受到高度赞赏。

+0

你为什么不使用: var2_ent.bind( “”,check_var1)??? –

+0

主要问题是用户输入输入的顺序。我尝试了您的建议,但是如果用户在Var1为空并返回时首先输入Var2,则会发生异常。也许我正在处理异常错误? – amuneeb

回答

0

如果我正确理解你需要的东西,那么听起来对我来说就像使用.trace()函数最好。

这使您可以在写入或读取变量时引发回调。

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

然后我们将每个Entry小部件的属性textvariable分别设置为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() 
+1

非常感谢您的工作。 – amuneeb

相关问题