Python 调用函数时更新Tkinter中的标签

Python 调用函数时更新Tkinter中的标签,python,tkinter,label,Python,Tkinter,Label,我有一个Tkinter GUI,我想在一个标签中更新脚本的状态,写下调用的函数,但是我有问题。 我已经在这里看到了很多答案,但仍然无法找到解决方案。这是我正在编写的代码的一部分: run_script(username, password): text = StringVar() text.set('') l=Label(master, text=text, fg='blue') l.grid(row=6) #I would like the Label in t

我有一个Tkinter GUI,我想在一个标签中更新脚本的状态,写下调用的函数,但是我有问题。 我已经在这里看到了很多答案,但仍然无法找到解决方案。这是我正在编写的代码的一部分:

run_script(username, password):
    text = StringVar()
    text.set('')
    l=Label(master, text=text, fg='blue')
    l.grid(row=6) #I would like the Label in the row 6
    l.pack()
    text.set('calling my function1')
    my_file.my_function1(username, password)
    text.set('calling my function2')
    my_file.my_function2()

master = Tk()
username = Entry(master, name='username', width=30)
password = Entry(master, name='password', show='*', width=30)
username.grid(row=0, column=1, padx=10, pady=(10,2))
password.grid(row=1, column=1, padx=10, pady=2)
def call_report(username, password):
    run_script(username, password)
Button(master, text='start script',
   command= lambda:call_report(username.get(), password.get(),)).grid(row=6, column=1, sticky=W, pady=10)
mainloop()

程序运行正常,只是标签没有更新。谢谢

这里有一种方法,使用关键字参数textvariable:

注: 不鼓励在同一小部件中使用包和网格几何管理器。
请将tkinter作为tk导入:添加tk。保持命名空间干净的代价很小。

这是我的解决方案,可以用作示例:

from Tkinter import *
from time import sleep

def run_script():
    text = StringVar()
    l = Label(master, textvariable=text, fg='blue').grid(row=6)
    text.set('calling my function1')
    master.update()
    sleep(2)
    text.set('end of function1')

def call_report():
    run_script()


if __name__ == '__main__':
   master = Tk()
   username = Entry(master, name='username', width=30)
   password = Entry(master, name='password', show='*', width=30)
   username.grid(row=0, column=1, padx=10, pady=(10,2))
   password.grid(row=1, column=1, padx=10, pady=2)

  button = Button(master, text='start script', command=lambda: call_report())
  button.grid(row=6, column=1, sticky=W, pady=10)

  master.mainloop()

我已将标签中的文本更改为textvariable,并添加了master.update。这样,它会强制GUI重新绘制。为了测试GUI是否正在更改,我使用sleep进行了测试。例如,在调用函数之前,可以有更多的时间进行更新。

谢谢您的回答。但它仍然不起作用。我在添加文本时尝试了这部分代码。set'calling my function1'sleep5 text.set'end of function1'在5秒钟后显示了刚刚结束的function1。我使用python 2.7,我以这种方式导入tkinter:从tkinter import*@Joe,您不应该对tkinter使用sleep。如果要添加延迟,请改用.after方法。这将使GUI有机会刷新屏幕。@scotty3785好的,谢谢。你知道为什么没有睡眠的代码中没有更新文本吗?@Joe你可以在设置文本后尝试master.update。这将迫使GUI重新绘制。如果您解释您所做的,您的答案会更好。否则,我们必须逐行逐字地将您的代码与问题中的代码进行比较,以查看您更改了什么。谢谢您的建议,我现在就来
from Tkinter import *
from time import sleep

def run_script():
    text = StringVar()
    l = Label(master, textvariable=text, fg='blue').grid(row=6)
    text.set('calling my function1')
    master.update()
    sleep(2)
    text.set('end of function1')

def call_report():
    run_script()


if __name__ == '__main__':
   master = Tk()
   username = Entry(master, name='username', width=30)
   password = Entry(master, name='password', show='*', width=30)
   username.grid(row=0, column=1, padx=10, pady=(10,2))
   password.grid(row=1, column=1, padx=10, pady=2)

  button = Button(master, text='start script', command=lambda: call_report())
  button.grid(row=6, column=1, sticky=W, pady=10)

  master.mainloop()