Почему этот патч обезьяны не работает для python черепах? - PullRequest
0 голосов
/ 09 июля 2020

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

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()

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

1 Ответ

0 голосов
/ 09 июля 2020

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

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 *, чтобы избежать еще больших проблем.

...