Python 中的 focus_set() 不适用于第二个窗口

Posted

技术标签:

【中文标题】Python 中的 focus_set() 不适用于第二个窗口【英文标题】:focus_set() in Python does not work on second window 【发布时间】:2015-03-16 15:50:54 【问题描述】:

getinput 窗口出现在介绍窗口之后,应该关注入口空间,但没有。如果我跳过介绍窗口,那么焦点就会发生。如果我随后输入 1-10 范围之外的数字,getinput 窗口会重新出现,但没有焦点。有人可以帮忙吗?

用 Python 3.3.5 编写

import tkinter

def intro(tkinter):
    global contents
    w = 300
    h = 200
    frame = tkinter.Frame(root,width=w,height=h)
    frame.pack()
    label = tkinter.Label(frame,font=('courier', 12, 'bold'),\
        text="\nPlease click on OK.\n\n")
    label.pack()
    label.place(x=40,y=50)
    OK = tkinter.Button(root,bd=5,text='OK',font=('courier', 20, 'bold'),\
        command=root.destroy)
    OK.pack()
    OK.place(x=125,y=120)
    root.mainloop()

def cancel():
    global level
    level = contents.get()
    root.destroy()

def getinput(tkinter):
    global contents
    w = 400
    h = 300
    frame = tkinter.Frame(root,width=w,height=h)
    frame.pack()
    label = tkinter.Label(frame,font=('courier', 12, 'bold'),\
        text="Please enter a number in the\n range 1 to 10 and click on OK.")
    label.pack()
    label.place(x=40,y=50)
    entry = tkinter.Entry(frame,font=('courier', 24, 'bold'))
    entry.pack()
    entry.place(x=175,y=150,width=50)
    contents = tkinter.StringVar()
    contents.set("")
    entry["textvariable"] = contents
    entry.focus_set()       #Gives focus by flashing cursor in entry space.
    OK = tkinter.Button(root,bd=5,text='OK',font=('courier', 20, 'bold'),\
        command=cancel)
    OK.pack()
    OK.place(x=170,y=210)
    root.mainloop()

level = ""
contents = ""
root = tkinter.Tk()     #Comment out this line
intro(tkinter)          #and this line to skip intro window
root = tkinter.Tk()
getinput(tkinter)
while (int(level) < 1) or (int(level) > 10):
    root = tkinter.Tk()
    getinput(tkinter)

print('Result is ',level)

【问题讨论】:

我没有完全理解您的问题,但是当我单击OK 时会出现一个新窗口,Entry 对象已聚焦并准备好写入我的系统。你用的是哪个系统? 部分问题可能是由于Tk 的多个实例——你应该只有一个。如果您需要多个窗口,请创建 Toplevel 的实例。 我认为问题不在于多个 Tk 实例,因为它们从不会同时运行。我认为焦点实际上设置为entry,但问题是窗口没有焦点。您可以使用entry.focus_force() 强制将焦点集中到小部件上。这也应该将焦点带到窗口上。 除此之外,您的代码中还有一些奇怪的东西。一方面,你不应该同时使用packplace,选择一个并坚持下去。绝对没有理由在同一个小部件上同时调用两者。另外,你为什么将tkinter 传递给你的函数?您不必传递它就可以在函数内部使用它。此外,您不必将 StringVar 设置为 "",因为这就是它的初始化值。 非常感谢大家。 entry.focus_force() 可以解决问题,但我肯定会考虑您的其他 cmets 来整理程序。 【参考方案1】:

我遇到了同样的问题。感谢@fhdrsdg,entry.focus_force() 弄清楚这一点。下面是一个例子。

from tkinter import *
root = Tk()
Window = Frame(root)
Window.pack()
txt = Entry(Window)
txt.pack()
txt.focus_set()
root.mainloop()

root = Tk()
Window = Frame(root)
Window.pack()
txt = Entry(Window)
txt.pack()
txt.focus_force()
root.mainloop()

【讨论】:

以上是关于Python 中的 focus_set() 不适用于第二个窗口的主要内容,如果未能解决你的问题,请参考以下文章

python selenium chrome headless中的文件下载路径设置不适用

爬虫--python3.6+selenium+BeautifulSoup实现动态网页的数据抓取,适用于对抓取频率不高的情况

在 Python 中编写适用于 Windows 中的 Python 2.7+ 和 Python 3.3+ 的 .CSV 文件

适用于 Windows 的 Python 中的 Ogg Vorbis 包装器

python 替换当前剪贴板条目中的文本[Python 2.7]适用于Win8.1x64

python中的ODE求解系统;在本次通话中完成的多余工作