Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Открыть меню под курсором в Tkinter. Задать координаты меню [RSS Feed]

#1 Июль 29, 2014 23:42:33

content
Зарегистрирован: 2014-07-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

Помогите пожалуйста нубу исправить ошибку:

import sys
sys.argv=["Main"]
from tkinter import Tk, Frame, Menu
root = Tk()
# Команды
def command1():
    root.destroy()
def command2():
    root.destroy()
# Определяем положение курсора
class POINT(Structure):
    _fields_ = [("x", c_ulong), ("y", c_ulong)]
def queryMousePosition():
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return { "x": pt.x, "y": pt.y}
root.overrideredirect (1)
#  Создаем меню
menu = Menu(root, tearoff=0)
menu.add_command(label="LABEL1", command=command1)
menu.add_command(label="LABEL2", command=command2)
# Создаем canvas
frame = Frame(root, width=0, height=0)
frame.pack()
# Открываем меню
menu.post(%(x)s,%(y)s % (queryMousePosition()))
root.mainloop()

Ошибка в cтроке:
menu.post(%(x)s,%(y)s % (queryMousePosition()))

Отредактировано content (Июль 30, 2014 10:37:23)

Офлайн

#2 Июль 30, 2014 08:40:50

content
Зарегистрирован: 2014-07-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

надо чтоб меню открывалось под курсорм вместе с главным окном
или вот тут что не так в передпоследней строке:
menu.post(x_root, y_root)

import sys
sys.argv=["Main"]
from tkinter import Tk, Frame, Menu
root = Tk()
def hello():
    print ("hello!")
# create a popup menu
menu = Menu(root, tearoff=0)
menu.add_command(label="Undo", command=hello)
menu.add_command(label="Redo", command=hello)
# create a canvas
frame = Frame(root, width=512, height=512)
frame.pack()
def popup(event):
    menu.post(event.x_root, event.y_root)
# attach popup to canvas
frame.bind("<Button-3>", popup)
menu.post(x_root, y_root)
root.mainloop()

Отредактировано content (Июль 30, 2014 08:43:58)

Офлайн

#3 Июль 30, 2014 15:18:44

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

Строка просто лишняя. На тот момент event.x и event.y еще не существует. Они появляются внутри callback функции с передачей аргумента event по-умолчанию.
Держите:

import tkinter
root = tkinter.Tk()
#
def hello():
    print ("hello!")
#
# create a popup menu
menu = tkinter.Menu(root, tearoff=0)
menu.add_command(label="Undo", command=hello)
menu.add_command(label="Redo", command=hello)
# create a canvas
frame = tkinter.Frame(root, width=512, height=512)
frame.pack()
#
def popup(event):
    menu.post(event.x_root, event.y_root)
#
# attach popup to canvas
frame.bind("<Button-3>", popup)
#menu.post(x_root, y_root)
root.mainloop()

При нажатии правой кнопки - появляется меню Undo - Redo.

Отредактировано 4kpt_II (Июль 30, 2014 15:39:19)

Офлайн

#4 Июль 31, 2014 12:42:19

content
Зарегистрирован: 2014-07-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

а можно как то заставить меню появляться вместе с главным окном сразу(по запуску скрипта) под курсорм.
то есть: запускаю .py файл - под курсором открывается меню ?

Отредактировано content (Июль 31, 2014 12:53:01)

Офлайн

#5 Июль 31, 2014 15:19:39

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

Смотрите. Пишу еще раз. Без понятия, как это будет работать на windows так как такого рода продуктами не пользуюсь, но предположительно нужно как-то так

import Tkinter
#
root = Tkinter.Tk()
#
def hello():
    print ("hello!")
#
# create a popup menu
menu = Tkinter.Menu(root, tearoff=0)
menu.add_command(label="Undo", command=hello)
menu.add_command(label="Redo", command=hello)
#
def popup(position):
        menu.post(*position)
#
menu.post(400, 400)  # сюда Вы вставляете позицию мышки в данный момент (windll)
root.withdraw()  # скрыть окно
root.mainloop()

P.S. Будут вопросы - пишите.

Отредактировано 4kpt_II (Июль 31, 2014 15:21:49)

Офлайн

#6 Июль 31, 2014 16:40:46

content
Зарегистрирован: 2014-07-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

4kpt_II
Смотрите. Пишу еще раз…
на winde работает
, непонятно только как вписать позицию курсора в данный момент
вот здесь в queryMousePosition() определяется положение курсора:
import sys
sys.argv=["Main"]
from tkinter import Tk, Frame, Menu
root = Tk()
# Команды
def command1():
    root.destroy()
def command2():
    root.destroy()
# Определяем положение курсора
class POINT(Structure):
    _fields_ = [("x", c_ulong), ("y", c_ulong)]
def queryMousePosition():
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return { "x": pt.x, "y": pt.y}
root.overrideredirect (1)
#  Создаем меню
menu = Menu(root, tearoff=0)
menu.add_command(label="LABEL1", command=command1)
menu.add_command(label="LABEL2", command=command2)
# Создаем canvas
frame = Frame(root, width=0, height=0)
frame.pack()
# Открываем меню
menu.post(%(x)s,%(y)s % (queryMousePosition()))
root.mainloop()
и где-то здесь ошибка:
menu.post(%(x)s,%(y)s % (queryMousePosition())) ?

Отредактировано content (Июль 31, 2014 16:44:25)

Офлайн

#7 Июль 31, 2014 16:53:31

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Открыть меню под курсором в Tkinter. Задать координаты меню

Ну конечно будет там ошибка… Исправьте

menu.post(queryMousePosition()[x], queryMousePosition()[y])

menu.post() принимает два числа - позиция по x и позиция по y.
Вы передаете строку. Это не есть верно.
Я не знаю, что возвращает queryMousePosition(), но будем надеяться, что целое число.

Офлайн

  • Начало
  • » GUI
  • » Открыть меню под курсором в Tkinter. Задать координаты меню[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version