【问题标题】:Can't pass variables to function with Tkinter in python无法在python中使用Tkinter将变量传递给函数
【发布时间】:2015-02-16 01:40:33
【问题描述】:

我正在尝试从条目中获取文本变量 (a),然后将其放入新窗口 (w) 中的标签中。

from Tkinter import *
def abind(avar):
    print avar
    w=Toplevel()
    at=Label(w, text=avar).pack()
    w.mainloop()
app=Tk()
at=StringVar()
a=Entry(app,textvariable=at)
avar=at.get()
a.pack()
a.focus()
b=Button(app, command=abind(avar)).pack()
app.mainloop()

如果我在 abind 之后将 avar 从括号中取出,它要么打印空白,要么立即打开一个新窗口并且不显示按钮小部件,如果我离开 avar。

【问题讨论】:

  • 试试avar = a.get()

标签: python function variables tkinter tk


【解决方案1】:

您的代码有两个主要问题:

  • 对于avar=at.get()avar 变量具有文本变量的值在那个时间点,即它只是一个空字符串
  • 使用Button(app, command=abind(avar)),您正在调用函数abind(avar) 并将其结果用作命令,即None

另外,通过执行b=Button(...).pack()bpack() 的结果,即None。这与您的问题无关,但也可能不是您想要的。试试这个:

b = Button(app, command=lambda: abind(at.get()))
b.pack()

这使用lambda 创建一个新的匿名函数,该函数将使用at.get()at 获取当前值,并使用该值调用abind,相应地设置Label 的文本。

如果您希望在Entry 中键入其他文本时更新Label,请尝试以下操作:

def abind(avar):
    ...
    at = Label(w, textvariable=avar)  # use textvariable
    at.pack                           # pack again
    ...
...
b = Button(app, command=lambda: abind(at)) # pass at itself
...

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多