在 tkinter 滚动条上显示串行传入数据

Posted

技术标签:

【中文标题】在 tkinter 滚动条上显示串行传入数据【英文标题】:Display serial incoming data on tkinter scrollbar 【发布时间】:2021-02-24 23:24:14 【问题描述】:

我下载了一个小型 arduino 程序,以便它生成串行数据。 我的目标(第一次迭代)是创建一个将替换 arduino IDE 串行的应用程序 - 因为我只想读取串行数据。

这是数据在 arduino IDE 串行接口上​​的样子。

这是我目前的代码:

import tkinter as tk
import tkinter.ttk as ttk
import serial.tools.list_ports
from tkinter import scrolledtext 
#new stuff
import time
import serial
import threading
import continuous_threading


#to be used on our canvas
HEIGHT = 700
WIDTH = 800

#hardcoded baud rate
baudRate = 9600

#Serial Stuff-----------------------------------------
ser = serial.Serial('COM16', baudRate)
val1 = 0
index = []
def readSerial():
    global val1
    ser_bytes = ser.readline()
    ser_bytes = ser_bytes.decode("utf-8")
    val1 = ser_bytes
    index.append(val1)
    disp = tk.Label(frame2, text=index[0])
    disp.config(font=("TkDefaultFont", 8))
    disp.place(relx = 0.1, rely=0.3, relwidth=0.3, relheight=0.5)

t1 = continuous_threading.PeriodicThread(0.5, readSerial)


# --- main ---
root = tk.Tk() #here we create our tkinter window
root.title("Sensor Interface")

#we use canvas as a placeholder, to get our initial screen size (we have defined HEIGHT and WIDTH)
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()


# --- frame 2 ---
frame2 = tk.Frame(root, bg='#80c1ff') #remove color later
frame2.place(relx=0, rely=0.1, relheight=1, relwidth=1, anchor='nw')

# make a scrollbar
scrollbar = scrolledtext.ScrolledText(frame2)
scrollbar.place(relx=0, rely=0, relheight=1, relwidth=1, anchor='nw')
# --- frame 2 ---

t1.start()
root.mainloop() #here we run our app

我有一个 frame2,它是一个滚动文本,我希望我的数据出现(我上面还有另一个框架,我在这里删除了它,这样我就不会用不必要的代码混淆人们)。

理想情况下,我希望数据显示在 arduino IDE 中,带有自动滚动功能 - 但首先我必须步行才能运行。

所有连续的“动作”都发生在我用 cmets 标记的部分,称为“连续的东西”。

我的展示位置代码正确吗?

disp = tk.Label(frame2, text=index[0])
disp.config(font=("TkDefaultFont", 8))
disp.place(relx = 0.1, rely=0.3, relwidth=0.3, relheight=0.5)

我希望每一行都放在文本框中的新行中,就像我的第一张图片一样

编辑:我听从了 scotty3685 的建议(非常感谢先生!)但是看看我现在在我的 tkinter 框架上得到了什么:

如果你和第一张图片比较,它很接近,但不是真的在那里。

【问题讨论】:

目前您似乎正在为每一行文本创建一个新标签。您可能想要做的是将文本插入到滚动文本小部件(这是一个带有滚动条的文本框)。您能否确认您希望文本框内的文本带有滚动条,而不是创建新标签? @scotty3785 是的,我希望它在带有滚动条的文本框中。多亏了您的回答,我走在了一条好路上,但还没有。 【参考方案1】:

在 ScrolledText 小部件中插入文本的方法如下

s.insert("end","some_text that I want to insert")
s 是滚动文本小部件的名称(在您的情况下,这是 混淆地称为滚动条) 插入"end"的第一个参数 告诉滚动文本小部件将新文本放在 文本框中的当前文本。 插入的第二个参数是 您要插入的文本(在您的情况下为val1)。

【讨论】:

哇!非常感谢您的帮助!我现在正在文本框中获取数据,但这并不是我想要的。我编辑了我的问题并添加了一张我现在得到的图片。如果你和第一张图片比较,有些数据是一样的,但有数据丢失。我不明白为什么我的传入数据看起来那样。可能是串行输入解码出错? 用 arduino 序列号重新检查。它显示行'NO FORMAT'行...然后计数到63,然后再次显示'NO FORMAT'行,在一个无限循环中。所以我不明白为什么pyhton只连续显示'NO FORMAT'行...... 我认为您需要将index[0] 更改为val1,当您写入文本框时。编辑了我的答案。使用index[0],它只会打印添加到列表中的第一行。 非常感谢!有效。起初有点慢,但后来我将 t1 = Continuous_threading.PeriodicThread(0.5, readSerial) 从 0.5 更改为 0.1,现在一切都很好。在解码方面仍然存在一些错误,但我会搜索它们。

以上是关于在 tkinter 滚动条上显示串行传入数据的主要内容,如果未能解决你的问题,请参考以下文章

在滚动条上突出显示文本

如何在滚动条上“检查元素”?

PyGtk 在滚动条上绘制标记

带有网格的 tkinter 画布滚动条?

Firefox 上的样式滚动条。如何摆脱滚动条上的黑色边框/轮廓?

如何使文本出现在html中的滚动条上