Найти - Пользователи
Полная версия: Открыть меню под курсором в Tkinter. Задать координаты меню
Начало » GUI » Открыть меню под курсором в Tkinter. Задать координаты меню
1
content
Помогите пожалуйста нубу исправить ошибку:
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
надо чтоб меню открывалось под курсорм вместе с главным окном
или вот тут что не так в передпоследней строке:
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()
4kpt_II
Строка просто лишняя. На тот момент 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.
content
а можно как то заставить меню появляться вместе с главным окном сразу(по запуску скрипта) под курсорм.
то есть: запускаю .py файл - под курсором открывается меню ?
4kpt_II
Смотрите. Пишу еще раз. Без понятия, как это будет работать на 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. Будут вопросы - пишите.
content
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())) ?
4kpt_II
Ну конечно будет там ошибка… Исправьте
menu.post(queryMousePosition()[x], queryMousePosition()[y])

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