Чтение последовательного ввода и печать в графический интерфейс Tkinter - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать графический интерфейс на основе 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, все они очень похожи на тот, который я связал, и я не смог заставить работать ни один из них.Я делаю что-то явно неправильно или так, что это намного сложнее, чем нужно?Я был бы очень признателен, если бы кто-то указал мне верное направление.

1 Ответ

0 голосов
/ 25 августа 2018

Я создал пользовательский интерфейс в TK для чтения данных с GPS-приемника, и у меня возникли трудности с запуском root.mainloop (), поэтому вместо этого я поместил обратный вызов в приложение TK, которое в конечном итоге вызывает root.update (), а не MainLoop.

Код выглядит примерно так:

class App:

def __init__(self, master):
    self.sats = tk.StringVar()
    self.satsnum = tk.Label(self.frame, textvariable=self.sats, bg="blue")
    self.satsnum.pack()

def update_display(self, master):

    while source:

        self.sats.set(n_sats)

        if n_sats < 10:
            satsbgcolor = 'red'
        else:
            satsbgcolor = 'green'
        self.satsnum.configure(bg = satsbgcolor)

        master.update()
        time.sleep(1)


with serial_link.get_base_args_driver(args) as driver:
    with Handler(Framer(driver.read, driver.write, verbose=True)) as source:
        root = tk.Tk()
        app = App(root)
        app.update_display(root)

Обратите внимание, что time.sleep (1) необходим в MacOS, так как tk.update () приведет к утечке памяти, если обновление вызывается слишком быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...