Во script2.information()
-первых, это функция генератора, которая означает, что вам придется вручную перебирать объект-генератор, возвращенный при первом вызове, чтобы получить последовательные значения.
Для другого tkinter
не поддерживается многопоточность. Одна вещь, которую вы можете сделать, это расписание для функции, которая будет вызываться через определенное время, используя универсальный метод виджетов StringVar()
. В этом случае его можно использовать для планирования вызова функции (добавленной), которая выполняет итерацию объекта генератора после его создания путем вызова script2.py
и обновления time.sleep()
виджета соответственно каждый раз, когда он вызывается .
Вам также нужно изменить, mainloop()
чтобы он не вызывал script2.py
. Это сделает вашу программу tkinter GUI зависающей, когда она вызывается (поскольку она временно прерывает выполнение tkinter ).import time def information(): variable = 0 while variable < 60: # changed from 500 for testing yield variable variable += 1 print(variable) # time.sleep(1) # don't call in tkinter programs
Изменено :from tkinter import * import script2 DELAY = 100 # in millisecs root = Tk() canvas = Canvas(root, width=300, height=300) canvas.pack() def do_update(gen, var): try: next_value = next(gen) except StopIteration: var.set('Done!') else: var.set(next_value) root.after(DELAY, do_update, gen, var) # call again after delay def run_script(var): gen = script2.information() # create generator object do_update(gen, var) # start iterating generator and updating var var = StringVar() var.set('Waiting for Input...') button1 = Button(root, text="Run script!", command=lambda: run_script(var)) button1.pack() status = Label(root, textvariable=var, bd=1, relief=SUNKEN, anchor=W) status.pack(side=BOTTOM, fill=X) root.mainloop()
information
главный скрипт:
next()