Python Tkinter在所有条目都已满时执行某些操作
我想在Python Tkinter在所有条目都已满时执行某些操作,python,graphics,tkinter,Python,Graphics,Tkinter,我想在tk.Toplevel实例中的每个输入框都已满时运行一个命令 目前,我有它,所以每次输入新的输入时,它都会检查是否所有输入都已满。但是,这会变得效率低下,因为如果输入长字符串,它将检查每个字母(因为每次更改条目时都会执行条目的命令)。此外,我有许多输入框(总共大约30个)将被使用,因此这将变得非常低效 are_EntriesFull = lambda master: all(bool(widget.get()) for widget in filter(lambda s: isinstan
tk.Toplevel
实例中的每个输入框都已满时运行一个命令
目前,我有它,所以每次输入新的输入时,它都会检查是否所有输入都已满。但是,这会变得效率低下,因为如果输入长字符串,它将检查每个字母(因为每次更改条目时都会执行条目的命令
)。此外,我有许多输入框(总共大约30个)将被使用,因此这将变得非常低效
are_EntriesFull = lambda master: all(bool(widget.get()) for widget in filter(lambda s: isinstance(s, tk.Entry), findAllWidgets(master)))
_packingWidgets = (tk.Tk, tk.Toplevel, tk.Frame)
def findAllWidgets(master, widgetsFound = None):
'''Returns all of the widgets in a packing instance'''
if widgetsFound is None:
widgetsFound = []
subWidgets = master.grid_slaves()
for widget in subWidgets:
widgetsFound.append(widget)
if isinstance(widget, _packingWidgets):
widgetsFound.extend(findAllWidgets(widget, widgetsFound))
return widgetsFound
class GetWord:
'''Window to get input from the user and create an entry for the word'''
def __init__(self, master, current, total):
self.master, self.current, self.total, self.mainFrame = master, current, total, tk.Frame(master)
self.master.title(STANDARD_TITLE)
self.wordFrame, self.typeFrame, self.infoFrame, self.buttonFrame = tk.Frame(self.mainFrame), tk.Frame(self.mainFrame), tk.Frame(self.mainFrame), tk.Frame(self.mainFrame)
self.word = tk.StringVar(self.wordFrame)
self.wordLabel = tk.Label(self.wordFrame, text = "{}/{}) Word:".format(self.current, self.total), justify = tk.CENTER)
self.activateButton = lambda: self.okButton.configure(state = tk.ACTIVE) if are_EntriesFull(self.master) else None
self.wordEntry = tk.Entry(self.wordFrame, width = 50, justify = tk.CENTER, textvariable = self.word, command = self.activateButton)
# bunch of other code
基本上,这个命令应该做的是激活一个按钮(我只想在每个条目都被填充的情况下使用它)。或者,我可以在按下按钮时检查输入框是否已被激活(从而使其始终处于激活状态),并且只有当它们已满时,才执行按钮的命令,但我宁愿只在它们已满时才激活它。
有没有更好的方法来实现这一点?谢谢 保存
findAllWidgets
的结果,并重用该结果,而不是每次调用findAllWidgets
#are_EntriesFull = lambda master: all(bool(widget.get()) for widget in filter(lambda s: isinstance(s, tk.Entry), findAllWidgets(master)))
are_EntriesFull = lambda entries: all(bool(widget.get()) for widget in entries) # <---
_packingWidgets = (tk.Tk, tk.Toplevel, tk.Frame)
def findAllWidgets(master, widgetsFound = None):
'''Returns all of the widgets in a packing instance'''
if widgetsFound is None:
widgetsFound = []
subWidgets = master.grid_slaves()
for widget in subWidgets:
widgetsFound.append(widget)
if isinstance(widget, _packingWidgets):
widgetsFound.extend(findAllWidgets(widget, widgetsFound))
return widgetsFound
class GetWord:
'''Window to get input from the user and create an entry for the word'''
def __init__(self, master, current, total):
self.master, self.current, self.total, self.mainFrame = master, current, total, tk.Frame(master)
self.master.title(STANDARD_TITLE)
self.wordFrame, self.typeFrame, self.infoFrame, self.buttonFrame = tk.Frame(self.mainFrame), tk.Frame(self.mainFrame), tk.Frame(self.mainFrame), tk.Frame(self.mainFrame)
self.word = tk.StringVar(self.wordFrame)
self.wordLabel = tk.Label(self.wordFrame, text = "{}/{}) Word:".format(self.current, self.total), justify = tk.CENTER)
self.activateButton = lambda: self.okButton.configure(state = tk.ACTIVE if are_EntriesFull(all_entries) else tk.DISABLED) # <---
self.wordEntry = tk.Entry(self.wordFrame, width = 50, justify = tk.CENTER, textvariable = self.word, command = self.activateButton)
# bunch of other code
...
all_entries = findAllWidgets(self.master) # <---
#are_EntriesFull=lambda master:all(bool(widget.get()),用于过滤器中的小部件(lambda s:isinstance(s,tk.Entry),findAllWidgets(master)))
are_EntriesFull=lambda entries:all(bool(widget.get())表示条目中的widget)#它并不像您想象的那么低效。尝试测量检查30个(甚至300个或3000个)条目小部件的内容需要多长时间。你可能会感到惊讶。在你注意到延迟之前,你可能需要每分钟输入几百个单词
对于3000个入门小部件,在我的Mac电脑上,我可以在每次击键3毫秒左右检查它们的长度。假设我有一个小部件列表要检查。如果迭代所有小部件及其子部件,则需要更长的时间,这是a)无意义的,b)可能仍然非常快 原来我没有看到正确的信息。。。我不得不使用self.master.bind(“,lambda event:self.activateButton())
,而不是tk.Entry(…,command=self.activateButton)
。不过,谢谢!