• 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