Eu uso o Tkinter (na verdade, customtkinter, se for importante). O que eu preciso é de combinações de teclas (escape, por exemplo). Deve funcionar de forma diferente em frames diferentes, e em alguns frames não preciso disso. Eu uso o sistema de quadros como uma espécie de aba. Com base nas respostas de outros tópicos, presumi que os frames não possuem vinculação de evento de chave por padrão, e as pessoas recomendam escrever
frame.focus_set()
para poder vincular os botões do teclado. Mas esta bela solução não me ajudou. Mas o maior mistério para mim é por que este exemplo funciona bem:
from tkinter import *
main = Tk()
def leftKey(event):
print ("Left key pressed")
def rightKey(event):
print ("Right key pressed")
frame = Frame(main, width=100, height=100)
frame.bind('<Left>', leftKey)
frame.bind('<Right>', rightKey)
frame.focus_set()
frame.pack()
main.mainloop()
E meu código ignora o botão de escape: (alerta! Eu sei que meu estilo de código é horrível, por favor, sem insulto)
class MainFrame(customtkinter.CTkFrame):
def __init__(self, master, **kwargs):
super().__init__(master, corner_radius=0, **kwargs)
'''some code'''
class WorldInfoFrame(MainFrame):
def __init__(self, master):
super().__init__(master)
'''some code'''
self.bind("<Escape>", self.wrapper_info_button_pressed)
self.focus_set()
@staticmethod
def info_button_pressed():
print("static")
app.world_frame.info_button_released()
'''some code'''
def wrapper_info_button_pressed(self, event):
print("Wrapper")
self.info_button_pressed()
O que está dentro app.world_frame.info_button_released()
não importa, meu código nem imprime "Wrapper". Bem, espero que alguém possa me ajudar ou me empurrar na direção certa ...
Não sei exatamente como responder a isso, exceto dizer que funciona bem porque está se comportando conforme planejado. Os quadros, por padrão, não recebem o foco do teclado; portanto, por padrão, eles não recebem eventos do teclado. O código define explicitamente o foco do teclado para um quadro, de modo que o quadro receba eventos de teclado.
A razão pela qual o código customtkinter não funciona é que customtkinter tem algumas peculiaridades na forma como ele lida com ligações. Infelizmente, ele substitui
bind
a aplicação de quaisquer ligações a um widget de tela incorporado no quadro, em vez do próprio quadro. Assim, as encadernações são adicionadas a uma tela, mas você define o foco para o quadro.Você pode ver isso alterando seu código para call,
self._canvas.focus_set()
o que forçará o foco a ser a tela interna. Suas ligações começarão a funcionar.Não acho que essa seja uma solução adequada, mas não tenho certeza de qual é a melhor solução nesse caso. O design customtkinter não deixa isso claro. Talvez seja tão simples quanto redefinir
focus_set
, embora eu não saiba que tipo de efeitos colaterais isso pode ter.