Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 13, 2012 13:28:47

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Добрый день.
Есть canvas. Правым кликом вызываю контекстное меню под под курсором:

def activate_flash_menu(event):
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
Далее создаю прямоугольник по тем же координатам.
def obj_srv():
    img_srv_x = click_x
    img_srv_y = click_y
    canv.create_rectangle(img_srv_x,img_srv_y,img_srv_x+20,img_srv_y+30,fill="white",outline="blue")
Если привязывать по конкретным координатам, то все отлично, но при попытке использовать уже полученные по клику, выдает ошибку:
Exception in Tkinter callback
Traceback (most recent call last):
File “C:\Python32\lib\tkinter\__init__.py”, line 1399, in __call__
return self.func(*args)
File “C:\Documents and Settings\mihail\Рабочий стол\prj\модуль1.py”, line 42, in obj_srv
img_srv_x = click_x
NameError: global name ‘click_x’ is not defined
Если я только что определил переменные click_x, click_y, разве они не должны быть доступны при повторном использовании?



Отредактировано Ubhra (Ноя. 13, 2012 14:45:47)

Офлайн

#2 Ноя. 13, 2012 16:19:41

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Ubhra
Если я только что определил переменные click_x, click_y, разве они не должны быть доступны при повторном использовании?
нет, разберитесь с областью видимости переменных:

Офлайн

#3 Ноя. 13, 2012 17:25:58

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Почти разобрался. Но без примеров сложновато. И передать переменную так и не удалось.



Офлайн

#4 Ноя. 13, 2012 18:13:01

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

def first():
foo = 5

def second():
foo = 8
Переменные определенные внутри функции называются локальными. За пределами функции они перестают существовать. foo в функции first и foo в функции second - это две разные переменные, у которых просто совпало имя, и которые за пределами их функций никто не знает. Это как Иван из Питера и Иван из Москвы - два разных человека.



Офлайн

#5 Ноя. 13, 2012 18:17:19

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

def obj_srv(click_x, click_y):
    img_srv_x = click_x 
    img_srv_y = click_y 
    canv.create_rectangle(img_srv_x,img_srv_y,img_srv_x+20,img_srv_y+30,fill="white",outline="blue")
def activate_flash_menu(event):
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
    return click_x, click_y
    
def main():
    click_x, click_y = activate_flash_menu(some_event)
    obj_srv(click_x, click_y)
или
click_x = click_y = None
def activate_flash_menu(event):
    global click_x, click_y
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
def obj_srv():
    img_srv_x = click_x
    img_srv_y = click_y
    canv.create_rectangle(img_srv_x,img_srv_y,img_srv_x+20,img_srv_y+30,fill="white",outline="blue")

Офлайн

#6 Ноя. 14, 2012 07:49:34

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Спасибо.
А для чего это

click_x = click_y = None
И создает прямоугольник не под кликом, а намного ниже.
def activate_flash_menu(event):
    global click_x, click_y
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
def obj_srv():
    canv.create_rectangle(click_x-50,click_y-50,click_x,click_y,fill="white",outline="blue")

Попробовал отследить координаты
def activate_flash_menu(event):
    global click_x, click_y
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
    print(click_x, click_y)
Даже при клике в одно и то же место выдает разные результаты.



Отредактировано Ubhra (Ноя. 14, 2012 08:40:38)

Офлайн

#7 Ноя. 14, 2012 08:49:23

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

click_x = click_y = None
присваивает значение None переменным в глобальном неймспейсе чтобы можно было получить доступ к ним из функции.
global click_x, click_y
дает директиву что click_x, и click_y, это глобальные переменные, иначе
click_x, click_y = canv.winfo_pointerxy()
присвоит их в локальном для функции неймспейсе
и в
def obj_srv():
    canv.create_rectangle(click_x-50,click_y-50,click_x,click_y,fill="white",outline="blue")
у click_x, и click_y, так и останется значение None
Ubhra
И создает прямоугольник не под кликом, а намного ниже.
я не умею в Tkinter, посмотри какие там координаты поступают, может надо их поменять, мне кажется первые две должны быть верхним левым углом, а у тебя там 50 отнимается

Офлайн

#8 Ноя. 14, 2012 09:38:07

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Решил просто проверить координаты без создания объектов, только выпадающее меню на canvas.

global click_x, click_y
click_x = click_y = None
def activate_flash_menu(event):
    click_x = click_y = 0
    click_x, click_y = canv.winfo_pointerxy()
    flash_menu.tk_popup(click_x, click_y)
    print(click_x, click_y)
В итоге кликаю по холсту в одно и то же место (левый верхний угол), и получаю координаты 300 400.
Тоесть сам холст сместился куда то (возможно). Но ведь по этим координатам выпадает меню, и оно выпадает строго под курсором.
Вроде понял почему сместилось, но не понятно как такое случилось.
click_x, click_y = canv.winfo_pointerxy()
Берет координаты не холста а окна экрана.



Отредактировано Ubhra (Ноя. 14, 2012 09:40:44)

Офлайн

#9 Ноя. 14, 2012 20:05:32

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Простая ошибка новичка (передача данных из одной функции в другую)

Ubhra
Эта тема касается GUI. Напиши вопрос там, и тебе обязательно ответят. Я во всяком случае не поленюсь. А тут мне лень…. Хотя эта проблема решается просто…



Отредактировано 4kpt (Ноя. 14, 2012 21:03:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version