【问题标题】:Open window and focus textbox tkinter打开窗口和焦点文本框 tkinter
【发布时间】:2012-12-01 04:16:49
【问题描述】:

我有一个(第二个)tkinter 窗口,它在打开时没有获得焦点,而是第一个窗口保持焦点(尽管第二个窗口出现在另一个窗口的前面)。 它包含一个我希望能够输入的文本框,但我必须双击它才能输入。

打开窗口时如何聚焦文本框?

我的尝试: textbox.focus_set(), window.grab_set(), window.focus_set()

他们都没有做我想做的事。

编辑: 相反,.focus_set() 在(且仅在)关闭 main 窗口时引发错误:can't invoke "focus" command: application has been destroyed

这是我当前的代码(tkWin是主窗口,tkcWin是第二个窗口):

def click(self, field):
    import _tkinter
    if field != None:
        try:
            self.tkcWin = Tk()#creating window
            self.tkcWin.focus()
            self.tkcWin.title(field)
            self.tkcWin.geometry('300x100')
            self.mainframe = Frame(master=self.tkcWin,background="#60BF98")
            self.mainframe.place(x=0, y=0, width=300, height=300)
            self.textb = Text(master=self.mainframe)
            self.textb.place(x=0, y=50)
            self.textb.bind("<Return>",lambda a: self.setM(field))
            self.textb.bind("<Return>",lambda a: self.tkcWin.destroy(),True)
            self.tkcWin.grab_set()
            self.tkWin.wait_window(self.tkcWin)
            self.textb.focus_set()
            hwnd = self.tkcWin.winfo_id()
            ctypes.windll.user32.SetFocus(hwnd)
            self.tkcWin.mainloop()
        except _tkinter.TclError:
            self.tkcWin.destroy()

【问题讨论】:

  • 您只对主窗口使用Tk()。请参阅this example 了解类结构。在第三个示例中查找“# Font Size Window”。您想为所有辅助窗口使用TopLevel 窗口。如果要替换主窗口中的内容,请制作一个包含所有内容的框架小部件,您可以将其销毁并替换为包含“新窗口”的新框架。

标签: python user-interface window focus tkinter


【解决方案1】:

事实证明,您可以简单地调用辅助窗口的deiconify() 方法,然后调用小部件的focus_set() 方法:

toplevel.deiconify()
text.focus_set()

这是 Windows 的原始解决方法(不再推荐):

首先在顶部添加import ctypes。
继续关注您的小部件,就像您拥有的那样:text.focus_set()
获取第二个窗口的hwnd:top_hwnd = toplevel.winfo_id()
最后激活第二个窗口:ctypes.windll.user32.SetFocus(top_hwnd)

【讨论】:

  • 我不能使用图书馆,因为它必须在学校的电脑上工作。但是,您描述的第二种方式不会聚焦窗口。
  • @csharpler 它对我有用。你的第二个窗口是TopLevel 窗口吗?你确定你正在检索它的 hwnd 吗? yourTopLevel.winfo_id() 如果您想不通,发布您正在尝试的内容会有所帮助。
  • @csharpler 我已经更新了答案以包含原生 Tkinter 解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2014-02-12
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多