Tkinter focus_set () не работает с текстовым виджетом

Я использую Tkinter с python для простого пользовательского интерфейса, где у меня есть текстовый виджет и кнопка. Когда кнопка нажата, я хочу, чтобы фокус курсора был установлен на текстовом виджете, используя метод 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

person swang    schedule 09.04.2016    source источник


Ответы (1)


На моей машине работает следующее. Обратите внимание, что фокус всегда находится на виджете «Текст» для опубликованного кода, введите что-нибудь, чтобы увидеть это, потому что фокус никогда не устанавливается где-либо еще, но в приведенном ниже коде он чередуется между виджетом «Текст» и кнопкой для иллюстрации.

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()
person Community    schedule 10.04.2016
comment
Спасибо за ответ, но почему-то для меня это не так, фокус не на текстовом поле. А добавив свою строчку, все равно не работает. - person swang; 10.04.2016
comment
Как только я выполняю self.text.focuse_set (), я проверяю фокус с помощью self.focus_get () == self.text, и он возвращает True. Но основное внимание уделяется не текстовому полю, так как я не могу сразу набирать текст, не выбирая текстовое поле. Фокус по-прежнему на кнопке - person swang; 10.04.2016
comment
Я сделал больше, чем добавил линию, так как, надеюсь, также исправил беспорядок в кадре. Скопируйте и вставьте опубликованный код, запустите его и посмотрите, что произойдет. - person ; 10.04.2016
comment
Еще раз спасибо за ответ, ваш код действительно работал, и я потратил много времени, пытаясь найти разницу между вашим и моим, и на самом деле мой код работает как есть. Я обнаружил, что это из-за импорта моей библиотеки. Я импортировал кнопку из ttk, а не использовал определение Tkinter, что, кажется, является причиной того, что фокус не установлен. Спасибо за помощь - person swang; 11.04.2016