我是Python的新手,我正在尝试使用TkInter创建GUI。我遇到的问题是当我试图显示输入文本时。以下是我为此任务所做的两个功能。我的代码中是否缺少某些内容?
这是我创建条目小部件的第一个函数:
def getArea():
x1 = StringVar()
x2 = StringVar()
y1 = StringVar()
y2 = StringVar()
#coor x1
labelX1 = Label(input, text="X: ").grid(row=1, column=1)
entryX1 = Entry(input, width=8, textvariable=x1).grid(row=1, column=2)
#coor x2
labelY1 = Label(input, text="Y: ").grid(row=2, column=1)
entryY1 = Entry(input, width=8, textvariable=y1).grid(row=2, column=2)
#coor y1
labelX2 = Label(input, text="X: ").grid(row=1, column=3)
entryX2 = Entry(input, width=8, textvariable=x2).grid(row=1, column=4)
#coor y2
labelY2 = Label(input, text="Y: ").grid(row=2, column=3)
entryY2 = Entry(input, width=8, textvariable=y2).grid(row=2, column=4)
x1.set("Defalut value x1")
x2.set("Defalut value x2")
y1.set("Defalut value y1")
y2.set("Defalut value y2")
coorx1 = x1.get()
coorx2 = x2.get()
coory1 = y1.get()
coory2 = y2.get()
button = Button(input, text='ok',command=lambda: showResults(coorx1,coorx2,coory1,coory2)).grid(row=1, column=5)
exitButton = Button(input, text='exit', command=input.destroy).grid(row=2,column=5)
input.mainloop()
这是我想要显示字符串的第二个函数:
def showResults(x1,x2,y1,y2):
showInfo = Tk()
showInfo.title("Location Temperature")
showInfo.geometry("270x100+470+320")
print x1, x2, y1, y2
info1 = Label(showInfo, text=x1).pack()
info2 = Label(showInfo, text=x2).pack()
info3 = Label(showInfo, text=y1).pack()
info4 = Label(showInfo, text=y2).pack()
buttonClose = Button(showInfo, text='exit', command=showInfo.destroy).pack(side= RIGHT)
showInfo.mainloop()
答案 0 :(得分:3)
您的代码需要修复许多内容。第一个是你创建了Tk
的两个实例。 Tkinter的设计使您只能创建该类的一个实例,并且只调用该实例的mainloop
一次。如果需要第二个窗口,请创建Toplevel
的实例。
其次,您不需要使用StringVar
。我知道互联网上的很多例子都使用它们,但严格来说你不需要它们。根据经验,如果您要在它们上设置跟踪,或者如果您要让两个小部件共享同一个变量(这实际上是一个非常酷的功能),您只需要那些。相反,您可以调用文本小部件的get
方法来获取值。这样做的主要优点就是您需要创建和管理的对象更少。
所以,你可以做的是以下之一:
showResults
函数。 StringVar
,并让条目小部件和showResults
函数中的标签共享相同的StringVar
。同样,您需要以两个函数可以使用它们的方式存储它们,或者将它们从一个函数传递到另一个函数。对于第二个传递引用并使用get
方法的示例 - 您将执行以下操作:
button = Button(input, text='ok',command=lambda: x1=entryX1, y1=entryY1,
x2=entryX2, y2=entryY2: showResults(x1,y1,x2,y2)
...
def showResults(x1,y1,x2,y2):
info1 = Label(showInfo, text=x1.get())
info2 = Label(showInfo, text=y1.get())
这不是唯一的方式,甚至是最好的方式。关键是,这里没有神秘感。与多个函数使用的变量一样,您需要在某处保留全局引用,或者需要传递引用。或者,您利用textvariable
属性的特殊属性。