我正在使用tkinter创建一个类似"网格"的结构,在条目字段中显示eeprom的内容。
for byteRow in range (0, 16, 1):
for byteColumn in range (0, 16, 1):
byteEeprom = StringVar()
self.byteEepromArray.append(byteEeprom)
self.entryEepromArray.append(ttk.Entry(rawEeprom, width=3, textvariable = self.byteEepromArray[byteColumn+(16*byteRow)]))
self.entryEepromArray[byteColumn+(16*byteRow)].grid(column = byteColumn, row = byteRow+2, sticky = (N, W))
以上所有操作都很好,并且使用self.byteEepromArray[byte].set()
填充在一个函数中,但我正在尝试更改代码,这样,如果有人想更改其中一个eeprom位置,他们就会更改其中一条输入字段的内容,按回车键,就会调用一个函数来与eeprom对话。不幸的是,在导入脚本时调用了函数makeRawProbe,而不是等待事件发生。
for byteRow in range (0, 16, 1):
for byteColumn in range (0, 16, 1):
byteEeprom = StringVar()
self.byteEepromArray.append(byteEeprom)
self.entryEepromArray.append(ttk.Entry(rawEeprom, width=3, textvariable = self.byteEepromArray[byteColumn+(16*byteRow)]))
self.entryEepromArray[byteColumn+(16*byteRow)].grid(column = byteColumn, row = byteRow+2, sticky = (N, W))
self.entryEepromArray[byteColumn+(16*byteRow)].bind('<Return>', self.makeRawProbe(byteColumn+(16*byteRow)))
我试着换成,以防它从命令行中发现一些奇怪的东西,但同样的事情也发生了。我想我在做一些愚蠢的事情,但就是看不清是什么,请有人给我指一个正确的方向好吗?
bind
的参数必须是函数的引用。当你做这样的事情时:
...bind('<Return>', self.makeRawProbe(byteColumn+(16*byteRow)))
那么您实际上正在调用self.makeRawProbe(...)
,而该调用的结果就是分配给绑定的内容。
相反,您需要传递一个对函数本身的引用。由于您需要将参数传递给函数,因此需要使用类似lambda
或functools.partial
的东西或某种类型的工厂。我偏爱lambda
,因为它不需要引入另一个库。
例如:
value = byteColumn+(16*byteRow)
...bind('<Return>', lambda event, idx=value: self.makeRawProbe(idx))