【问题标题】:update threaded tkinter gui更新线程 tkinter gui
【发布时间】:2017-02-27 21:13:54
【问题描述】:

我有一个小显示器连接到我的 pi。 现在我有一个 Python 脚本,可以测量 gpio 标头的两个事件之间的时间。 我想显示这个时间(获取这个时间的脚本运行良好)。为此,我创建了一个 tkinter 窗口。 在那里,我有一个这次应该显示的标签。 我已经对 gui 函数进行了线程化,以使程序仍然可以监听 GPIO 引脚。

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)

我做错了什么?

【问题讨论】:

    标签: python multithreading user-interface tkinter gpio


    【解决方案1】:

    使用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。不建议从不同线程调用 gui 调用。

    【讨论】:

    • 但是如果我不应该使用不同的线程来调用 gui 命令,我应该怎么做呢? gui 主循环会阻塞一切。
    • 在线程上编写定时器部分,但不要直接从它调用 gui 函数。相反,请使用队列、套接字、变量等。这只是一个建议。
    • 我的意思是我应该如何将新值写入变量是while True: 循环未执行?
    • 嗯,Idk 如何使用队列...我对 python 很不好...可以说...不是我的母语编程语言 xD
    • 我会试试的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多