当我单击项目中的复选框时,它未执行正确的功能。该项目位于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的条目直到最后一次才创建)循环)
我不确定我还能在哪里问这样的问题,而且我知道这比大多数问题要问的多。如果您需要更多信息,我们将很乐意提供。
答案 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]])))