如何让RawTurtle在点击和拖动时进行绘制?

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

我正在尝试在 Turtle 和 Tkinter 中制作类似绘画的应用程序。当我只使用 Turtle 时,我制作了一个程序,可以让你通过单击和拖动自由绘图。然后我尝试制作一个界面,然后我切换到原始的 Turtle。现在,当我单击海龟时,它会移动,当我拖动海龟时,它会绘制,但当我单击并拖动时,它只会移动。我不知道如何解决它。

仅限 Turtle 中的第一个代码:

import turtle
turtle.tracer(False)
turtle.hideturtle()
   
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.pencolor('black')
t.fillcolor("")
t.up()


t.pensize(6)
t.turtlesize(1000000, 1000000)
ts = turtle.getscreen()
t.ondrag(draw)
turtle.onscreenclick(move)
turtle.update()
turtle.listen()
turtle.done()

使用 Turtle 和 Tkinter 编写代码:

import tkinter as tk
from functools import partial
from turtle import TurtleScreen, RawTurtle

def draw(x, y):
    turtle.ondrag(None)
    turtle.pendown()
    turtle.goto(x, y)
    turtle.penup()
    screen.update()
    turtle.ondrag(draw)

def move(x, y):
    screen.onclick(None)
    turtle.goto(x, y)
    screen.onclick(move)
    screen.update()


def set_color(color):
    global pen_color
    pen_color = color
    turtle.pencolor(color)
    screen.update()

# --- add widgets ---

root = tk.Tk()

canvas = tk.Canvas(root, width=500, height=500)
canvas.pack(side='right', expand=True, fill='both')

frame = tk.Frame(root)
frame.pack(side='left', fill='y')

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

tk.Button(frame, bg='red', width=10, command=partial(set_color, 'red')).grid(column=0, row=1)
tk.Button(frame, bg='yellow', width=10, command=partial(set_color, 'yellow')).grid(column=0, row=2)
tk.Button(frame, bg='green', width=10, command=partial(set_color, 'green')).grid(column=0, row=3)
tk.Button(frame, bg='blue', width=10, command=partial(set_color, 'blue')).grid(column=0, row=4)
tk.Button(frame, bg='black', width=10, command=partial(set_color, 'black')).grid(column=0, row=5)

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.listen()
screen.mainloop()

根据我的理解(我可能是错的。我刚刚开始学习python),listen函数应该是收集事件的函数。海龟完成功能应该在第一个版本中保持海龟警报,但在第二个版本中,

mainloop
,保持整个应用程序警报,我不能再使用完成了。我认为问题可能发生在这些函数的某个地方。

我尝试在不同的地方使用监听、更新和完成,但似乎没有任何改变(甚至刹车它也像以前一样工作)。

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

由于乌龟只有在单击时才会移动,因此我必须使乌龟与整个屏幕一样大。然后我尝试使用

使其不可见
turtle.hideturtle()

这不起作用,所以我在不改变画笔颜色或填充颜色的情况下让乌龟隐形了

新代码:

import tkinter as tk
from functools import partial
from turtle import TurtleScreen, RawTurtle, Shape

def draw(x, y):
    turtle.ondrag(None)
    turtle.pendown()
    turtle.goto(x, y)
    turtle.penup()
    screen.update()
    turtle.ondrag(draw)

def move(x, y):
    screen.onclick(None)
    turtle.goto(x, y)
    screen.onclick(move)
    screen.update()


def set_color(color):
    global pen_color
    pen_color = color
    turtle.pencolor(color)
    screen.update()

# --- add widgets ---

root = tk.Tk()

canvas = tk.Canvas(root, width=500, height=500)
canvas.pack(side='right', expand=True, fill='both')

frame = tk.Frame(root)
frame.pack(side='left', fill='y')

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

tk.Button(frame, bg='red', width=10, command=partial(set_color, 'red')).grid(column=0, row=1)
tk.Button(frame, bg='yellow', width=10, command=partial(set_color, 'yellow')).grid(column=0, row=2)
tk.Button(frame, bg='green', width=10, command=partial(set_color, 'green')).grid(column=0, row=3)
tk.Button(frame, bg='blue', width=10, command=partial(set_color, 'blue')).grid(column=0, row=4)
tk.Button(frame, bg='black', width=10, command=partial(set_color, 'black')).grid(column=0, row=5)

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


turtle = RawTurtle(screen)
#turtle.hideturtle()
turtle.shape("circle")
polygon = turtle.get_shapepoly()
fixed_color_turtle = Shape("compound")
fixed_color_turtle.addcomponent(polygon, "", "")
screen.register_shape('fixed', fixed_color_turtle)
turtle.shape("fixed")
turtle.penup()
turtle.pensize(5)
turtle.turtlesize(2000,2000)
turtle.ondrag(draw)
screen.onscreenclick(move)
screen.update()
screen.mainloop()

现在一切正常了,耶:)

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