Tkinter focus_set()不适用于文本小部件

时间:2016-04-09 23:47:06

标签: python python-2.7 tkinter tkinter-canvas

我正在使用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

1 个答案:

答案 0 :(得分:0)

以下适用于我的机器。请注意,焦点始终位于您发布的代码的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()