Передавать переменную между двумя сценариями?


0 принят

Во 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()

0

Ваш varгенератор возвращает итератор, вам нужно будет сохранить экземпляр итератора и вызвать .set()его, чтобы получить следующее значение. Чтобы изменить его var, вам нужно будет его изменить.from tkinter import * import script2 root = Tk() canvas = Canvas(root, width=300, height=300) canvas.pack() def runScript(): var.set(next(info)) # set the variable as the "next" result of the info generator info = script2.information() # the info is an iterator button1 = Button(root, text="Click Me!", command=runScript) button1.pack() var = StringVar() var.set('Waiting for Input...') status = Label(root, textvariable=var, bd=1, relief=SUNKEN, anchor=W) status.pack(side=BOTTOM, fill=X) root.mainloop()

script2

Он script2может оставаться неизменным. Но я рекомендую вам не использовать time.sleep, это не сработает, как вы ожидаете! Это просто заставит вашу программу не отвечать на заданные секунды.

Вам нужно будет использовать, root.afterесли вы хотите увеличить, чтобы продолжить до StopIteration, просто измените runScriptна это ::

def runScript():
    global info
    try:
        var.set(next(info)) # set the variable as the "next" result of the info generator
    except StopIteration:
        var.set('Finished')
        info = script2.information()
    else:
        root.after(1, runScript)
Python, Tkinter, сценарии, статусное, выход,

python,tkinter,scripting,statusbar,yield,

2

Ответов: 2


0 принят

Во 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()

0

Ваш varгенератор возвращает итератор, вам нужно будет сохранить экземпляр итератора и вызвать .set()его, чтобы получить следующее значение. Чтобы изменить его var, вам нужно будет его изменить.from tkinter import * import script2 root = Tk() canvas = Canvas(root, width=300, height=300) canvas.pack() def runScript(): var.set(next(info)) # set the variable as the "next" result of the info generator info = script2.information() # the info is an iterator button1 = Button(root, text="Click Me!", command=runScript) button1.pack() var = StringVar() var.set('Waiting for Input...') status = Label(root, textvariable=var, bd=1, relief=SUNKEN, anchor=W) status.pack(side=BOTTOM, fill=X) root.mainloop()

script2

Он script2может оставаться неизменным. Но я рекомендую вам не использовать time.sleep, это не сработает, как вы ожидаете! Это просто заставит вашу программу не отвечать на заданные секунды.

Вам нужно будет использовать, root.afterесли вы хотите увеличить, чтобы продолжить до StopIteration, просто измените runScriptна это ::

def runScript():
    global info
    try:
        var.set(next(info)) # set the variable as the "next" result of the info generator
    except StopIteration:
        var.set('Finished')
        info = script2.information()
    else:
        root.after(1, runScript)
Python, Tkinter, сценарии, статусное, выход,
Похожие вопросы