Найти - Пользователи
Полная версия: Простая ошибка новичка (передача данных из одной функции в другую)
Начало » Python для новичков » Простая ошибка новичка (передача данных из одной функции в другую)
1
Ubhra
Добрый день.
Есть 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, разве они не должны быть доступны при повторном использовании?
sergeek
Ubhra
Если я только что определил переменные click_x, click_y, разве они не должны быть доступны при повторном использовании?
нет, разберитесь с областью видимости переменных:

Ubhra
Почти разобрался. Но без примеров сложновато. И передать переменную так и не удалось.
Soteric
def first():
foo = 5

def second():
foo = 8
Переменные определенные внутри функции называются локальными. За пределами функции они перестают существовать. foo в функции first и foo в функции second - это две разные переменные, у которых просто совпало имя, и которые за пределами их функций никто не знает. Это как Иван из Питера и Иван из Москвы - два разных человека.
sergeek
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")
Ubhra
Спасибо.
А для чего это
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)
Даже при клике в одно и то же место выдает разные результаты.
sergeek
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 отнимается
Ubhra
Решил просто проверить координаты без создания объектов, только выпадающее меню на 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()
Берет координаты не холста а окна экрана.
4kpt
Ubhra
Эта тема касается GUI. Напиши вопрос там, и тебе обязательно ответят. Я во всяком случае не поленюсь. А тут мне лень…. Хотя эта проблема решается просто…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB