Как мгновенно обновить глобальную переменную внутри функции в Python 3? - PullRequest
0 голосов
/ 31 января 2019

У меня есть две глобальные переменные (StringVar()), которые нужно мгновенно обновлять внутри функции, а не в конце.Это мой код.

def send_command_onLED():

    global ReactionTime_HHHH
    global ReactionTime_T
    global string_time
    global mode
    global mode_sel
    global command
    global text_mode_sel
    global go_text

    if mode==0:
        if command=='GUI':
            text_mode_sel.set("") # bisogna fare in modo di far eseguire subito questi due comandi
            go_text.set("GO!!!")  #
        elif command=='CMDL':
            print("Ready, steady, go!!!")
        ReactionTime_T = ''
        ReactionTime_HHHH = ''
        numcasuale = random.randint(10,20)
        time.sleep(numcasuale)
        ser.write("L1".encode())
        t0 = time.time()
        while(ReactionTime_T!='T'):
            ReactionTime_T=ser.read(1).decode('utf-8')
            t1 = time.time()
            if t1-t0>70:
                print("Error TIMEOUT!")
                exit()
        else:            
            ReactionTime_HHHH=ser.read(4).decode('utf-8')
            ser.reset_input_buffer()
        if command=='GUI':
            if ReactionTime_HHHH=="FFFF":
                string_time.set("You are drunk my friend!!!!")
            else:
                string_time.set(str(int(ReactionTime_HHHH, 16)) + " ms")
            updateScore()
            go_text.set("")
        elif command=='CMDL':
            if ReactionTime_HHHH=="FFFF":
                print("\nYou are drunk my friend!!!!\n")
            else:
                print("\nNew score: " + str(int(ReactionTime_HHHH, 16)) + " ms\n")
        mode=1
        mode_sel=1

    else:
        mode_sel=0
        if command=='CMDL':
            print("Unable to execute this command, the LED is already ON! ")

Переменные text_mode_sel и go_text должны быть обновлены до time.sleep(), потому что они являются текстовыми переменными двух меток (я использовал tkinter) и их изменения должны быть мгновеннымивидно за пределами функции, прежде чем она заканчивается.Другими словами, их изменения должны отображаться мгновенно.С моим кодом они обновляются только тогда, когда функция заканчивается и изменения до time.sleep() не имеют ожидаемого эффекта.Есть ли способ обновить эти переменные во время выполнения функции ??

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я предполагаю, что вы используете tkinter

Если вы это делаете, вам следует позвонить root.update() (или как называется ваш экземпляр tkinter.Tk), чтобы, как следует из названия, немедленно обновить экран.Начиная с __doc__:

Вводите цикл обработки событий, пока все ожидающие события не будут обработаны Tcl.

Чтобы иметь отложенное выполнение, вы также можете посмотреть root.after(time_in_ms, function) (опять же, ваш tkinter.Tk может иметь другое имя.

0 голосов
/ 31 января 2019

Нет необходимости отмечать text_mode_sel и go_text как глобальные в этом случае.

И, судя по всему, только mode и mode_sel должны быть глобальными в этом случае,Остальное не объявляется / не присваивается в этой функции, поэтому они будут работать, как и ожидалось, без глобального.

Что касается немедленного обновления, трудно сказать, что происходит с вашим кодом, не зная, что go_textи text_mode_sel есть, но в этом коде нет задержки.Я ожидаю, что используемой вами библиотеке может потребоваться команда перерисовки или около того.

...