Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter在所有条目都已满时执行某些操作_Python_Graphics_Tkinter - Fatal编程技术网

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)
。不过,谢谢!