如何实现Tkinter中点击按钮在指定Canvas内绘制Turtle图形
解决Turtle在Tkinter指定Canvas绘图的问题
问题说明
点击Draw_Board按钮时,正方形会在新窗口绘制,需求改为直接在窗口A的Canvas中完成绘图,蓝、绿、灰功能将参照修正后的红色功能实现。
问题根源
在draw_square函数中创建了新的turtle.Turtle()实例,该实例默认关联独立的Turtle窗口,而非你已绑定到窗口A的Canvas。需要使用提前创建好的RawTurtle实例(即draw)来绘图,它已经和目标Canvas绑定。
修正后的完整代码
import turtle from random import randint import tkinter as tk from turtle import ScrolledCanvas, RawTurtle, TurtleScreen root = tk.Tk() root.geometry("600x500") root["bg"]="Teal" root.title("2.S.2.D") def create_window(): window = tk.Toplevel(root) window.geometry("400x250") a = tk.Button(window,text="Red", command=create_window_A) a.pack() b = tk.Button(window, text="Blue", command=create_window_B) b.pack() c = tk.Button(window, text="Green", command=create_window_C) c.pack() d = tk.Button(window, text="Grey", command=create_window_D) d.pack() # Red Color def create_window_A(): windowA = tk.Toplevel(root) windowA.geometry("600x600") # 调整窗口大小适配Canvas canvas = tk.Canvas(master=windowA, width=500, height=500, bg="white") canvas.grid(padx=2, pady=2, row=0, column=0, rowspan=10, columnspan=10) # 创建绑定到当前Canvas的RawTurtle实例 draw = turtle.RawTurtle(canvas) draw.color("red") # 设置画笔颜色匹配窗口主题 def draw_square(): # 使用已绑定Canvas的draw实例绘图,而非新建Turtle draw.penup() draw.goto(-50, 50) # 移动到居中起始位置 draw.pendown() # 简化正方形绘制逻辑 for _ in range(4): draw.forward(100) draw.right(90) draw.penup() draw.home() # 绘图后回到原点 Board_Button = tk.Button(master=windowA, text="Draw_Board", bg="cyan", fg="black", command=draw_square) Board_Button.grid(padx=2, pady=2, row=1, column=11, sticky='nsew') # 蓝、绿、灰窗口参照红色窗口实现 def create_window_B(): windowB = tk.Toplevel(root) windowB.geometry("600x600") canvas = tk.Canvas(master=windowB, width=500, height=500, bg="white") canvas.grid(padx=2, pady=2, row=0, column=0, rowspan=10, columnspan=10) draw = turtle.RawTurtle(canvas) draw.color("blue") def draw_square(): draw.penup() draw.goto(-50, 50) draw.pendown() for _ in range(4): draw.forward(100) draw.right(90) draw.penup() draw.home() Board_Button = tk.Button(master=windowB, text="Draw_Board", bg="cyan", fg="black", command=draw_square) Board_Button.grid(padx=2, pady=2, row=1, column=11, sticky='nsew') def create_window_C(): windowC = tk.Toplevel(root) windowC.geometry("600x600") canvas = tk.Canvas(master=windowC, width=500, height=500, bg="white") canvas.grid(padx=2, pady=2, row=0, column=0, rowspan=10, columnspan=10) draw = turtle.RawTurtle(canvas) draw.color("green") def draw_square(): draw.penup() draw.goto(-50, 50) draw.pendown() for _ in range(4): draw.forward(100) draw.right(90) draw.penup() draw.home() Board_Button = tk.Button(master=windowC, text="Draw_Board", bg="cyan", fg="black", command=draw_square) Board_Button.grid(padx=2, pady=2, row=1, column=11, sticky='nsew') def create_window_D(): windowD = tk.Toplevel(root) windowD.geometry("600x600") canvas = tk.Canvas(master=windowD, width=500, height=500, bg="white") canvas.grid(padx=2, pady=2, row=0, column=0, rowspan=10, columnspan=10) draw = turtle.RawTurtle(canvas) draw.color("grey") def draw_square(): draw.penup() draw.goto(-50, 50) draw.pendown() for _ in range(4): draw.forward(100) draw.right(90) draw.penup() draw.home() Board_Button = tk.Button(master=windowD, text="Draw_Board", bg="cyan", fg="black", command=draw_square) Board_Button.grid(padx=2, pady=2, row=1, column=11, sticky='nsew') root.mainloop()
关键修改点
- 复用绑定好的RawTurtle实例:删除
draw_square中新建turtle.Turtle()的代码,直接用已创建的draw实例绘图,确保在指定Canvas上渲染。 - 调整界面尺寸:修改窗口和Canvas的尺寸,避免绘图区域被截断,给Canvas设置白色背景提升绘图可见度。
- 优化绘图体验:添加
penup()、goto()和home()方法,让正方形居中显示,绘图后海龟回到初始位置,支持重复点击绘图。 - 统一主题颜色:给每个颜色窗口的RawTurtle设置对应颜色,明确区分不同窗口功能。
内容的提问来源于stack exchange,提问作者TheSIlentWarrior
相关产品推荐
相关产品推荐

