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在我的函数中使用它来工作。如果有人能解释这一点,我将非常感激
我想我已经明白了这一点。问题是该变量实际上被 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
| 归档时间: |
|
| 查看次数: |
2026 次 |
| 最近记录: |