【问题标题】:Tkinter focus_set() does not work on text widgetTkinter focus_set() 不适用于文本小部件
【发布时间】:2016-07-31 03:55:28
【问题描述】:

我将 Tkinter 与 python 一起用于一个简单的 UI,其中有一个文本小部件和一个按钮。按下按钮时,我希望使用 focus_set() 方法将光标焦点设置在文本小部件上。

我不明白为什么 focus_set() 在我的代码中不起作用。我认为这可能是因为我的文本小部件位于框架 (frame1) 内,而我无法在 startPaus() 方法中正确访问此小部件。有什么想法可以解决这个问题吗??

class TypingField(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        self.submit_tog = True
        self.initUI()

    def initUI(self):
        self.parent.title("Text Field")
        self.pack(fill = BOTH, expand=True)

        frame1 = Frame(self, width = 50, height =25)
        frame1.pack(fill = X, expand=True)
        self.scroll = Scrollbar(frame1)
        self.scroll.pack(side = "right", fill = Y)
        self.text = Text(frame1)
        self.text.pack(fill=Y)
        self.scroll.config(command=self.text.yview)
        self.text.config(yscrollcommand=self.scroll.set)


        frame2 = Frame(self)
        frame2.pack(fill=X, expand=True)
        self.submit = Button(frame2,text="Start Test")
        self.submit.bind("<Button-1>", self.startPause)
        self.submit.pack(fill=X)

    def startPause(self, event):
        if self.submit_tog:
            self.submit.configure(text = "Pause")
            self.text.focus_set()
        else:
            self.submit.configure(text = "Start Test")
        self.submit_tog = not self.submit_tog

【问题讨论】:

    标签: python python-2.7 tkinter tkinter-canvas


    【解决方案1】:

    以下适用于我的机器。请注意,焦点始终在您发布的代码的 Text 小部件上,输入一些内容以查看此内容,因为焦点从未设置在其他地方,但在下面的代码中,它在 Text 小部件和 Button 之间交替进行说明。

    class TypingField():
        def __init__(self, parent):
            self.parent = parent
            self.submit_tog = True
            self.initUI()
    
        def initUI(self):
            self.parent.title("Text Field")
    
            frame1 = Frame(self.parent, width = 50, height =25)
            frame1.pack(fill = X, expand=True)
            self.scroll = Scrollbar(frame1)
            self.scroll.pack(side = "right", fill = Y)
            self.text = Text(frame1)
            self.text.pack(fill=Y)
            self.scroll.config(command=self.text.yview)
            self.text.config(yscrollcommand=self.scroll.set)
    
            frame2 = Frame(self.parent)
            frame2.pack(fill=X, expand=True)
            self.submit = Button(frame2,text="Start Test")
            self.submit.bind("<Button-1>", self.startPause)
            self.submit.pack(fill=X)
    
        def startPause(self, event):
            if self.submit_tog:
                self.submit.configure(text = "Text Focus")
                self.text.focus_set()
            else:
                self.submit.configure(text = "Button Focus")
                self.submit.focus_set()
            self.submit_tog = not self.submit_tog
    
    root=Tk()
    TypingField(root)
    root.mainloop()
    

    【讨论】:

    • 感谢您的回复,但由于某种原因,这不是我的情况,重点不在文本字段上。通过添加您的行,它仍然无法正常工作。
    • 执行 self.text.focuse_set() 后,我通过 self.focus_get() == self.text 检查焦点,它确实返回 True。但重点不在文本字段上,因为我无法在不选择文本字段的情况下立即输入内容。焦点仍在按钮上
    • 我所做的不仅仅是添加一条线,因为我希望还能理顺框架的混乱。复制并粘贴发布的代码,运行它,看看会发生什么。
    • 再次感谢您的回复,您的代码确实有效,我花了很长时间试图找出您和我之间的区别,实际上我的代码可以正常工作。我发现这是因为我的库导入。我从 ttk 导入 Button 而不是使用 Tkinter 定义,这似乎是没有设置焦点的原因。感谢您的帮助
    猜你喜欢
    • 2020-01-24
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多