如何将海龟屏幕集成到 tkinter 屏幕中?

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

我无法让 tkinter 屏幕中的乌龟工作 它应该是一个绘画应用程序,但是当我尝试实现该界面时,海龟仍然出现,而应该在界面中的那个应用程序不起作用,现在它根本没有出现

代码:


import tkinter as tk
from tkinter import *
import turtle

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

frame = tk.Frame(menu).grid( column=8, sticky="nsew")
canvas=tk.Canvas(menu,width=500, height=100).grid(column=6,sticky=N+E+W)

turtle.tracer(False)
turtle.hideturtle()


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



t = turtle.Turtle()
t.shape("circle")
t.fillcolor("")
t.up()


t.pencolor('black')
cc='black'
t.pensize(5)
t.turtlesize(1000000, 1000000)
ts = turtle.getscreen()  



canvas = tk.Canvas(menu)
canvas.config(width=600, height=600)
#canvas.pack(side=LEFT)
screen = turtle.TurtleScreen(canvas)



#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'
    t.pencolor('red')
bred = Button ( 
   menu,
   bg='red',
   width=10,
   command=red
   ).grid(column=1, row=1)

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

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

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

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

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

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

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

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



t.ondrag(draw)
turtle.onscreenclick(move)
turtle.update()
turtle.listen()
turtle.done()
menu.mainloop()

我尝试过,但 tkinter 屏幕中的海龟不起作用或不显示,但海龟屏幕仍然弹出

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

turtle
使用
tkinter
创建窗口(自己的
Tk()
)并运行它(自己的
mainloop()
),并且
tkinter
应该只有一个
Tk()
和一个
mainloop()
- 所以你不必创建它们

您可以使用

访问海龟窗口
root = turtle.getcanvas().winfo_toplevel()

稍后您可以使用它来添加小部件。

因为

turtle already used 
pack()
to put
Canvas
so you can't use
grid()
- but you can use
pack()
to put
Frame()
in
root
and later use
grid()`可以将其他小部件放入此框架中。

root = turtle.getcanvas().winfo_toplevel()

frame = tk.Frame(root)
frame.pack()

tk.Label(frame, text='COLORS').grid(column=1, row=0)

tk.Button(frame, bg='red', width=10, command=lambda:set_pen_color('red')   ).grid(column=1, row=1)

最小工作代码:

import turtle
import tkinter as tk   # PEP8: `import *` is not preferred

# --- functions ---  # PEP8: all functions before main code

def draw(x, y):
    t.ondrag(None)
    t.down()
    t.goto(x, y)
    t.up()
    turtle.update()
    t.ondrag(draw)

def move(x, y): 
    turtle.onscreenclick(None)
    t.goto(x, y)
    turtle.onscreenclick(move)
    turtle.update()

def set_pen_color(color) :
    global pen_color
    pen_color = color
    t.pencolor(color)

# --- main ---

pen_color = 'black'

t = turtle.Turtle()
#t.hideturtle()
t.shape("circle")
t.fillcolor("")
t.up()
t.pensize(5)
t.turtlesize(1000000, 1000000)
t.ondrag(draw)

t.pencolor(pen_color)

# --- add widgets ---

# access to turtle's window
root = turtle.getcanvas().winfo_toplevel()

frame = tk.Frame(root)
frame.pack()

tk.Label(frame, text='COLORS').grid(column=1, row=0)

tk.Button(frame, bg='red',    width=10, command=lambda:set_pen_color('red')   ).grid(column=1, row=1)
tk.Button(frame, bg='orange', width=10, command=lambda:set_pen_color('orange')).grid(column=1, row=2)
tk.Button(frame, bg='yellow', width=10, command=lambda:set_pen_color('yellow')).grid(column=1, row=3)
tk.Button(frame, bg='green',  width=10, command=lambda:set_pen_color('green') ).grid(column=1, row=4)
tk.Button(frame, bg='purple', width=10, command=lambda:set_pen_color('purple')).grid(column=1, row=5)
tk.Button(frame, bg='pink',   width=10, command=lambda:set_pen_color('pink')  ).grid(column=1, row=6)
tk.Button(frame, bg='black',  width=10, command=lambda:set_pen_color('black') ).grid(column=1, row=7)
tk.Button(frame, bg='white',  width=10, command=lambda:set_pen_color('white') ).grid(column=1, row=8)

# ---

turtle.tracer(False)
turtle.onscreenclick(move)
turtle.update()
turtle.listen()
turtle.done()    # this runs `tkinter.mainloop()`

PEP 8 -- Python 代码风格指南

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