我正试图在海龟屏幕上显示文字。尽我所知,这涉及使用 onpresskey 进行编写但是,如果是这种情况,我不知道输入什么作为'密钥'(因此我的代码中的问号)。
import turtle
class Graphics:
def __init__(self):
# window
self.win = turtle.Screen()
self.win.setup(width=1280, height=800)
self.win.bgcolor('DimGrey')
self.onkeypress(self.text_xy, ???)
self.listen()
# tracer #1
self.tracer = turtle.Turtle()
self.tracer.hideturtle()
self.tracer.speed(0)
...
def text_xy(self):
self.win.onkeypress(self.tracer.write(???, font=("Arial", 12, "bold",), /
align="left"))
Graphics()
turtle.mainloop()
我能想到的唯一方法就是为每一个有效的密钥(这将是所有字母加0-9)来做。关于它必须有一个更明智的方法。
答案 0 :(得分:1)
这是我原来答案的更新版本。它仍然做得有点像以前做的那样,但现在以一种稍微不那么丑陋的方式做到了这一点,没有检查堆栈帧 - 感谢@Dan D的一些建设性意见。
此版本使用turtle.onkeypress()
事件处理程序注册处理按键的函数,完成所需而不使用。相反,它将自己的处理程序直接附加到较低级别的底层tkinter Canvas
对象。在该级别,所有事件处理程序函数自动接收event
参数,可以检查它是否是感兴趣的键盘事件。
警告:可能不使用turtle
' s onkeypress()
会产生一些副作用,因为这会绕过模块正常处理的方式事件,虽然我没有观察到任何事件,但是,根据您正在做的事情,您的里程可能会有所不同。
import turtle
class Graphics:
def __init__(self):
# window
self.win = turtle.Screen()
self.win.setup(width=1280, height=800)
self.win.bgcolor('DimGrey')
self.font = ("Arial", 12, "bold",)
self.win.cv.bind('<KeyPress>', self.text_xy)
self.win.listen()
# tracer #1
self.tracer = turtle.Turtle()
self.tracer.hideturtle()
self.tracer.speed(0)
def text_xy(self, event):
if event.char != '': # Not a modifier?
self.tracer.write(event.char, move=True, font=self.font,
align="left")
Graphics()
turtle.mainloop()
答案 1 :(得分:1)
在乌龟屏幕上书写文字本身并不与onpresskey
交织在一起。您可以简单地将文本写入屏幕,在单击键时写入文本,在单击鼠标按钮时写入文本等等。以下是一些示例代码可以完成所有三个:
from turtle import Turtle, Screen
FONT = ("Arial", 14, "bold")
class Graphics:
def __init__(self):
self.screen = Screen()
self.screen.setup(width=1280, height=800)
self.screen.listen()
self.turtle = Turtle(visible=False)
self.turtle.speed('fastest')
def text_at_xy(self, x, y, text):
self.turtle.penup()
self.turtle.goto(x, y)
self.turtle.write(text, font=FONT)
def text_onkey(self, x, y, text, key):
self.screen.onkey(lambda x=x, y=y, text=text: self.text_at_xy(x, y, text), key)
def text_onmouseclick(self, text):
self.screen.onclick(lambda x, y, text=text: self.text_at_xy(x, y, text))
graphics = Graphics()
graphics.text_at_xy(100, 100, "Static Text") # just print text at location
graphics.text_onkey(-100, -100, "On Key Text", "j") # print text at location when you type "j"
graphics.text_onmouseclick("On Mouse Click Text") # print text whereever mouse is clicked
graphics.screen.mainloop()
在@ martineau的工作和@DanD的评论的基础上,我们可以通过以下方式持续打字:
from turtle import Turtle, Screen
FONT = ("Arial", 14, "bold")
class Graphics:
def __init__(self):
self.screen = Screen()
self.screen.setup(width=1280, height=800)
self.screen.listen()
self.turtle = Turtle(visible=False)
self.turtle.speed('fastest')
self.screen.cv.bind("<KeyPress>", lambda event: self.text_xy(event.char))
def text_xy(self, char):
self.turtle.penup()
self.turtle.write(char, move=True, font=FONT)
graphics = Graphics()
graphics.screen.mainloop()
请注意,我们正在将turtle API下放到tkinter基础中以实现此目的。