Как отложить часть функции, когда задействованы виджеты? - PullRequest
0 голосов
/ 08 ноября 2019

(простите за плохой английский) Привет! Я новичок в программировании. У меня возникли некоторые проблемы с использованием метода after, я использую Tkinter.

Итак, я хочу, чтобы функция выполняла часть кода, а затем задерживала остальное, но она просто зависает и выполняет все сразу.

def click1 ():
    entered_text=textentry.get()
    textentry.delete(0, "end")
    try:
        rasp1 = inputs[entered_text]
    except:
        rasp1 = "Hello, " + entered_text + "!"
    textentry.destroy()
    enter.destroy()
    tk.Label(root,
             text=entered_text + " <<",
             fg="white",
             bg="#333333",
             #aspect=1000,
             justify="left",
             font=courier) .grid(column=1, sticky="e")
    root.after(3000)
    Rasp1 = tk.Message(root,
                       text=">> " + rasp1,
                       fg="#00ff00",
                       bg="#333333",
                       aspect=800,
                       justify="left",
                       font=courier)
    Rasp1.grid(column=1, sticky="w")

Я пытался написать функцию обратного вызова в качестве функции, как я видел в других программах, но это привело бы к ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1547, in __call__
    return self.func(*args)
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 596, in callit
    func(*args)
  File "C:\create\Jim(grid).exe.py", line 38, in click1
    entered_text=textentry.get()
  File "C:\Python27\Lib\lib-tk\Tkinter.py", line 2518, in get
    return self.tk.call(self._w, 'get')
TclError: invalid command name ".31959040"

1 Ответ

0 голосов
/ 09 ноября 2019

Я предполагаю, что вы хотите, но я думаю, что приведенный ниже код поможет.

Ваше значение должно быть root.after(3000, callback). Я переместил код Rasp1... в функцию do_after, которая вызывается пользователем root через 3 секунды после выполнения root.after. Смысл after в том, что он не задерживает выполнение чего-либо в GUI. Это позволяет остальной части графического интерфейса оставаться активным для ввода текста, кликов и т. Д., В то время как программа задерживает запуск своего обратного вызова.

import tkinter as tk

def click1 ():
    global rasp1
    entered_text=textentry.get()
    textentry.delete(0, "end")
    rasp1 = "Hello, " + entered_text + "!"
    textentry.destroy()
    enter.destroy()
    tk.Label(root,
             text=entered_text + " <<",
             fg="white",
             bg="#333333",
             #aspect=1000,
             justify="left").grid(row = 2, column=1, sticky="e")
    root.after(3000, do_after )

def do_after():
    Rasp1 = tk.Message(root,
                       text=">> " + rasp1,
                       fg="#00ff00",
                       bg="#333333",
                       aspect=800,
                       justify="left")
    Rasp1.grid(row=2, column=0, sticky="w")

root = tk.Tk()
textentry = tk.Entry(root)
textentry.grid()
enter = tk.Button(root, command = click1, text = " Test " )
enter.grid()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...