Итак, я хочу сделать так, чтобы в скрипте B была функция, которая будет вызываться внутри скрипта A. Так что эта функция будет выводить некоторые данные на консоль через print, но я хочу, чтобы выводтакже должен отображаться на виджете, а сценарий A - это тот, где происходят все мои операции с графическим интерфейсом.
Поэтому я передал функцию X в качестве аргумента функции Y в сценарии B, поэтому, когда этот вывод был напечатан в функции Y, я просто сослался на это в переменную и передалпеременная в функцию X сценария A ... которую я передал в качестве аргумента. Таким образом, эта функция просто вставила вывод в текстовый виджет.
Но проблема в том, что функция Y была вызвана после нажатия кнопки, и по какой-то причине кнопка зависает на некоторое время, а затем отображает окончательный вариантвыводить все сразу. Но это не то, что я хочу. Я хочу, чтобы вывод отображался одновременно с отображением в консоли, один за другим, таким образом. Но похоже, что виджет кнопки возобновляется, когда вся функция, переданная в аргументе команды, завершилась.
Чтобы решить эту проблему, я попытался использовать функции sleep и after, но, похоже, они мне не очень помогают. ,Таким образом, я попытался воссоздать свою проблему более простым способом, и я попытался сделать это, используя сон и после, но ни один из них, кажется, не работает для меня.
Итак, коды приведены ниже, хотя они не совсем соответствуют моей проблеме, но я надеюсь, что они смогут объяснить мой вопрос более четко.
Итак, у нас есть два сценария A и B
В скрипте A -
from time import sleep
# will output a number every 1 second on the console
def Show(number, Function):
while(number < 5):
sleep(1) # Wait specified time
number += 1 # Some random operation, here incrementing the number by 1
print(number) # On console
Function(number) # On widget
В скрипте B -
import A
import tkinter as tk
number = 0
root = tk.Tk()
# Function which will be passed as an argument
def Print(number):
label = tk.Label(root, text=number)
label.pack()
# Will be used for the after method [ OPTIONAL ]
def Delay(number, Print):
root.after(5000, test.Show(number, Print))
# Below I recommend to comment either one of the button initializations, in order to test each ways
# Using sleep method
button = tk.Button(root, text='Start', command=lambda: A.Show(number, Print))
#OR
# Using after method
button = tk.Button(root, text='Start', command=lambda: Delay(number, Print))
button.pack()
tk.mainloop()
Итак, я хочу показать цифры на любом виджете (вмоя настоящая проблема это текстовый виджет) в то же время, как это происходит на самом деле, то есть отображение на консоли.
ОБНОВЛЕНИЕ: это не настоящая проблема, это простоупрощенная версия моей актуальной проблемы. Так что не думайте, что я пытаюсь усложнить этот код. Как я тренирую классификатор с обученным NN, так вывод выводится на каждой итерации на консоли. Поэтому я хочу добиться того, чтобы выходные данные печатались на текстовом виджете одновременно и во время текущего цикла.
ОБНОВЛЕНИЕ 2: Этонаконец-то работает так, как я хотел. Ответ заключается в использовании потоков, как описано Майком: D