Python 2.7, Tkinter, делает точку "трассирующей" по форме волны - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь создать виджет, который демонстрирует связь между синусоидальной волной и ее векторной диаграммой.Мне нужен указатель, который следует за движениями мыши пользователя, но вместо того, чтобы свободно перемещаться по странице, я хочу, чтобы он придерживался графика, который я нанес, и следовал только координатам, составляющим эту линию.Вроде как слайдер, но вдоль синусоиды!Какие-либо предложения?Благодарю.Вот что у меня получилось:

import math
import Tkinter as tk
from Tkinter import PhotoImage, Canvas
from PIL import Image, ImageTk

sinwidget = tk.Tk()

main_canvas = tk.Canvas(sinwidget, width = 400, height = 400, bg= "white")
main_canvas.pack()

def callback(event):
    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    print canvas.find_closest(x, y)

    draw(event.x, event.y)

def draw(x, y):
    box.coords(pointer, x-20, y-20, x+20, y+20)

def exit_():
    sinwidget.destroy()

box = main_canvas
box.bind('<Motion>', callback)
box.pack()

pointer = box.create_rectangle(0.2,0.2,0.2,0.2)
wavelength = 360
height = 400
center = height//2
degree = 1
increment = 0.0175
amplitude = -80

sin = []
for x in range(360):
    sin.append(x * degree)
    sin.append(int(math.sin(x * increment) * amplitude) + center)

sinwave = main_canvas.create_line(sin, fill="red", width=2.0)

xaxis = main_canvas.create_line(0, center, wavelength, center, fill="black", 
width=3.0)

yaxis = main_canvas.create_line(2, 100, 2, 300, fill="black", width=3.0)

exit_button = tk.Button(sinwidget, text = "exit", command = exit_)

exit_button.pack()

sinwidget.mainloop()

Спасибо за любую помощь, которую вы можете предложить!

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