【问题标题】:Getting strings from TkInter entry widget从 TkInter 条目小部件获取字符串
【发布时间】:2023-03-05 08:31:01
【问题描述】:

我是 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()

【问题讨论】:

  • 当我按下“按钮”打开另一个窗口时出现错误,它不显示任何内容,只显示“默认值”。我尝试在没有此“默认值”的情况下执行此操作,但我什么也没得到。

标签: python user-interface tkinter tkinter-entry


【解决方案1】:

您的代码有很多问题需要修复。第一个是您正在创建Tk 的两个实例。 Tkinter 的设计使得您应该只创建该类的一个实例,并且只调用该实例的mainloop 一次。如果您需要第二个窗口,请创建Toplevel 的实例。

第二,你不需要使用StringVars。我知道互联网上有很多例子都在使用它们,但严格来说你不需要它们。根据经验,只有当您要在它们上设置跟踪或要让两个小部件共享同一个变量(这实际上是一个非常酷的功能)时才需要这些。相反,您可以调用文本小部件的get 方法来获取值。这样做的主要优点是您需要创建和管理的对象更少。

所以,你可以做以下事情之一:

  1. 您可以将每个条目小部件的引用保存在全局变量或实例变量中(如果您切换到使用面向对象的编程风格),
  2. 您可以将小部件的引用传递给您的showResults 函数。
  3. 您可以继续使用StringVars,并让showResults 函数中的条目小部件和标签共享相同的StringVars。同样,您需要以两种函数都可以使用它们的方式存储它们,或者将它们从一个函数传递给另一个函数。

对于第二个例子——传递引用并使用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 属性的特殊属性。

【讨论】:

  • 旧帖,我知道,但我希望你能提供帮助。有没有办法“命名”每个小部件以供以后使用?假设我查询了一个包含 10 个基金的列表,每个基金都需要自己的文本框。这需要是动态的,因为此列表可以更改。我想遍历每一个创建并获取与之关联的值。
猜你喜欢
  • 2019-09-27
  • 2023-03-22
  • 2022-12-08
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多