如何用乌龟在文字上显示屏幕?

时间:2018-04-30 22:57:46

标签: python turtle-graphics

我正试图在海龟屏幕上显示文字。尽我所知,这涉及使用 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)来做。关于它必须有一个更明智的方法。

2 个答案:

答案 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基础中以实现此目的。