在 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 滚动条上显示串行传入数据的主要内容,如果未能解决你的问题,请参考以下文章