Найти - Пользователи
Полная версия: Tkinter canvas определение координат
Начало » GUI » Tkinter canvas определение координат
1 2
Ubhra
При попытке вызвать меню ошибка.
def activate_flash_menu(event=None):
    click_x = event.x_canv
    click_y = event.y_canv
    e_x = event.x
    e_y = event.y
    flash_menu.tk_popup(click_x, click_y)
Traceback (most recent call last):
File “C:\Python32\lib\tkinter\__init__.py”, line 1399, in __call__
return self.func(*args)
File “H:\123.py”, line 10, in activate_flash_menu
click_x = event.x_canv
AttributeError: ‘Event’ object has no attribute ‘x_canv’

И немного не понятен синтаксис. Может какая специфическая IDE…
import Tkinter
root = Tkinter.Tk()
from tkinter import *
mainframe1 = Tk()
4kpt
Какой у тебя питон???
sp3
4kpt
Какой у тебя питон???
Ubhra
Traceback (most recent call last):
File “C:\Python32\lib\tkinter\__init__.py”, line 1399, in __call__
return self.func(*args)
File “H:\123.py”, line 10, in activate_flash_menu
click_x = event.x_canv
AttributeError: ‘Event’ object has no attribute ‘x_canv’

4kpt
sp3 На ошибку не смотрел. Не заметил…
4kpt
Ubhra
Господи… Замени слово Tkinter на tkinter. И root - это корневое окно на котором располагаются все виджеты (ты назвал его mainframe1).
Я просто явно указываю модуль, из которого использую методы класса (имя_модуля.имя_метода - например Tkinter.Burtton). Это позволяет мне называть переменные как я хочу. В твоем случае, когда ты делаешь from… твои имена переменных не должны пересекаться с именами модуля, который ты портанул, так как эти имена добавляются в пространство имен твоей программы.
поэтому строчку
click_x = event.x_canv
надо снова поменять на строчку
click_x = event.x_root
так как x_root это не моя прихоть, а зарегестрированное обращение к методу класса event…
4kpt
Я переписал код, учитывая что Вы работаете на 3. (У меня не стоит 3, но я думаю, что так правильно…)
import tkinter
root = tkinter.Tk()
root.geometry("400x400+100+100")
def create_obj(event):
    if event[2] == "oval":
        ov = canv.create_oval(event[0], event[1], event[0] + 40, event[1] + 40)
    if event[2] == "pol":
        pol = canv.create_rectangle(event[0], event[1], event[0] + 40, event[1] + 40)
def activate_flash_menu(event):
    posx =  event.x_root
    posy =  event.y_root
    x = event.x
    y = event.y
    menu = tkinter.Menu(root, tearoff = 0)
    menu.add_command(label = "Кружочек", command = lambda pos = (x, y, "oval"): create_obj(pos))
    menu.add_command(label = "Квадратик", command = lambda pos = (x, y, "pol"): create_obj(pos))
    menu.tk_popup(posx, posy)
canv = tkinter.Canvas(root, height = 200, width = 200, bg = "red")
canv.place(relx = 0.5, rely = 0.5, anchor = "center")
canv.bind("<Button-3>", activate_flash_menu)
root.mainloop()
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