条目小部件-将输入传递给同一类中的onValidate方法



我有一个类,它创建了一个带有分钟和秒条目小部件的框架。类中单独的onValidate方法将用于验证条目小部件的输入,但最初我只想输出所有可用替代代码(%P, %S等)的结果。我目前得到的错误:AttributeError:"_tkinter。tkapp' object没有属性'text'

下面是给出错误的完整代码:

import tkinter as tk
class MainWindow(tk.Tk):
def __init__(self):
super().__init__()
self.create_frame_main().pack(fill=tk.BOTH, expand=True)    
def create_frame_main(self):
self.frame_main = tk.Frame(self)
self.mins_var = tk.IntVar()
self.secs_var = tk.IntVar()
vcmd = (self.register(self.onValidate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') 
self.frame_time_input = tk.Frame(self.frame_main)
self.frame_time_input.grid(row=0,column=0)
self.entry_mins = tk.Entry(self.frame_time_input, validate="key", textvariable=self.mins_var, validatecommand=vcmd, width=5)

self.entry_mins.pack(side='left')
self.label_mins = tk.Label(self.frame_time_input, text='mins')
self.label_mins.pack(side='left')

self.entry_secs = tk.Entry(self.frame_time_input, validate="key", textvariable=self.secs_var, validatecommand=vcmd, width=3)

self.entry_secs.pack(side="left")
self.label_secs = tk.Label(self.frame_time_input, text='secs')
self.label_secs.pack(side='left')
self.text = tk.Text(self.frame_main, height=10, width=40)
self.text.grid(row=1,column=0)
return self.frame_main

def onValidate(self, d, i, P, s, S, v, V, W):
self.text.delete("1.0", "end")   # delete everything currently in the text box
self.text.insert("end","OnValidate:n")
self.text.insert("end","d='%s'n" % d)
self.text.insert("end","i='%s'n" % i)
self.text.insert("end","P='%s'n" % P)
self.text.insert("end","s='%s'n" % s)
self.text.insert("end","S='%s'n" % S)
self.text.insert("end","v='%s'n" % v)
self.text.insert("end","V='%s'n" % V)
self.text.insert("end","W='%s'n" % W)

我想我得到了错误,因为self。在构造函数方法中定义的文本小部件没有传递给onValidate方法,但不确定如何传递。如果我不再通过以下更改使onValidate方法成为运行时的一部分,则不会发生错误:

#vcmd = (self.register(self.onValidate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')    
#self.entry_mins = tk.Entry(self.frame_time_input, validate="key", textvariable=self.mins_var, validatecommand=vcmd, width=5)
self.entry_mins = tk.Entry(self.frame_time_input, textvariable=self.mins_var, width=5)
#self.entry_secs = tk.Entry(self.frame_time_input, validate="key", textvariable=self.secs_var, validatecommand=vcmd, width=3)
self.entry_secs = tk.Entry(self.frame_time_input, textvariable=self.secs_var, width=3)

回溯:

File "C:Program FilesPython310libtkinter__init__.py", line 1921, in __call__
return self.func(*args)
File "c:PythonProgramsentry_val_class.py", line 39, in onValidate
self.text.delete("1.0", "end")   # delete everything currently in the text box
File "C:Program FilesPython310libtkinter__init__.py", line 2383, in __getattr__
return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'text'

初始目标是确保无论何时用户尝试编辑分钟或秒条目小部件时,onValidate方法都会成功地将来自该输入的各种替换代码的结果输出到文本小部件(如'self.text. '中定义的那样)。插入行)。

根本原因是在创建小部件时调用验证,而这发生在定义self.text之前。因为验证命令调用了self.text.delete,所以你得到了错误,因为self.text还不存在。

如果你把self.text的定义向上移动,问题就消失了。

另外,您的onValidate必须始终返回TrueFalse。否则将导致在函数第一次运行时关闭验证。

最新更新