Попытка добавить привязку клавиш к кнопкам, чьи обратные вызовы создаются с завода - PullRequest
0 голосов
/ 21 февраля 2012

Итак, у меня есть следующий код, создающий сетку кнопок с использованием tkinter:

class Application(Frame):UP = 'Up'
    DOWN = 'Down'
    LEFT = 'Left'
    RIGHT = 'Right'
    END = "E"
    SEND = "S"
    STAR = "*"
    POUND = "#"
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()
    def createWidgets(self):
        self.arrowButtons = []
        self.arrowButtons += [Button(self, text=self.LEFT[0], command=self.buttonPressFactory(self.LEFT) )]
        self.arrowButtons += [Button(self, text=self.UP[0], command=self.buttonPressFactory(self.UP) )]
        self.arrowButtons += [Button(self, text=self.RIGHT[0], command=self.buttonPressFactory(self.RIGHT) )]
        self.arrowButtons += [Button(self, text=self.DOWN[0], command=self.buttonPressFactory(self.DOWN) )]

        self.send = Button(self, text=self.SEND, command=self.buttonPressFactory(self.SEND) )
        self.end = Button(self, text=self.END, command=self.buttonPressFactory(self.END) )
        self.send.grid(row=2,column=1)
        self.end.grid(row=2,column=3)
        self.numButtons = []

        for i in range(0,10):#make the number buttons
            self.numButtons.append(Button(self, text=str(i), command=self.buttonPressFactory(str(i))))

        self.starButton = Button(self, text=self.STAR, command=self.buttonPressFactory(self.STAR) )
        self.hashButton = Button(self, text=self.POUND, command=self.buttonPressFactory(self.POUND) )

        self.arrowButtons[0].grid(row=1,column=1)
        self.arrowButtons[1].grid(row=1,column=2)
        self.arrowButtons[2].grid(row=1,column=3)
        self.arrowButtons[3].grid(row=2,column=2)
        self.send.grid(row=2,column=1)
        self.end.grid(row=2,column=3)
        self.numButtons[1].grid(row=3,column=1)
        self.numButtons[2].grid(row=3,column=2)
        self.numButtons[3].grid(row=3,column=3)
        self.numButtons[4].grid(row=4,column=1)
        self.numButtons[5].grid(row=4,column=2)
        self.numButtons[6].grid(row=4,column=3)
        self.numButtons[7].grid(row=5,column=1)
        self.numButtons[8].grid(row=5,column=2)
        self.numButtons[9].grid(row=5,column=3)
        self.starButton.grid(row=6,column=1)
        self.numButtons[0].grid(row=6,column=2)
        self.hashButton.grid(row=6,column=3)

    def press(self, x):
        print(x)

    def buttonPressFactory(self, button):
        def buttonPress(*args):
            self.press(button)
        root.bind("<"+button+">", buttonPress)
        return buttonPress
if __name__ == '__main__':
    root = Tk()
    app = Application(root)                    
    app.master.title("stackoverflow is great")
    app.mainloop()  

Проблема началась, когда я добавил строку в buttonPressFactory, которая запускает "root.bind (" Когда я добавил эту строку,внезапное нажатие любой кнопки, кажется, вызывает нажатие (1), затем вызывает нажатие (как угодно). Связки клавиш работают правильно, за исключением 1,2,3,4 и 5 (на цифровой клавиатуре или на цифровой клавиатуре). Если удалить эту строку, все работаетхорошо, но, конечно, тогда вы не можете использовать сочетания клавиш. Я новичок в tkinter, поэтому я мог сделать очевидную ошибку, хотя моя интуиция подсказывает мне, что я, возможно, допустил синтаксическую ошибку.

Как можноЛи я добавить комбинации клавиш в код, не нарушая его?

1 Ответ

2 голосов
/ 21 февраля 2012

'<1>' - кнопка мыши 1, '1' - буквенный символ ( соответствующие документы ). Поэтому не используйте скобки для буквенных ключей.

Вот фиксированный buttonPressFactory:

def buttonPressFactory(self, button):
    def buttonPress(*args):
        self.press(button)
    eventname = '<' + button + '>' if len(button) > 1 else button
    root.bind(eventname, buttonPress)
    return buttonPress

Относительно вашего заявления

Я новичок в tkinter, поэтому я мог сделать очевидную ошибку, хотя моя интуиция подсказывает мне, что это на самом деле ошибка питона.

Хорошее эмпирическое правило заключается в том, что это почти всегда ваша ошибка. Это верно для всех.

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