2016-10-18 4 views
0

У меня есть небольшой дисплей, подключенный к моему пи. Теперь у меня есть скрипт Python, который измеряет время между двумя событиями заголовков gpio. Я хочу показать это время (сценарий, чтобы получить это время работает отлично). Для этого я создал окно tkinter. Там, у меня есть ярлык, который должен отображаться на этот раз. Я выполнил функцию gui, чтобы программа все еще слушала вывод GPIO.обновление threaded tkinter gui

def guiFunc(): 
    gui = Tk() 
    gui.title("Test") 
    gui.geometry("500x200") 
    app = Frame(gui) 
    app.grid() 
    beattime = Label(app, text = "test") 
    beattime.grid() 
    gui.mainloop() 


gui_thread = threading.Thread(target = guiFunc) 
gui_thread.start() 


while True: 
    time.sleep(.01) 
    if (GPIO.input(3)): 
     time = trigger() #trigger is the function to trigger the 'stopwatch' 
     global beattime 
     beattime['text'] = str(time) 
     while GPIO.input(3): #'wait' for btn to release (is there a better way?) 
      print "btn_pressed" 

Так что программа ничего не делает, так как я добавил эти строки:

global beattime 
beattime['text'] = str(time) 

Что я делаю неправильно?

ответ

0

Использование tkinter.StringVar

# omitting lines 
global timevar 
timevar = StringVar() 
timevar.set("Test") 
beattime = Label(app, textvariable=timevar) 
# omitting lines 

#changing the text: 
while True: 
    time.sleep(.01) 
    if (GPIO.input(3)): 
     time = trigger() #trigger is the function to trigger the 'stopwatch' 
     timevar.set(str(time)) 
     root.update() #just in case 

     while GPIO.input(3): #'wait' for btn to release (is there a better way?) 
      print "btn_pressed" 

И вы должны запустить графический интерфейс в основном потоке. Его не рекомендуется вызывать вызовы gui из разных потоков.

+0

Но если я не должен использовать разные потоки для вызова команд gui, как я должен это делать? Главный гвоздь будет блокировать все. – jukisu

+0

Напишите часть таймера в потоке, но не вызывайте функции gui непосредственно из нее. Вместо этого используйте очередь, сокет, переменную и т. Д. Это просто рекомендация. – Dashadower

+0

Я имею в виду, как я должен написать новое значение для переменной: цикл while while: while не выполняется? – jukisu