代码之家  ›  专栏  ›  技术社区  ›  Ann Aleshkina

帧上的Tkinter focus_set()?

  •  0
  • Ann Aleshkina  · 技术社区  · 2 年前

    我使用Tkinter(如果它很重要的话,实际上是自定义的)。我需要的是一个密钥绑定(例如escape)。它必须在不同的框架中以不同的方式工作,在某些框架中我不需要它。我使用框架系统作为某种选项卡。根据其他主题中的答案,我假设框架默认情况下没有关键事件绑定,ppl建议编写 frame.focus_set() 以便能够绑定键盘按钮。但这个美丽的解决方案对我没有帮助。但对我来说,最大的谜团是为什么这个例子效果很好:

    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()
    

    我的代码忽略了转义按钮:(提醒!我知道我的代码风格很糟糕,请不要侮辱我)

    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()
    

    中有什么 app.world_frame.info_button_released() 没关系,我的代码甚至不打印“Wrapper”。好吧,我希望有人能帮助我,或者把我推向正确的方向。。。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Bryan Oakley    2 年前

    但对我来说,最大的谜团是为什么这个例子效果很好:

    我不知道该怎么回答,只是说它工作得很好,因为它的行为符合设计。默认情况下,帧不会获得键盘焦点,因此默认情况下它们不会接收键盘事件。该代码明确地将键盘焦点设置为一个帧,以便该帧接收键盘事件。

    …我的代码忽略了转义按钮:

    customtkinter代码不起作用的原因是customtkint在处理绑定方面有一些特性。不幸的是,它覆盖了 bind 将任何绑定应用于嵌入在框架中的画布小部件,而不是框架本身。因此,绑定被添加到画布中,但您将焦点设置为框架。

    您可以通过更改代码以调用来看到这一点 self._canvas.focus_set() 这将迫使焦点成为内部画布。然后您的绑定将开始工作。

    我不认为这是一个合适的解决方案,但我不确定在这种情况下最好的解决方案是什么。客户的设计并没有说明这一点。也许这就像重新定义一样简单 focus_set ,不过我不知道这可能会有什么副作用。

    class WorldInfoFrame(MainFrame):
        def focus_set(self):
            self._canvas.focus_set()
        ...
    
    推荐文章