首页 > 解决方案 > 使用 python turtle 在仪表上显示值

问题描述

我有一个连接到 arduino 的盖革计数器。草图吐出 sievert 值,这是一个两位小数的浮点数。我正在尝试在圆形表盘上显示该值。

它最明显是一个pebkac,但我有点卡在这个错误上:

Traceback (most recent call last):
  File "./turtle-gauge.py", line 60, in <module> draw_gauge(sev, pen)
  File "./turtle-gauge.py", line 53, in draw_gauge
    angle = int((sev / 40) * 360)
  TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

这是代码:

#!/usr/bin/python3

import turtle
import serial
import time

wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width=600, height=600)
wn.title("Geiger Counter")
wn.tracer(0)

# Let there be a serial port
ser = serial.Serial('/dev/ttyACM1')
ser.flushInput()

# Let there be a functon to read it
def read_sev():
    sev = ser.readline()
    sev = float(sev[0:len(sev)-5].decode("utf-8"))

# Let there be a drawing tool
pen = turtle.Turtle()
pen.hideturtle()
pen.speed(0)
pen.pensize(3)

# Let there be a gauge with a hand
def draw_gauge(sev, pen):
    pen.up()
    pen.goto(0,210)
    pen.setheading(180)
    pen.color("green")
    pen.pendown()
    pen.circle(210)
    pen.penup()
    pen.goto(0,0)
    pen.setheading(90)

    for _ in range(40):
        pen.fd(190)
        pen.pendown()
        pen.fd(20)
        pen.penup()
        pen.goto(0,0)
        pen.rt(50)
    # Draw the gauge hand
    pen.penup()
    pen.goto(0,0)
    pen.color("white")
    pen.setheading(90)
    angle = (sev / 40) * 360
    pen.rt(angle)
    pen.pendown()
    pen.fd(200)

while True:
    sev=read_sev()
    draw_gauge(sev, pen)
    wn.update()
    time.sleep(1)
    pen.clear()

wn.mainloop()

请帮忙!

标签: python

解决方案


如果使用sev=read_sev(),函数read_sev()必须返回一个值。如果你不返回一个值,它会给你None.

发生错误是因为 sev 是None,并且您不能除以None40。

要修复错误,您只需要return sev在您的read_sev()函数中。


推荐阅读