我正在使用Tkinter为我正在创建的一个简单几何计算器创建一个GUI。
基本上,我有一个输入框。我想要的是让程序/GUI/系统检测程序的用户何时在"输入"框中点击"回车"或"返回"键。当检测到这一点时,我希望将条目框的内容附加到我之前定义的列表中。我还希望在GUI上创建一个简单的标签,显示列表的内容(包括附加的项目)。请注意,列表一开始什么都没有。
这是我到目前为止的代码:
from tkinter import *
#Window setup(ignore this)
app = Tk()
app.title('Geometry Calculator')
app.geometry('384x192+491+216')
app.iconbitmap('Geo.ico')
app.minsize(width=256, height=96)
app.maxsize(width=384, height=192)
app.configure(bg='WhiteSmoke')
#This is the emtry list...
PointList = []
#Here is where I define the variable that I will be appending to the list (which is the object of the Entry box below)
StrPoint = StringVar()
def list_add(event):
#I don't really know how the bind-checking works and how I would implement it; I want to check if the user hits enter while in the Entry box here
if event.char == '':
PointList.append(StrPoint)
e1 = Entry(textvariable=StrPoint).grid(row=0, column=0)
app.bind('<Return>', list_add)
mainloop()
我真的不知道检查"Return"然后在if语句中使用它的正确方法。我希望你能理解我想得到的帮助,我四处寻找一个我能理解的解释,但没有成功。
与其绑定app
,不如将其绑定到Entry
小部件对象,即e1
from tkinter import *
#Window setup(ignore this)
app = Tk()
app.title('Geometry Calculator')
app.geometry('384x192+491+216')
app.iconbitmap('Geo.ico')
app.minsize(width=256, height=96)
app.maxsize(width=384, height=192)
app.configure(bg='WhiteSmoke')
#This is the emtry list...
PointList = []
#Here is where I define the variable that I will be appending to the list (which is the object of the Entry box below)
StrPoint = StringVar()
def list_add(event):
print ("hello")
#I don't really know how the bind-checking works and how I would implement it; I want to check if the user hits enter while in the Entry box here
if event.char == '':
PointList.append(StrPoint)
e1 = Entry(textvariable=StrPoint)
e1.grid(row=0, column=0)#use grid in next line,else it would return None
e1.bind('<Return>', list_add)# bind Entry
mainloop()
解决方案是在小部件本身上设置绑定。这样,只有当焦点放在该小部件上时,绑定才会应用。由于您绑定了一个特定的密钥,因此以后不需要检查该值。您知道用户按下了return,因为这是唯一会导致绑定触发的东西。
...
e1.bind('<Return>', list_add)
...
还有一个问题是,list_add
函数需要调用变量的get
方法,而不是直接访问变量。然而,由于您没有使用StringVar
的任何特殊功能,因此您真的不需要它——这只是您必须管理的另一件事。
以下是如何在没有StringVar
:的情况下做到这一点
def list_add(event):
PointLit.append(e1.get())
...
e1 = Entry(app)
e1.grid(row=0, column=0)
e1.bind('<Return>', list_add)
请注意,您需要通过两个步骤创建小部件并布置小部件。按照您的方式执行(e1=Entry(...).grid(...)
将导致e1
为None
,因为这是.grid(...)
返回的内容。