编写程序,绘制一个周期的正弦曲线,并实现下面的功能:1)鼠标进行图形区域之后,设置图形背景色为黄色,鼠标离开图形区域时将其恢复为白色;2)当鼠标移动至正弦曲线附近(距离小于2个像素)时在鼠标上方出现文本标注当前值,鼠标远离曲线时文本标注自动消失。
时间: 2024-02-26 22:57:52 浏览: 52
好的,以下是Python的代码实现:
```python
import tkinter as tk
import math
class SinGraph:
def __init__(self, master):
self.master = master
self.canvas = tk.Canvas(master, width=500, height=300, bg="white")
self.canvas.pack()
self.canvas.bind("<Motion>", self.motion_handler)
self.canvas.bind("<Enter>", self.enter_handler)
self.canvas.bind("<Leave>", self.leave_handler)
self.draw_graph()
def draw_graph(self):
self.canvas.create_line(0, 150, 500, 150, width=2)
self.canvas.create_line(250, 0, 250, 300, width=2)
x_old, y_old = 0, 150
for i in range(500):
x = i
y = 150 - 100 * math.sin((i-250)/50*math.pi)
self.canvas.create_line(x_old, y_old, x, y, width=2)
x_old, y_old = x, y
def enter_handler(self, event):
self.canvas.config(bg="yellow")
def leave_handler(self, event):
self.canvas.config(bg="white")
self.canvas.delete("text")
def motion_handler(self, event):
x, y = event.x, event.y
self.canvas.delete("text")
if x < 0 or x > 500 or y < 0 or y > 300:
return
nearest_x = round(x/2)*2
nearest_y = 150 - round((y-150)/100)*100
distance = math.sqrt((x-nearest_x)**2 + (y-nearest_y)**2)
if distance < 2:
text = "x={:.2f} y={:.2f}".format((nearest_x-250)/50*math.pi, (150-nearest_y)/100)
self.canvas.create_text(x, y-10, text=text, tag="text")
```
我们创建了一个名为`SinGraph`的类,它继承自`tkinter.Frame`,并在其中创建了一个画布`canvas`。在`__init__`函数中,我们绑定了鼠标移动、进入和离开画布的事件处理函数,并调用了`draw_graph`函数绘制正弦曲线。
在`draw_graph`函数中,我们首先绘制了x轴和y轴,然后利用正弦函数绘制了正弦曲线。在鼠标进入画布时,我们将画布背景色设置为黄色,在离开时将其恢复为白色,并删除所有文本标记。在鼠标移动事件中,我们首先判断鼠标是否在画布范围内,然后找到距离鼠标最近的点,计算鼠标到该点的距离,如果距离小于2个像素,就在鼠标上方显示文本标记,否则删除所有文本标记。
你可以在主函数中创建一个`SinGraph`实例来测试这个程序。