0

我正在使用 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)))

我已经尝试更改为以防它从命令行中发现一些奇怪的东西,但同样的事情也会发生。我想我在做一些愚蠢的事情,但就是看不到它是什么,请有人指出我正确的方向吗?

4

1 回答 1

0

to 的参数bind必须是对函数的引用。当您执行以下操作时:

...bind('<Return>', self.makeRawProbe(byteColumn+(16*byteRow)))

...那么您实际上是在调用self.makeRawProbe(...),并且该调用的结果是分配给绑定的结果。

相反,您需要传递对函数本身的引用。由于您需要将参数传递给函数,因此您将需要使用类似lambdaorfunctools.partial或某种工厂的东西。我偏爱,lambda因为它不需要拉入另一个库。

例如:

value = byteColumn+(16*byteRow)
...bind('<Return>', lambda event, idx=value: self.makeRawProbe(idx))
于 2013-02-26T15:31:26.060 回答