Tkinter Проверить, было ли нажато окно с входом - PullRequest
0 голосов
/ 09 июля 2020
• 1000 1004 * Теперь по умолчанию в Tkinter это можно сделать, чтобы привязать событие объекта входа <Button> к функции и проверить, был ли он нажат. Но в моем случае мне нужно что-то другое.

В goopy окно проверяет, был ли он нажат, и в основном возвращает позицию щелчка мыши. Затем это можно использовать в функции is_clicked(mouse_pos), реализованной в каждом объекте. Это отлично работает для всех объектов, прямоугольников, кругов, изображений, кнопок и т. Д. c.

Но проблема возникает с записями. По какой-то причине окно не регистрирует щелчок, когда я щелкнул запись или какое-либо событие мыши. Он не регистрирует движение мыши над Entry et c. Это означает, что если пользователь действительно щелкнул запись, щелчок мыши не был зарегистрирован в окне.

Полный код находится по этой ссылке: https://github.com/BhavyeMathur/goopylib/tree/master/goopylib. Класс GraphWin - это окно верхнего уровня, а класс objects / Entry - это Entry. Я также попытался немного сократить код, который, как я думал, может быть проблемой:

Функция рисования Entry (сокращено)

def _draw(canvas, ...)
    p = (55, 55)
    x, y = canvas.to_screen(p[0], p[1])
    frm = tkFrame(canvas.master)  # Equivalent of tk.Frame

    self.entry = tkEntry(frm, width=10, textvariable=self.text, selectbackground=self.select_colour)
    self.entry.pack()

    return canvas.create_window(x, y, window=frm)

Функция Window __init__ (сокращено). Окно наследуется от tk.Canvas.

class GraphWin(tkCanvas):
    def __init__(self):
        master = tkToplevel(_root)  # Actually creating the window
        master.protocol("WM_DELETE_WINDOW", self.close)

        tkCanvas.__init__(self, master, width=110, height=110)

        self.pack()

        # Here we bind the mouse events

        self.bind("<Button-1>", self._on_left_click)

    def _on_left_click(e):   # This isn't called when the Entry has been clicked
        self.mouse_left_click = e.x, e.y
        self.last_mouse_event = self.trans.world(e.x, e.y)

Если вы хотите попробовать весь код с goopy, вам нужно будет установить его, например:

pip install goopylib

, и запустить этот код:

from goopylib.imports import *

window = GraphWin("Test Window", width=110, height=110)
e = Entry(Point(55, 55), text_width=10).draw(window)

while True:

    mouse_pos = window.check_left_mouse_click()  # Get's the last mouse click position 
    if mouse_pos is not None:
        print(mouse_pos, e.get_width(), e.get_height())

    if e.is_clicked(mouse_pos):
        print(1)
    window.update_win()   # Updates the window
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...