Почему этот патч обезьяны не работает для черепахи питона?

Итак, я пытаюсь исправить функцию onkey в черепахе, чтобы она вызывала функцию с нажатием кнопки, а не просто вызывала ее без аргументов. Я использую тестер строк, чтобы проверить, работает ли он, но похоже, что исходные функции никогда не менялись. Может кто-нибудь объяснить, что я делаю неправильно?

from threading import Thread
from time import sleep
from turtle import *

def NEWonkeypress(self, fun, key=None):
    if fun is None:
        if key in self._keys:
            self._keys.remove(key)
    elif key is not None and key not in self._keys:
        self._keys.append(key)
    self._onkeypress(fun, key)

def _NEWonkeypress(self, fun, key=None):
    if fun is None:
        if key is None:
            self.cv.unbind("<KeyPress>", None)
        else:
            self.cv.unbind("<KeyPress-%s>" % key, None)
    else:
        def eventfun(event):
            fun("tester")
        if key is None:
            self.cv.bind("<KeyPress>", eventfun)
        else:
            self.cv.bind("<KeyPress-%s>" % key, eventfun)

Turtle.onkeypress = NEWonkeypress
Turtle._onkeypress = _NEWonkeypress

board = Turtle()
screen = board.getscreen()
screen.tracer(0, 0)
temp = Turtle()

def textinput(testing):
    print(testing)

def getroomname(option): 
    global temp
    global board
    #Box
    temp.fillcolor("White")
    temp.width(10)
    temp.goto(-150, -60)
    temp.down()
    temp.begin_fill()
    for x in range(2):
        temp.forward(300)
        temp.left(90)
        temp.forward(120)
        temp.left(90)
    temp.end_fill()
    temp.up()
    temp.goto(0, 100)
    screen.update()
    #Box
    temp.goto(0, -60)
    screen.onkeypress(textinput)
    listen()
    

getroomname(0)
mainloop()

(Это всего лишь фрагмент основного кода, так что не беспокойтесь о случайных квадратах, которые он рисует в пространстве)


person MichaelT572    schedule 09.07.2020    source источник


Ответы (1)


На самом деле это проще, чем вы это делаете, нам просто нужно сделать это немного по-другому. Когда вы запускаете приведенный ниже код, любая клавиша, которую вы набираете, должна пройти через систему событий черепахи и быть напечатана на консоли:

from functools import partial
from turtle import Screen, Turtle

def getroomname():
    temp.penup()
    temp.goto(-150, -60)
    temp.pendown()
    temp.begin_fill()

    for _ in range(2):
        temp.forward(300)
        temp.left(90)
        temp.forward(120)
        temp.left(90)

    temp.end_fill()

def _onkeypress(self, fun, key=None):
    if fun is None:
        if key is None:
            self.cv.unbind("<KeyPress>", None)
        else:
            self.cv.unbind("<KeyPress-%s>" % key, None)
    else:
        def eventfun(event):
            fun(event.char)

        if key is None:
            self.cv.bind("<KeyPress>", eventfun)
        else:
            self.cv.bind("<KeyPress-%s>" % key, eventfun)

def keyinput(key):
    print(key)

screen = Screen()
screen._onkeypress = partial(_onkeypress, screen)  # monkey patch (protected access)

temp = Turtle()
temp.speed('fastest')
temp.fillcolor("white")
temp.width(10)

getroomname()

screen.onkeypress(keyinput)
screen.listen()
screen.mainloop()

Я упростил ваш несвязанный код. Однако вы неправильно используете global, поэтому я предлагаю вам просмотреть учебник по этому вопросу, прежде чем вы столкнетесь с проблемами. Кроме того, вы сделали from turtle import *, но затем сделали def textinput(...), где textinput также является методом черепахи Python 3, поэтому избегайте выполнения from turtle import *, чтобы избежать еще больших проблем.

person cdlane    schedule 09.07.2020