You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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()

关键修改点

  1. 复用绑定好的RawTurtle实例:删除draw_square中新建turtle.Turtle()的代码,直接用已创建的draw实例绘图,确保在指定Canvas上渲染。
  2. 调整界面尺寸:修改窗口和Canvas的尺寸,避免绘图区域被截断,给Canvas设置白色背景提升绘图可见度。
  3. 优化绘图体验:添加penup()、goto()和home()方法,让正方形居中显示,绘图后海龟回到初始位置,支持重复点击绘图。
  4. 统一主题颜色:给每个颜色窗口的RawTurtle设置对应颜色,明确区分不同窗口功能。

内容的提问来源于stack exchange,提问作者TheSIlentWarrior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:45:13