Как обновить текст метки Tkinter перед выполнением какой-либо другой функции? - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь написать небольшую программу с графическим интерфейсом, используя Tkinter. То, что я пытаюсь сделать, это создать окно с кнопкой и вводом, который работает просто отлично. Тем не менее, я хочу, чтобы кнопка запускала определенную функцию func(), которая обновляет окно tkinter, и только после того, как это будет сделано, запустите все, что будет дальше:

import tkinter as tk
import time

def func():
    widgets = root.grid_slaves()
    for widget in widgets:
        if int(widget.grid_info()['row']) != 0:
            widget.destroy()
            startPrompt.configure(text = "Updated Text")

    startPrompt.update_idletasks() 
    # root.update_idletasks()  -- I have tried both and neither work

    # Just an example of something running, to verify that the loop executes 
    # before tkinter window gets updated
    for i in range(10):
        print(i)
        time.sleep(0.5)


font = ("Helvetica",20)
root = tk.Tk()
startPrompt = tk.Label(root, text="Starting Prompt", font = font)
inputPrompt = tk.Label(root, text="Input Prompt",font = font)
root.textEntry = tk.Entry(root, width=50)
submitButton = tk.Button(root, text="Enter", command = func, width = 20,pady = 10,font = font)

startPrompt.grid(row = 0,columnspan = 2,padx = 10, pady = 10)
inputPrompt.grid(row = 1, padx = 10, pady = 10)
root.textEntry.grid(row = 1, column = 1, padx = 10)
submitButton.grid(row = 2, columnspan = 2)

root.mainloop()

У меня проблема в том, что независимо от того, что я пытаюсь, это не работает. Я пытался использовать after(), но из-за того, что моя программа написана, очень сложно переписать все так, чтобы это работало правильно. Я пытался использовать update_idletasks(), но это тоже не сработало.

Кто-нибудь знает, почему update_idletasks() не работает или я его неправильно использую, и есть ли способ решить мою проблему?

1 Ответ

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

Кажется, работает для меня после изменения нескольких вещей (другие были в основном просто небольшая оптимизация).

  1. Изменено func() на не используйте time.sleep(), как показано ниже - универсальный метод виджета after() может (также) использоваться для этого, и его использование не мешает mainloop() Бегущий по дороге sleep(). 1011 *
  2. Вызывается методом универсального виджета update() вместо update_idletasks() после уничтожения виджетов, но еще до запуска цикла подсчета.

Вот некоторая документация , описывающая, как использовать метод универсального виджета after() таким образом (а также метод update()).

FWIW: Вы сможете увидеть, что происходит лучше, если добавите что-то вроде строки root.geometry('600x400') после оператора root = tk.Tk() в разделе инициализации примера кода в вашем вопросе (не показан) здесь), что предотвратит изменение размера окна после разрушения виджетов и обновления дисплея.

def func():
    widgets = root.grid_slaves()
    for widget in widgets:
        if widget.grid_info()['row']:  # Don't need all that int() != 0 stuff.
            widget.destroy()

    startPrompt.configure(text="Updated Text")  # Only need to call once.
    root.update()  # Update display (startPrompt.update() also works here)

    # Just an example of something running, to verify that the loop executes
    # AFTER the tkinter window has been updated.
    for i in range(10):
        print(i)
#        time.sleep(0.5)  # Don't use sleep in tkiner programs.
        root.after(500)  # Pause 500 millisecs.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...