Tkinter захватывает расположение двух разных кнопок в Button1 нажатием и отпуском - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть сетка кнопок в сетке 8x12.В конце концов, я хочу иметь возможность раскрасить раздел (например, верхнюю левую сетку 3х3) определенным цветом.Пока у меня есть этот вопрос.Можно ли получить виджет одной кнопки, используя button.bind("<Button-1>", myfunc2), а затем получить виджет второй кнопки, используя button.bind("<ButtonRelease-1>", myfunc2)?Набросок кода, который у меня есть сейчас, ниже

class MyApp:
    def __init__(self, main):
        self.button_frame = tk.Frame(main)
        tk.Grid.rowconfigure(root, 0, weight=1)
        tk.Grid.columnconfigure(root, 0, weight=1)
        self.button_frame.grid(row=0, column=0, sticky='nsew')
        self.grid = tk.Frame(self.button_frame)
        self.grid.grid(sticky='nsew', column=0, row=7, columnspan=2)
        tk.Grid.rowconfigure(self.button_frame, 7, weight=1)
        tk.Grid.columnconfigure(self.button_frame, 0, weight=1)

        self.button_list = {}

        self.createbuttongrid()


    def createbuttongrid(self):
        label = 1
        for row in range(8):
            for column in range(12):
                button = tk.Button(self.button_frame, text='Well %s' % label)
                button.bind("<Button-1>", self.buttonclick)  # this line is in question
                button.bind("<ButtonRelease-1>", self.buttonrelease)  # along with this line
                button.grid(row=row, column=column, sticky='nsew')
                self.button_list[button] = (row, column)
                label += 1


    def buttonclick(self, event):
        first_button = event.widget
        print(self.button_list[first_button])


    def buttonrelease(self, event):
        second_button = event.widget
        print(self.button_list[second_button])


if __name__ == "__main__":
    import tkinter as tk

    root = tk.Tk()
    MyApp(main=root)
    root.mainloop()

(Изменение размера (с приведенным выше примером) не работает идеально, но это пока не важно.)

В настоящее время, когда я запускаю это и нажимаю на верхнюю левую кнопку, я получаю (0, 0), а когда я отпускаю, я также получаю (0, 0).Я думаю, это потому, что один и тот же виджет передается в def buttonclick и def buttonrelease, но я не уверен на 100%

1 Ответ

0 голосов
/ 26 февраля 2019

Событие <ButtonRelease> вернет тот же виджет, который перехватил событие <ButtonPress>.Это связано с тем, что нажатие на кнопку приводит к тому, что кнопка выполняет захват , что означает, что все события отправляются кнопке, а не любой другой кнопке.

Вы можете использоватьуниверсальный метод виджета winfo_containing для определения виджета по заданной координате х / у.Вы должны дать ему координаты x и y относительно корневого окна, которое удобно предоставить объектом event, переданным в обработчик событий.

def buttonrelease(event):
    second_button = event.widget.winfo_containing(event.x_root, event.y_root)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...