当我使用命令后,Tkinter会冻结吗?

时间:2015-10-29 19:51:02

标签: python loops user-interface tkinter freeze

我制作了一个Python脚本,它可以让我与arduino交流,而且我已经完成了通信,但我想用Tkinter创建一个漂亮的GUI。我已经制作了一个代码来设置它,但它会让我感到不安,所以在我给Python脚本提供一个串行输入之前我不会按任何按钮。 Wonse我给脚本一个输入它解冻,我可以使用它。但我不想发送串行输入以解冻GUI。肯定有更好的办法?!我使用的是Python 3.4。

我目前的代码:

from tkinter import *
import serial, os, time

ser = serial.Serial("/dev/ttyACM0", 9600)

root = Tk()
root.geometry("300x300")

def onled():
    ser.write(b'1')
    ledstate.config(text="Led is: On")

def offled():
    ser.write(b'2')
    ledstate.config(text="Led is: Off")

switchstate =Label(root, text="Switch is: Off")
switchstate.place(x=10, y=3)

ledon = Button(root, text="ON", command=onled)
ledon.place(x=100, y=16)
ledoff = Button(root, text="OFF", command=offled)
ledoff.place(x=150, y=16)

ledstate = Label(root, text="Led is: Off")
ledstate.place(x=10, y=20)

def head():
    serialInput = ser.readline()
    print(serialInput)
    if serialInput == b'1001\r\n':
        switchstate.configure(text="Switch is: On")
    if serialInput == b'1002\r\n':
        switchstate.configure(text="Switch is: Off")
    root.update_idletasks()
    root.after(1000, head)

root.after(1000, head)
root.mainloop()

谢谢!

1 个答案:

答案 0 :(得分:0)

Tkinter是单线程的。如果ser.readline()在等待数据读取时阻塞,则是,GUI将冻结。如果是这种情况,您需要将其设置为非阻塞,或者在另一个线程中执行读取,并使用线程安全队列将数据传回GUI。