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

时间:2018-05-08 06:53:03

标签: python tkinter label

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

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

程序运行完美,只是标签没有更新。感谢

2 个答案:

答案 0 :(得分:1)

这是一种方法,使用关键字参数textvariable

import tkinter as tk


def run_script(username, password):
    text = tk.StringVar()
    text.set('')
    lab = tk.Label(master, textvariable=text, fg='blue')
    lab.grid(row=6)
    text.set('calling my function1')
    # call functions here

def call_report(username, password):
    run_script(username, password)


if __name__ == '__main__':

    master = tk.Tk()
    username = tk.Entry(master, name='username', width=30)
    password = tk.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 = tk.Button(master, text='start script', command=lambda: call_report(username.get(), password.get(),))
    button.grid(row=6, column=1, sticky=tk.W, pady=10)

    master.mainloop()

注意:

不鼓励在同一小部件​​中使用packgrid几何管理器 请import tkinter as tk:添加tk.是保持名称空间清洁的一个小代价。

答案 1 :(得分:0)

这是我的解决方案,可以作为例子使用:

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

我已在text中将textvariable更改为Label,并添加了master.update()。通过这种方式,它强制GUI重绘。为了测试GUI是否正在发生变化,我使用sleep进行了测试。可以更新更多时间(例如在调用函数之前)。