Обновить ярлык в Tkinter при вызове функции - PullRequest
0 голосов
/ 08 мая 2018

У меня есть графический интерфейс Tkinter, и я хотел бы обновить статус скрипта в 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 голосов
/ 08 мая 2018

Это мое решение, которое можно использовать в качестве примера:

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, я протестировал sleep. Можно обновить больше времени (например, перед вызовом функции).

0 голосов
/ 08 мая 2018

вот один из способов сделать это, используя ключевое слово аргумент 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()

Примечание:

Использование менеджеров геометрии pack и grid в одном виджете не рекомендуется.
Пожалуйста, import tkinter as tk: добавление tk. - это небольшая цена для поддержания чистоты пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...