Как я могу использовать значение события onscreenclick (func) вне функции func? - PullRequest
1 голос
/ 04 апреля 2019

Используя Turtle, я хочу иметь возможность создать переменную, содержащую позицию на экране, на которую нажал пользователь.

Я обнаружил, что можно распечатать местоположение щелчка, используя следующуюcode:

import turtle

def find_click_pos(x, y):
    print('{0}, {1}'.format(x, y))

def main():
    turtle.onscreenclick(find_click_pos)

main()

turtle.mainloop()

Проблема в том, что координаты x, y определены только в функции find_click_pos, и, насколько я знаю, их нельзя использовать где-либо еще в функции.без использования глобальных переменных (которых я бы хотел избежать любой ценой).

Есть ли способ получить значение .onscreenclick() без отправки его функции?Есть ли какая-либо другая функция turtle, которая делает то, что я хочу, что мне не хватает?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Функция обратного вызова, которую вы передаете onscreenclick, может делать все, что захочет, со значениями x и y, с которыми она вызывается. Не совсем понятно, что вы хотите сделать, но довольно сложно представить, что вы не можете найти способ сделать это в функции.

Если вы беспокоитесь о том, как можно передавать значения без использования глобальных переменных, возможно, лучшим способом было бы сделать так, чтобы обратный вызов был методом в классе, чтобы он мог назначать атрибуты, которые другие методы могут легко прочитать :

import turtle

class Foo:
    def __init__(self):
        self.click_x = 0  # initialize with dummy values
        self.click_y = 0
        turtle.ontimer(self.other_method, 1000)

    def click_cb(self, x, y):
        self.click_x = x
        self.click_y = y

    def other_method(self):
        print(self.click_x, self.click_y)
        turtle.ontimer(self.other_method, 1000)

foo = Foo()
turtle.onscreenclick(foo.click_cb)

turtle.mainloop()
0 голосов
/ 04 апреля 2019

Это кажется неправильным.Мне нравится объектное решение @ Blckknght (+1), но вы бы просто заменили глобальную переменную , содержащую экземпляр объекта, на глобальную переменную , связывающую позицию.

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

import turtle

def get_click_position(x=None, y=None, stash=[0, 0]):  # dangerous default value
    if x != None != y:
        stash[0:] = (x, y)

    return turtle.Vec2D(*stash)

def print_click_position():
    x, y = get_click_position()
    print('{0}, {1}'.format(x, y))

    turtle.ontimer(print_click_position, 1000)

turtle.onscreenclick(get_click_position)
print_click_position()

turtle.mainloop()

Позвоните get_click_position() без аргументов, если хотите узнать, что произошло последним кликом.Он будет возвращать этот результат до тех пор, пока не будет получен новый щелчок, когда get_click_position() вызывается как обработчик событий с аргументами.

...