如何将turtle集成到tkinter界面

问题描述 投票:0回答:1

我试图将海龟屏幕添加到 tkinter 界面,但我不知道如何解决此错误:nonetype 对象没有属性 cget

该程序应该在左侧有海龟屏幕,在右侧有用于更改颜色、画笔大小、绘制形状的按钮以及保存和退出功能(尚未运行)。

代码:


import tkinter as tk
from tkinter import *
import turtle
from turtle import TurtleScreen, RawTurtle

menu=Tk()
menu.title('Paint')


#function for chosinf color when drawing shapes

def colorfill () :
    global cc
    if cc=='black' : turtle.color(cc,'grey')
    if cc=='red' : turtle.color (cc,'tomato')
    if cc=='orange' : turtle.color(cc,'')
    if cc=='yellow' : turtle.color (cc,'lemonchiffon')
    if cc=='green' : turtle.color (cc,'lightgreen')
    if cc=='blue' : turtle.color (cc,'lightblue')
    if cc=='purple' : turtle.color (cc,'plum')
    if cc=='pink' :turtle.color (cc,'lightpink')

#turtle actions
def draw(x, y):
    turtle.ondrag(None)
    turtle.down()
    turtle.goto(x, y)
    turtle.up()
    screen.update()
    turtle.ondrag(draw)
def move(x, y): 
    screen.onscreenclick(None)
    turtle.goto(x, y)
    screen.update()
    screen.onclick(move)
def main () :
    turtle.ondrag(draw)
    screen.onclick(move)
    screen.update()



canvas=tk.Canvas(menu,width=500, height=500).grid(column=6,rowspan=14)
frame = tk.Frame(menu).grid( column=6, rowspan=14 )




#menu for colors and shapes

#spacers
filler1=Label(menu,width=10).grid(column=2,row=0)
filler2=Label(menu,width=10).grid(column=0,row=0)
filler3=Label(menu,width=10).grid(column=4,row=0)
filler4=Label(menu,width=10).grid(column=2,row=15)


#color buttons
lc=Label(menu,text='colors').grid(column=1, row=0)

def red() :
    global cc
    cc='red'
    turtle.pencolor('red')
bred = Button ( 
   menu,
   bg='red',
   width=10,
   command=red
   ).grid(column=1, row=1)

def orng() :
    global cc
    cc='orange'
    turtle.pencolor('orange')
borng = Button ( 
   menu,
   bg='orange',
   width=10,
   command=orng
   ).grid(column=1, row=2)

def yellow() :
    global cc
    cc='yellow'
    turtle.pencolor('yellow')
byellow = Button ( 
   menu,
   bg='yellow',
   width=10,
   command=yellow
   ).grid(column=1, row=3)

def green() :
    global cc
    cc='green'
    turtle.pencolor('green')
bgreen = Button ( 
   menu,
   bg='green',
   width=10,
   command=green
   ).grid(column=1, row=4)

def blue() :
    global cc
    cc='blue'
    turtle.pencolor('blue')
bblue = Button ( 
   menu,
   bg='blue',
   width=10,
   command=blue
   ).grid(column=1, row=5)

def purp() :
    global cc
    cc='purple'
    turtle.pencolor('purple')
bpurp = Button ( 
   menu,
   bg='purple',
   width=10,
   command=purp
   ).grid(column=1, row=6)

def pink() :
    global cc
    cc='pink'
    turtle.pencolor('pink')
bpink = Button ( 
   menu,
   bg='pink',
   width=10,
   command=pink
   ).grid(column=1, row=7)

def black() :
    global cc
    cc='black'
    turtle.pencolor('black')
bblack = Button ( 
   menu,
   bg='black',
   width=10,
   command=black
   ).grid(column=1, row=8)

def white() :
    global cc
    cc='white'
    turtle.pencolor('white')
bblack = Button ( 
   menu,
   text='eraser',
   bg='white',
   width=10,
   command=white
   ).grid(column=1, row=9)


#brush size buttons
lz=Label(menu,text='brush size').grid(column=1,row=10)

def size1 () :
    turtle.pensize(2)
b1= Button (
    menu,
    text='thin',
    width=10,
    command=size1
    ).grid(column=1, row=11)

def size2 () :
    turtle.pensize(5)
b2= Button (
    menu,
    text='small',
    width=10,
    command=size2
    ).grid(column=1, row=12)

def size3 () :
    turtle.pensize(8)
b3= Button (
    menu,
    text='medium',
    width=10,
    command=size3
    ).grid(column=1, row=13)

def size4 () :
    turtle.pensize(12)
b1= Button (
    menu,
    text='big',
    width=10,
    command=size4
    ).grid(column=1, row=14)


#shape buttons
ls=Label(menu,text='stamps').grid(column=3, row=0)

bdraw = Button ( 
   menu,
   text='pen',
   width=10,
   command=main
   ).grid(column=3, row=1)

def triangle (x,y) :
    turtle.goto(x,y)
    colorfill()
    turtle.pendown()
    turtle.begin_fill()
    for i in range(3):
        turtle.forward(70)
        turtle.left(360 / 3)
    turtle.end_fill()
    turtle.penup()
def postriangle () :
    turtle.onscreenclick(triangle)
btriangle = Button ( 
   menu,
   text='triangle',
   width=10,
   command=postriangle
   ).grid(column=3, row=2)

def square (x,y) :
    turtle.goto(x,y)
    colorfill()
    turtle.pendown()
    turtle.begin_fill()
    for i in range(4):
        turtle.forward(70)
        turtle.left(360 / 4)
    turtle.end_fill()
    turtle.penup()
def possqr () :
    turtle.onscreenclick(square)
bsquare = Button ( 
   menu,
   text='square',
   width=10,
   command=possqr
   ).grid(column=3, row=3)

def pentagon (x,y) :
    turtle.goto(x,y)
    colorfill()
    turtle.pendown()
    turtle.begin_fill()
    for i in range(5):
        turtle.forward(70)
        turtle.left(360 / 5)
    turtle.end_fill()
    turtle.penup()
def pospent () :
    turtle.onscreenclick(pentagon)
bpentagon = Button ( 
   menu,
   text='pentagon',
   width=10,
   command=pospent
   ).grid(column=3, row=4)

def hexagon (x,y) :
    turtle.goto(x,y)
    colorfill()
    turtle.pendown()
    turtle.begin_fill()
    for i in range(6):
        turtle.forward(70)
        turtle.left(360 / 6)
    turtle.end_fill()
    turtle.penup()
def poshex () :
    turtle.onscreenclick(hexagon)
bhexagon = Button ( 
   menu,
   text='hexagon',
   width=10,
   command=poshex
   ).grid(column=3, row=5)

def circlex (x,y) :
    turtle.goto(x,y)
    colorfill()
    turtle.pendown()
    turtle.begin_fill()
    for i in range(180):
        turtle.forward(2)
        turtle.left(360 / 180)
    
    turtle.end_fill()
    turtle.penup()
def poscircle () :
    turtle.onscreenclick(circlex)
bcircle = Button ( 
   menu,
   text='circle',
   width=10,
   command=poscircle
   ).grid(column=3, row=6)


#extra buttons
lp=Label(menu,text='actions').grid(column=3,row=8)
bcls = Button ( 
   menu,
   text='erase drawing',
   width=10
   ).grid(column=3, row=9)
bsave = Button ( 
   menu,
   text='save drawing',
   width=10
   ).grid(column=3, row=10)

screen = TurtleScreen(canvas)
screen.tracer(False)

pen_color = 'black'

turtle = RawTurtle(screen)
turtle.hideturtle()
turtle.shape("circle")
turtle.penup()
turtle.pensize(5)
turtle.color(pen_color, screen.bgcolor())
turtle.ondrag(draw)

screen.onclick(move)
screen.update()
screen.mainloop()

错误可能来自第 328 行: screen = TurtleScreen(canvas) ,这就是程序似乎停止的地方。我不确定出了什么问题

python tkinter turtle-graphics
1个回答
0
投票

在这里你认为你创建了一个

Canvas
对象:

canvas=tk.Canvas(menu,width=500, height=500).grid(column=6,rowspan=14)

tk.Canvas(menu,width=500, height=500)
是一个
Canvas
对象。但是调试你的代码。它的
.grid(column=6,rowspan=14)
方法返回
None

然后使用这个

None
值:

screen = TurtleScreen(canvas)

你的程序在这一行失败了。

简单改变

canvas=tk.Canvas(menu,width=500, height=500).grid(column=6,rowspan=14)

canvas=tk.Canvas(menu,width=500, height=500)

.

© www.soinside.com 2019 - 2024. All rights reserved.