Получение разных координат tkinter для одной и той же позиции мыши с разными привязками событий - PullRequest
0 голосов
/ 31 декабря 2018

Я разрабатываю приложение tkinter, которое позволяет перемещать карту по карте и перетаскивать ее, а также увеличивать и уменьшать масштаб с помощью колеса прокрутки.Пользовательский интерфейс также имеет более широкий раздел под основной картой, что делает приложение шире, чем просто объект Canvas для карты.

Однако я получаю разные координаты для местоположения событий щелчка и перетаскивания и колесика прокрутки: первые являются координатами внутри холста, как я и ожидал, тогда как последние имеют х-координата увеличена на количество отступов, добавленных более широким объектом внизу.

Вот минимальный рабочий пример (использование всего движения вместо простого нажатия и перетаскивания):

#!/usr/bin/env python3
import tkinter as tk


class MainCanvas(tk.Canvas):
    def __init__(self, tk_parent):
        super().__init__(tk_parent, height=200, width=200, bg="green")
        self.pack()
        self.bind("<Motion>",     self.print_move)
        self.bind("<MouseWheel>", self.print_scroll)  # For Mac
        self.bind("<Button-4>",   self.print_scroll)  # For Linux
        self.bind("<Button-5>",   self.print_scroll)  # For Linux

    def print_coords(self, name, event):
        print("{}: x: ({}, {}), y: ({}, {})".format(
            name,
            event.x, int(self.canvasx(event.x)),
            event.y, int(self.canvasy(event.y))))

    def print_move(self, event):
        self.print_coords("moving", event)

    def print_scroll(self, event):
        self.print_coords("scroll", event)


class Bottom(tk.Canvas):
    def __init__(self, tk_parent):
        super().__init__(tk_parent, height=5, width=500, bg="red")
        self.pack()


class GUI(tk.Frame):
    def __init__(self, tk_parent):
        super().__init__(tk_parent)
        self.pack()
        self.main = MainCanvas(self)
        self.bottom = Bottom(self)


if __name__ == "__main__":
    root = tk.Tk()
    gui = GUI(root)

    # Make an easy way to exit
    for char in "wWqQ":
        root.bind("<Control-{}>".format(char), lambda _: root.destroy())

    root.mainloop()

и некоторый пример вывода:

moving: x: (14, 14), y: (117, 117)
moving: x: (14, 14), y: (118, 118)
scroll: x: (164, 164), y: (118, 118)
scroll: x: (164, 164), y: (118, 118)
moving: x: (14, 14), y: (117, 117)
moving: x: (14, 14), y: (116, 116)
moving: x: (15, 15), y: (116, 116)
moving: x: (15, 15), y: (115, 115)
moving: x: (15, 15), y: (114, 114)
moving: x: (16, 16), y: (114, 114)
scroll: x: (166, 166), y: (114, 114)
scroll: x: (166, 166), y: (114, 114)
moving: x: (15, 15), y: (114, 114)
moving: x: (14, 14), y: (114, 114)
moving: x: (14, 14), y: (113, 113)
moving: x: (13, 13), y: (113, 113)
scroll: x: (163, 163), y: (113, 113)
scroll: x: (163, 163), y: (113, 113)
moving: x: (13, 13), y: (112, 112)
moving: x: (13, 13), y: (111, 111)
moving: x: (13, 13), y: (110, 110)

Я быкак способ иметь одинаковую систему координат для событий движения и прокрутки, но, как вы можете видеть, события прокрутки смещены на 150 пикселей вправо, что соответствует отступу в 150 пикселей слева из-за красного холста наниз.Использование функций .canvasx и .canvasy для перемещения события в систему координат холста не помогает.

Есть идеи, как обойти это?Я не хочу вычитать постоянные 150 пикселей из координат события прокрутки, потому что размер общего окна можно изменять, поэтому объем заполнения может быть намного больше.

Я использую Python 3.7.2 и версию tkinter8.6 на Mac (Mojave), хотя мое приложение работает в Ubuntu с несколькими версиями Python и tkinter.(Отказ от ответственности: я не пробовал MWE на Ubuntu, но я ожидаю, что он будет работать так же.)

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...