Python Холст Tkinter, отображающий поток последовательных данных (математические задачи) - PullRequest
1 голос
/ 05 мая 2020
• 1000 Переменная angl содержит целое число от 0 до 180, представляющее состояние вращения.

Пока все хорошо, но я не могу полностью понять, как представить это на холсте с помощью Tkinter. Я пробовал разные вещи, но я немного очистил код для этого потока.

Цель состоит в том, чтобы иметь точку (1000, 1000) на холсте в качестве центра и перемещать зеленый кружок с координатами (x, y) масштабируется соответствующим образом.

Вот пример показаний с терминала

УГОЛ: 174
РАССТОЯНИЕ: 208,11
X: -72.99856014995218
Y: -194,88710146142
УГОЛ: 175
РАССТОЯНИЕ: 161,67
X: 96,75694368800949
Y: -129,51943000243384
УГОЛ: 176
РАССТОЯНИЕ: 100,88
X: 100,627116 * * Y: 7,13748557578522
УГОЛ: 177
РАССТОЯНИЕ: 43,61
X: 20,907170903220738
Y: 38,27169064496002

import serial
import re
import math
import tkinter
import time

w_width = 2000
w_height = 1000


def create_animation_window():
    window = tkinter.Tk()
    window.title("WALL-E SONAR")
    window.geometry(f'{w_width}x{w_height}')
    return window

def create_animation_canvas(window):
    canvas = tkinter.Canvas(window)
    canvas.configure(bg="black")
    canvas.pack(fill="both", expand=True)
    return canvas


ser = serial.Serial('/dev/ttyACM0', 9600)
strPort = '/dev/ttyACM0'
def animate_sonar(window, canvas):
    intercept = canvas.create_oval(0,0,20,20, fill="green")

    while True:
        rawData = ser.readline() # rawData input example: b'D:140.98A:57\r\n
        decodedData = rawData.decode("utf-8")
        line = re.search(r'D:(.*)A:(.*)\r\n', decodedData)

        if line:
            dist = float(line.group(1))
            angl = int(line.group(2))


            print(f"ANGLE:  {angl}")
            print(f"DISTANCE: {dist}")
            x = dist * math.cos(angl)
            y = dist * math.sin(angl)
            print(f"X:  {x}")
            print(f"Y:  {y}")

            canvas.moveto(intercept, x,y)

            window.update()



animation_window = create_animation_window()
animation_canvas = create_animation_canvas(animation_window)
animate_sonar(animation_window, animation_canvas)

1 Ответ

0 голосов
/ 06 мая 2020

Я вижу несколько вещей:

  • Угол, который вы используете в sin и cos, должен быть в радианах
  • Вы должны использовать позиции относительно вашего холста

Вот что я бы сделал:

import math
import tkinter
import time

window = tkinter.Tk()
window.title("WALL-E SONAR")
window.geometry(f'2000x1000')

canvas = tkinter.Canvas(window)
canvas.configure(bg="black")
canvas.pack(fill="both", expand=True)


def animate_sonar(window, canvas):
    dist = 200
    for angl in range(180, 360):
        rad = angl * math.pi / 180
        x = dist * math.cos(rad) + 300
        y = dist * math.sin(rad) + 300

        canvas.delete("all")
        canvas.create_oval(x-10, y-10, x+10, y+10, fill="green")
        canvas.create_line(300, 300, x, y, fill="red")
        window.update()
        time.sleep(0.05)


animate_sonar(window, canvas)
window.mainloop()

Если вы запустите это, вы должны увидеть что-то вроде:

300 в моем коде - это просто что-то добавить, но вам нужно поиграть с размерами вашего окна и холста, чтобы правильно разместить его там, где вы хотите.

        rad = angl * math.pi / 180
        x = dist * math.cos(rad) + 300
        y = dist * math.sin(rad) + 300

Начните с чего-то действительно простого, макета данные, которые помогут другим воспроизвести ваш код, а затем включить ваш датчик. Когда я впервые прочитал вопрос, я почти закрыл страницу, моя первая мысль заключалась в том, что я не смогу воспроизвести это без этого датчика ...

Я также использовал canvas.delete("all") ваш canvas.moveto дает мне ошибки, но если он отлично работает для вас, используйте его аналогично моему примеру.

надеюсь, что отправит вас на верный путь ...

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