Обновление текста метки Python Tkinter оставляет старый текст до выхода из функции - PullRequest
0 голосов
/ 03 мая 2018

Я создаю простой графический интерфейс с использованием python и tkinter, это проблема Magic 8 Ball. Моя проблема возникает, когда я пытаюсь обновить текст, который отображается надписью ответа внутри функции ASK. Я хотел попробовать обновить его несколько раз, чтобы он мигал между --- и "[Пробел]" в течение нескольких секунд, прежде чем дать ответ. Но кажется, что он просто накладывается поверх нового текста поверх старого текста до тех пор, пока не будет завершена функция ASK, когда останется только последний текст, который будет добавлен.

Это просто потому, что я могу обновить только один раз внутри функции? Или есть простой способ обойти это?

Код, вырежьте столько, сколько я мог, чтобы показать ошибку:

import time
import random
from tkinter import *

responses=[]
responses.append("No")
responses.append("Yes")
responses.append("I don't think so")    

class TheGUI:
    def __init__(self, master):
        self.master = master
        master.title("Python Magic 8 Ball GUI")

        self.label = Label(self.master, text="Enter a Question you would like to ask (no to quit):")
        self.label.pack()

        self.enterplace = Entry(self.master)
        self.enterplace.pack()

        self.labeltext=StringVar()
        self.labeltext.set("--")
        self.response = Label(self.master, justify=CENTER, textvariable=self.labeltext)
        self.response.pack()

        self.frame = Frame(self.master)
        self.frame.pack()

        self.greet_button = Button(self.frame, text="Ask", command=self.ask)
        self.greet_button.pack(side=LEFT)

        self.close_button = Button(self.frame, text="Clear", command=self.clear)
        self.close_button.pack(side=LEFT)

    # This is the function in question
    def ask(self):
        the_q = self.enterplace.get()

        if the_q == "no":
            self.labeltext.set("Okay, Goodbye..")
            time.sleep(2)
            self.master.quit
        else:
            self.labeltext.set("Let me think for a moment")
            self.master.update_idletasks()
            time.sleep(2)

            # Here, when I update the label to be ---, the previous text 
            # remains as a background, and only disappears once this 
            # function has exited. I was initially trying to make the --- 
            # blink once or twice, but ran into this error

            self.labeltext.set("---")
            self.master.update_idletasks()
            time.sleep(2)

            self.labeltext.set(random.choice(responses))
            self.master.update_idletasks()
            time.sleep(2)

    def clear(self):
        self.labeltext.set("")
        self.master.update_idletasks()


root = Tk()
my_gui = TheGUI(root)
root.mainloop()

На следующем рисунке показано наложение текста: «Дайте мне подумать немного» и «Я так не думаю»

enter image description here

Ответы [ 2 ]

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

Вы должны использовать:

self.master.update()

вместо:

self.master.update_idletasks()

и тебе пора. По крайней мере, у меня это работает на Python 2.7

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

У тебя было почти все правильно! Для меня сработало заменить self.master.update_idletasks() на self.master.update()

        self.labeltext.set("Let me think for a moment")
        self.master.update()
        # self.master.update_idletasks()
        time.sleep(2)

        self.labeltext.set("---")
        self.master.update()
        # self.master.update_idletasks()
        time.sleep(2)
        self.labeltext.set(random.choice(responses))
        self.master.update()
        # self.master.update_idletasks()
        time.sleep(2)

Однако я не понимаю, почему update_idletasks() не работает в этом случае ...

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