Я пытаюсь создать графический интерфейс на основе Tkinter для значения датчиков печати Arduino и реагирования на ввод пользователя.
Код, который я пытаюсь использовать, чтобы исключить циклы while, это то, что не печатает никакой информации о датчике, единственный вывод - «Trying ... / dev / ttyACM0», за которым следует открытие окна tkinter,импортировать время последовательного импорта из Tkinter import *
connected = False
write_to_file_path = "output.txt"
output_file = open(write_to_file_path, "w+")
locations=['/dev/ttyACM0','/dev/ttyACM1','/dev/ttyACM2','/dev/ttyACM3']
for device in locations:
try:
print "Trying...",device
ser = serial.Serial(device, 9600)
break
except:
print "Failed to connect on",device
## loop until the arduino tells us it is ready
while not connected:
serin = ser.read()
connected = True
time.sleep(0.1)
ser.flushInput()
time.sleep(1)
def serialRead():
if ser.inWaiting():
line = ser.readline()
data = line.decode("utf-8").split('\t')
print(data)
output_file.write(line)
root.after(1000, serialRead)
root = Tk()
root.title("Temperature Control")
serialRead()
root.mainloop()
Это, с другой стороны, прекрасно работает, за исключением отсутствия окна tkinter.Но он удаляет старые входные данные из буфера и считывает новые входные данные.
import serial
import time
connected = False
write_to_file_path = "output.txt"
output_file = open(write_to_file_path, "w+")
serial_port = '/dev/ttyACM0'
baud_rate = 9600
ser = serial.Serial(serial_port, baud_rate, timeout=5)
time.sleep(0.1)
ser.flushInput()
time.sleep(1)
while True:
if ser.inWaiting():
line = ser.readline()
data = line.decode("utf-8").split('\t') #ser.readline returns a binary, convert to string
print data[0] + '\t' + data[1]
output_file.write(line)
Это было вдохновлено другой публикацией stackoverflow, сделанной некоторое время назад: Запуск бесконечного цикла в фоновом режиме в Tkinter
Я видел несколько примеров использования многопоточности, но я не очень разбираюсь в python и в многопоточности, поэтому мне бы очень хотелось, чтобы он работал с root.after (), если это возможно.Я также попробовал пример с использованием root.after, все они очень похожи на тот, который я связал, и я не смог заставить работать ни один из них.Я делаю что-то явно неправильно или так, что это намного сложнее, чем нужно?Я был бы очень признателен, если бы кто-то указал мне верное направление.