在循环中实例化时,checkbutton命令绑定到错误的值

时间:2019-06-05 00:21:07

标签: python-3.x tkinter

当我单击项目中的复选框时,它未执行正确的功能。该项目位于https://github.com/shitwolfymakes/Endless-Sky-Mission-Builder/(indev分支)

我正在使用tkinter构建应用程序,并且正在研究一个将ttk.Entry对象动态放置在ttk.Checkbutton对象旁边的函数,然后将它们链接在一起。

我已经重写了几次这个函数,甚至为self.numMandatory为0时添加了一个特例,但没有任何效果。

这取自guiutils.py,第323行。

# add the optional fields
for i in range(self.numMandatory, self.numFields):
    print(self.rowNum)
    self.listEntryStates.append(BooleanVar())
    self.listEntryData.append(StringVar())
    self.listEntryData[-1].set(self.listDefaultEntryData[i])

    self.listEntries.append(ttk.Entry(self, textvariable=self.listEntryData[-1], state=DISABLED, style="D.TEntry"))
    self.listEntries[-1].grid(row=self.rowNum, column=1, sticky="ew")

    #print(self.listEntryStates[-1])
    #print(self.listEntries)
    self.listCheckbuttons.append(ttk.Checkbutton(self, onvalue=1, offvalue=0, variable=self.listEntryStates[-1],
                                                 command=lambda: self.cbValueChanged(self.listEntryStates[-1],
                                                                                     [self.listEntries[-1]])))
    self.listCheckbuttons[-1].grid(row=self.rowNum, column=2, sticky="e")

    print(self.listCheckbuttons[-1].__str__(), end=" is bound to: ")
    print(self.listEntries[-1].__str__(), self.listEntryStates[-1])

    self.rowNum += 1
# end for

这取自guiutils.py,第349行

def cbValueChanged(self, entryState, modifiedWidgets):

    for widget in modifiedWidgets:
        print("The value of %s is:" % widget, end="\t\t")
        print(entryState.get())
        if type(widget) is str:
            break
        elif entryState.get() is True:
            widget.config(state='enabled', style='TEntry')
        elif entryState.get() is False:
            widget.config(state='disabled', style='D.TEntry')
    #end for

#end cbValueChanged

在主窗口中,当我向下滚动并单击“添加触发器”时,新窗口将正确显示。但是,当我单击“ "[<base#>]"”条目旁边的复选框时,该条目应由cbValueChanged启用。

由于某种原因,当添加可选字段的循环运行时,command =部分仅绑定self.listEntries中的最后一个条目(但是绑定到每个checkbutton的条目直到最后一次才创建)循环)

我不确定我还能在哪里问这样的问题,而且我知道这比大多数问题要问的多。如果您需要更多信息,我们将很乐意提供。

1 个答案:

答案 0 :(得分:-2)

您~~不能~~编辑:不应循环使用lambda。坦白说,您根本不应该使用它。使用functools.partial或进行真正的封闭。

from functools import partial
self.listCheckbuttons.append(ttk.Checkbutton(self, onvalue=1, offvalue=0, variable=self.listEntryStates[-1],
                                             command=partial(self.cbValueChanged,self.listEntryStates[-1],[self.listEntries[-1]])))