当 ttk 小部件参与时,tkinter 函数会重复两次

Mag*_*tte 4 tkinter ttk python-3.x

tkinter当我简单地使用 的小部件时,该程序将按预期工作。当我使用 的ttk小部件时,程序会重复两次。我几乎尝试了我所知道的一切来解决这个问题,我相信*args这与它有关。有没有办法阻止我的函数_up_options运行两次?

from tkinter import *
from tkinter import ttk
root = Tk()

first = StringVar(root)
second = StringVar(root)
Ore = {'Options': [''], 'Yes': ['One'], 'No': ['Two']}
entry1 = ttk.OptionMenu(root, first, *Ore.keys())
entry2 = ttk.OptionMenu(root, second, '')
entry1.pack()
entry2.pack()


def _up_options(*args):
    print('update_options')
    ores = Ore[first.get()]
    second.set(ores[0])
    menu = entry2['menu']
    menu.delete(0, 'end')

    for line in ores:
        print('for')
        menu.add_command(label=line, command=lambda choice=line: second.set(choice))


first.trace('w', _up_options)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

PS,我*args在我的函数中使用它来工作。如果有人能解释这一点,我将非常感激

fhd*_*sdg 5

我想我已经明白了这一点。问题是该变量实际上被 ttk OptionMenu 设置了两次。

看一下 tkinter OptionMenu 中的这段代码:

for v in values:
    menu.add_command(label=v, command=_setit(variable, v, callback))
Run Code Online (Sandbox Code Playgroud)

这会为每个值添加一个带有命令的按钮_setit。当_setit 调用时,它会设置变量和另一个回调(如果提供):

def __call__(self, *args):
    self.__var.set(self.__value)
    if self.__callback:
        self.__callback(self.__value, *args)
Run Code Online (Sandbox Code Playgroud)

现在看看 ttk OptionMenu 中的这段代码:

for val in values:
    menu.add_radiobutton(label=val,
        command=tkinter._setit(self._variable, val, self._callback),
        variable=self._variable)
Run Code Online (Sandbox Code Playgroud)

command这会将 a 添加radiobutton到菜单中,而不是a。所有单选按钮通过将它们链接到同一变量来“分组”。由于单选按钮有一个变量,因此当单击其中一个单选按钮时,该变量将设置为该按钮的值。接下来,添加与 tkinter OptionMenu 中相同的命令。如前所述,这设置了变量,然后触发提供的另一个命令。正如您所看到的,现在变量更新了两次,一次是因为它链接到单选按钮,另一次是因为它是在函数中设置的_setit。因为您跟踪变量的更改并且该变量被设置了两次,所以您的代码也运行了两次。

因为该变量在 ttk 代码中设置了两次,所以我想您对此无能为力。如果您不从代码的任何其他部分而不是从 OptionMenu 更改变量,则可以选择不跟踪该变量,而是将函数添加到commandOptionMenu:

entry1 = ttk.OptionMenu(root, first, *Ore.keys(), command=_up_options)
Run Code Online (Sandbox Code Playgroud)

PS这是在这个错误报告之后通过这个提交引入的。 我想添加命令时应该将其更改为.
variable=self._variablecommand=self._callback