Как отобразить непрерывный поток декодированных байтов в Tkinter? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь отобразить последовательный вывод с моего устройства на Text Widget Tkinter, но я получаю эту ошибку <function win_read at 0x0318F930>.Если я введу многострочную строку, она будет отображаться нормально.Последовательный вывод представляет собой декодированную строку байтов, содержащую более 1000 строк строковых символов.

import tkinter as tk
import serial


ser = serial.Serial('COM3', timeout=1)
ser.baudrate = 115200

def win_read():
    while True:
        output = ser.read(10000).decode('utf-8', 'ignore')
        print(output)
        return

root = tk.Tk()
S = tk.Scrollbar(root)
T = tk.Text(root, height=4, width=50)
S.pack(side=tk.RIGHT, fill=tk.Y)
T.pack(side=tk.LEFT, fill=tk.Y)
S.config(command=T.yview)
T.config(yscrollcommand=S.set)
quote = win_read
T.insert(tk.END, win_read)
tk.mainloop()

Использую ли я правильный виджет?Я тоже пытался распечатать весь вывод на этикетке, но это не сработало.

1 Ответ

0 голосов
/ 27 сентября 2019

Вам не хватает скобок для вызова вашей функции, здесь: quote = stream_read().Отсюда <function win_read at 0x0318F930>, отображаемое в вашем виджете.
Вы также отправляете полученный поток на stdout (через print) вместо того, чтобы сделать его доступным для вашего графического интерфейса.

Вот пример с имитированным потоком:

import tkinter as tk
import random


def stream():
    while True:
        s = []
        for _ in range(random.randrange(4)):
            s.append(str(random.randrange(10)))
        yield ''.join(s)


def stream_read():    # <- maybe have a buffer mechanism here? Impossible to say more without access to the stream.  
    st = stream()
    return next(st)


def update_stream():
    print('.')
    T.insert(tk.END, stream_read())
    root.after(100, update_stream)


root = tk.Tk()

S = tk.Scrollbar(root)
T = tk.Text(root, height=4, width=50)
S.pack(side=tk.RIGHT, fill=tk.Y)
T.pack(side=tk.LEFT, fill=tk.Y)
S.config(command=T.yview)
T.config(yscrollcommand=S.set)
quote = stream_read()
T.insert(tk.END, quote)

update_stream()

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