用python进行Tkinter图形设计,利用图形绘制的方法设计三个菜单(画多边形,画矩形,画椭圆)
时间: 2023-12-14 10:36:37 浏览: 43
下面是一个简单的示例代码,实现了三个菜单,分别用于绘制多边形、矩形和椭圆。
```python
import tkinter as tk
class DrawingApp:
def __init__(self, master):
self.master = master
master.title("Drawing App")
self.canvas = tk.Canvas(master, width=500, height=500)
self.canvas.pack()
self.current_shape = None
self.start_x = None
self.start_y = None
# 创建菜单栏
self.menu_bar = tk.Menu(master)
master.config(menu=self.menu_bar)
# 创建“绘制”菜单
self.draw_menu = tk.Menu(self.menu_bar)
self.menu_bar.add_cascade(label="绘制", menu=self.draw_menu)
# 添加“多边形”菜单项
self.draw_menu.add_command(label="多边形", command=self.start_polygon)
# 添加“矩形”菜单项
self.draw_menu.add_command(label="矩形", command=self.start_rectangle)
# 添加“椭圆”菜单项
self.draw_menu.add_command(label="椭圆", command=self.start_oval)
# 创建“清空”菜单
self.clear_menu = tk.Menu(self.menu_bar)
self.menu_bar.add_cascade(label="清空", menu=self.clear_menu)
# 添加“清空画布”菜单项
self.clear_menu.add_command(label="清空画布", command=self.clear_canvas)
# 绑定鼠标事件
self.canvas.bind("<ButtonPress-1>", self.on_mouse_press)
self.canvas.bind("<B1-Motion>", self.on_mouse_drag)
self.canvas.bind("<ButtonRelease-1>", self.on_mouse_release)
def start_polygon(self):
self.current_shape = "polygon"
self.polygon_points = []
def start_rectangle(self):
self.current_shape = "rectangle"
def start_oval(self):
self.current_shape = "oval"
def on_mouse_press(self, event):
self.start_x = self.canvas.canvasx(event.x)
self.start_y = self.canvas.canvasy(event.y)
if self.current_shape == "polygon":
self.polygon_points.append((self.start_x, self.start_y))
def on_mouse_drag(self, event):
x = self.canvas.canvasx(event.x)
y = self.canvas.canvasy(event.y)
if self.current_shape == "rectangle":
if self.start_x is not None and self.start_y is not None:
self.canvas.delete("temp_shape")
self.canvas.create_rectangle(self.start_x, self.start_y, x, y, outline="black", tags="temp_shape")
elif self.current_shape == "oval":
if self.start_x is not None and self.start_y is not None:
self.canvas.delete("temp_shape")
self.canvas.create_oval(self.start_x, self.start_y, x, y, outline="black", tags="temp_shape")
elif self.current_shape == "polygon":
if len(self.polygon_points) > 0:
self.canvas.delete("temp_shape")
self.canvas.create_polygon(self.polygon_points + [(x, y)], outline="black", tags="temp_shape")
def on_mouse_release(self, event):
end_x = self.canvas.canvasx(event.x)
end_y = self.canvas.canvasy(event.y)
if self.current_shape == "rectangle":
self.canvas.delete("temp_shape")
self.canvas.create_rectangle(self.start_x, self.start_y, end_x, end_y, outline="black")
elif self.current_shape == "oval":
self.canvas.delete("temp_shape")
self.canvas.create_oval(self.start_x, self.start_y, end_x, end_y, outline="black")
elif self.current_shape == "polygon":
self.polygon_points.append((end_x, end_y))
self.canvas.delete("temp_shape")
self.canvas.create_polygon(self.polygon_points, outline="black")
def clear_canvas(self):
self.canvas.delete("all")
root = tk.Tk()
app = DrawingApp(root)
root.mainloop()
```
在这个示例应用中,我们使用了 `Canvas` 组件来绘制图形,并且创建了三个菜单项,分别用于绘制多边形、矩形和椭圆。当我们选择一个菜单项时,应用程序会将 `current_shape` 属性设置为对应的形状类型。然后,在鼠标按下、拖动和释放事件的处理函数中,我们根据当前的形状类型来绘制不同的图形。我们还添加了一个“清空画布”菜单项,用于清空画布中的所有图形。