Как отобразить экран на текст с черепахой? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сделать отображение текста на экране, на экране черепахи. Насколько я могу судить, это включает запись с помощью 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 голосов
/ 01 мая 2018

Запись текста на экране черепахи по своей сути не переплетается с 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()

Обратите внимание, что для реализации этого мы опускаемся ниже API-интерфейса turtle в основу tkinter.

0 голосов
/ 01 мая 2018

Вот обновленная версия моего оригинального ответа. Он по-прежнему несколько хакерский, как раньше, но теперь делает это немного менее уродливо, без проверки стековых фреймов - благодаря некоторым конструктивным комментариям @Dan D.

Эта версия выполняет то, что вам нужно без , используя обработчик событий turtle.onkeypress(), чтобы зарегистрировать функцию для обработки нажатий клавиш. Вместо этого он присоединяет свой собственный обработчик непосредственно к нижележащему объекту tkinter Canvas. На этом уровне все функции обработчика событий автоматически получают аргумент event, и это можно проверить, чтобы узнать, является ли это интересным событием клавиатуры.

Предостережение: Возможно, что не использование turtle 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()
...