首页 > 解决方案 > 如何使用传入的串行数据更新 Tkinter Canvas 中的对象?

问题描述

我创建了这个半圆,它从 Arduino(串行)中获取值,然后根据这些值旋转。问题是 Tkinter 画布也保留了旧的圆圈。我画布只是向我展示新的并删除旧的。代码附在下面。

import serial
import time    
from tkinter import *
import math
#-----------------------------------------------
ser = serial.Serial('COM5',baudrate = 9600)
ser.flushInput()
#-----------------------------------------------   
def tilt():
    ser_bytes = int(ser.readline().decode('ascii'))
    adata = (ser.readline().strip())
    ser_bytes = str(adata.decode('utf-8'))
    angle = int(ser_bytes)-247
    arc = c.create_arc(50, 50, 200, 200,start =angle,extent=-180, fill="red")
    c.delete(arc)
    root.after(100,tilt)
    print('X: {}' .format(ser_bytes))

root = Tk()
root.title("Control Panel")
root.geometry('1200x750')
frame_1 = Frame(root)
frame_1.pack()
c = Canvas(frame_1,width = 1000, height = 1000, bg = '#5F9EA0')
c.pack()
tilt()    
root.mainloop()

标签: pythoncanvastkinter

解决方案


您应该arc在程序启动时创建一次,然后使用canvas.itemconfig()它来更改其start角度:

import serial
from tkinter import *
#-----------------------------------------------
ser = serial.Serial('COM5', baudrate=9600)
ser.flushInput()
#-----------------------------------------------
def con():
    ser_bytes = int(ser.readline().decode('ascii'))
    return ser_bytes

def tilt():
    angle = con()
    c.itemconfig(arc, start=angle)
    root.after(100, tilt)
    print('X: {}'.format(angle))

root = Tk()
root.title("Control Panel")
root.geometry('1200x750')
frame_1 = Frame(root)
frame_1.pack()
c = Canvas(frame_1, width=1000, height=1000, bg='#5F9EA0')
c.pack()
# create the arc
arc = c.create_arc(50, 50, 200, 200, start=0, extent=-180, fill="red")
# start updating the arc
tilt()    
root.mainloop()

推荐阅读