Tkinter Tinkter将焦点保持在收回的帧上(实际上是窗口)

Tkinter Tinkter将焦点保持在收回的帧上(实际上是窗口),tkinter,setfocus,Tkinter,Setfocus,因此,我想让顶层框架在被撤回后保持焦点 from Tkinter import * class VanishingFrame(): def __init__(self,parent,Event=None): self.parent=parent self.visible=True self.Frame=Toplevel() self.Frame.title('Magical disapearing frame')

因此,我想让顶层框架在被撤回后保持焦点

    from Tkinter import *
class VanishingFrame():
    def __init__(self,parent,Event=None):
        self.parent=parent
        self.visible=True
        self.Frame=Toplevel()
        self.Frame.title('Magical disapearing frame')
        self.Frame.transient(self.parent)
        self.Frame.grab_set()
        self.Frame.focus_set()
        self.Frame.geometry('300x300+150+150')
        Label(self.Frame,text="Press any key").place(relx=.5,rely=0.5,anchor=CENTER)
        self.Frame.bind('<Key>',self.AnyKey)
        self.AnyKey()
    def AnyKey(self,Event=None):
        print "key hit"
        self.visible= not self.visible
        if self.visible:
            self.Frame.withdraw()
        else:
            self.Frame.deiconify()
        self.parent.update()
        self.Frame.update()
        self.Frame.grab_set()
        self.Frame.focus_set()
        self.Frame.focus_force()
        self.Frame.update()
root=Tk()
root.geometry('500x500')
root.title("Bring out your dead")
Magic=VanishingFrame(root);
root.mainloop()
从Tkinter导入*
类消失帧():
定义初始化(自、父、事件=无):
self.parent=parent
self.visible=True
self.Frame=Toplevel()
self.Frame.title('magic disapearing Frame')
self.Frame.transient(self.parent)
self.Frame.grab_set()
self.Frame.focus_set()
自框架几何(“300x300+150+150”)
标签(self.Frame,text=“Press any key”).place(relx=0.5,rely=0.5,anchor=CENTER)
self.Frame.bind(“”,self.AnyKey)
self.AnyKey()
def AnyKey(自身,事件=无):
打印“击键”
self.visible=不self.visible
如果自可见:
self.Frame.draw()
其他:
self.Frame.deiconify()
self.parent.update()
self.Frame.update()
self.Frame.grab_set()
self.Frame.focus_set()
self.Frame.focus_force()
self.Frame.update()
root=Tk()
根几何体('500x500')
root.title(“拿出你的死人”)
魔术=消失帧(根);
root.mainloop()
第一个关键点按预期工作,消失帧消失。然而,现在的焦点似乎集中在根框架上。单击根帧中的任意位置将使焦点切换回消失的帧,然后单击下一个关键点将使其重新出现。有趣的是,当“消失帧”被撤回且根帧似乎具有焦点时,您无法关闭根帧。必须单击根帧中的某个位置,使消失的帧显示出来,然后将其关闭。这会告诉我self.Frame.transient正在工作


因此,实际的问题是,如何在不必先单击根帧的情况下将焦点保持在收回的帧上?

Tk在尝试设置焦点时检查窗口是否已映射。如果焦点目标未映射,它将忽略您的请求。看见不管怎么说,这似乎是个坏主意,尤其是与抓斗相结合的时候。如果您有合成支持,您可以使用属性来设置alpha通道并使其透明(例如:
self.Frame.attributes('-alpha',0.0)
。因为这仍然是映射的(但不可见),所以它可以接受焦点

在这种情况下,添加命令的效果是覆盖将焦点设置为未映射小部件的限制。如果将焦点设置为应用程序中的有效小部件,则抓取将生效,并将焦点移动到抓取的小部件树中


最初指定的问题是,一旦当前toplevel被撤销,如何将焦点重新附加到有用的东西上,对此,答案是使用
wm deiconify.
将主toplevel重新声明为当前活动窗口。这将设置toplevel活动,并将焦点设置到该窗口上,然后抓取并移动该窗口将焦点设置到现在隐藏的顶级窗口小部件。此时,键绑定将再次工作。

您试图完成的真正问题是什么?将焦点设置到不可见的顶级窗口似乎没有任何目的。将焦点设置到已撤销的窗口的目的是使其在任何按键下重新出现。此窗口的一部分是通用键它有一个键,可以让它消失一秒钟,这样用户就可以看到它背后的东西。它会随着任何事件返回。你不需要给它焦点就可以做到这一点。你可以创建一个绑定,无论哪个窗口有焦点,它都会触发。Tk仍然会给被撤销的窗口焦点。只要我在根框架上的任何地方单击,焦点就会弹出这是否是一个bug,在鼠标点击根窗口后,焦点会转到撤销的顶层窗口?(bug可能有点强,未定义的行为)抓取的存在会改变一些事情。抓取会将焦点限制在指定的小部件树上,因此,虽然您无法将焦点设置为撤回的小部件,但如果您将焦点设置为任何映射的小部件,则抓取会控制并将其移到抓取的小部件上。对于死马搏击,我只想确保我的头脑中有这个权利。当我退出帧,我的对焦请求被忽略(如上所述)因此,在这一点上,我的应用程序中没有任何内容具有焦点。与其说是单击根目录,不如说是单击我的应用程序的任何部分将焦点转移到我的应用程序,然后将焦点转移到撤回的窗口。是吗?顺便说一句,这迫使我更好地理解windows vs frames。我正在改变我的方法。我本来不应该使用toplevel。而不是ks!