无法在Python Entry小部件中输入

0 投票
2 回答
1392 浏览
提问于 2025-04-18 15:52

我遇到了一个有趣的问题,关于tk的Entry控件。如果我运行下面这段测试代码,

from Tkinter import *
root =Tk()
def pfunc(self):
    print Input.get()
f=Frame(root)
f.pack()
Input=Entry(f)
#Input.bind("<Return>",pfunc)
Input.pack()
root.mainloop()

我可以正常在这个控件里输入内容,并且能在控制台打印出来;但是下面这段代码,作为一个更大界面的一部分,却根本无法让我点击输入框。

    self.Tlabel = Label(self.TempFrame, text="Temp")
    self.Tlabel.pack( side = LEFT)
    self.Tenter = Entry(self.TempFrame,width=10, bd =5)
    self.Tenter.bind("<Return>",self.getFlux)
    self.Tenter.pack (side=RIGHT)
    self.Flabel = Label(self.FluxFrame, text="Flux")
    self.Flabel.pack( side = LEFT)
    self.Fenter = Entry(self.FluxFrame, width=10, bd =5)
    self.Fenter.bind("<Return>",self.getTemp)
    self.Fenter.pack(side = RIGHT)

def getFlux(self):
    for i in range(len(self.fit_tuples)):
        if self.fit_tuples[i][0]==self.currentBFMdate and self.fit_tuples[i][1]==self.cell.get():
            fit_data=self.fit_tuples[i][2]
            self.Fenter.set(fit_data[0]*np.exp(fit_data[1]*int(self.Tenter.get())))
        else:
            self.Fenter.set("Invalid")

def getTemp(self):
    for i in range(len(self.fit_tuples)):
        if self.fit_tuples[i][0]==self.currentBFMdate and self.fit_tuples[i][1]==self.cell.get():
            fit_data=self.fit_tuples[i][2]
            self.Tenter.set(np.log(float(self.Fenter.get())/fit_data[0])/fit_data[1])
        else:
            self.Tenter.set("Invalid")

而且,如果我在另一台Windows电脑上运行这两段代码,我也遇到了同样的问题。我能想到的唯一不同之处是,我在一个类里面使用了实例变量;但看起来其他控件都能正常绑定和工作。

2 个回答

0

如果你使用 bind 方法,回调函数会接收到一个事件对象。你应该在这个方法或函数中添加一个事件参数。(可以参考 事件和绑定 - Tkinter 入门

所以,替换下面的代码:

def getFlux(self, event):
    ...

def getTemp(self, event):
    ...

第一个程序的运行结果是不符合预期的。它的参数名称应该是 event,而不是 self

0

简单来说,bind方法是把“Return”这个参数传给getTemp函数。就像其他用户提到的,只需要在这个函数里再加一个参数就可以了。

撰写回答