当前位置:  开发笔记 > 编程语言 > 正文

Tkinter的overrideredirect可防止Mac和Linux中的某些事件

如何解决《Tkinter的overrideredirect可防止Mac和Linux中的某些事件》经验,为你挑选了0个好方法。

我正在用Python编写一个带有Tkinter UI的程序.我想要一个没有标题栏的小窗口.此窗口必须接收键盘输入.我不挑剔这是以Entry小部件的形式还是只是绑定到KeyPress.overrideredirect(True)通常是标题栏被禁用的方式.不幸的是,(除了在Windows中),这似乎阻止了许多事件被接收.我写了这段代码来说明问题:

#!/usr/bin/env python
from __future__ import print_function
import Tkinter

class AppWindow(Tkinter.Tk):
    def __init__(self, *args, **kwargs):
        Tkinter.Tk.__init__(self, *args, **kwargs)
        self.overrideredirect(True)
        self.geometry("400x25+100+300")

        titleBar = Tkinter.Frame(self)
        titleBar.pack(expand = 1, fill = Tkinter.BOTH)

        closeButton = Tkinter.Label(titleBar, text = "x")
        closeButton.pack(side = Tkinter.RIGHT)
        closeButton.bind("", lambda event: self.destroy())

        self.bind("", lambda event: print("" % event.char))
        self.bind("", lambda event: print(""))
        self.bind("", lambda event: print(""))
        self.bind("", lambda event: print(""))
        self.bind("", lambda event: print(""))
        self.bind("", lambda event: print(""))

if __name__ == "__main__":
    app = AppWindow()
    app.mainloop()

这会创建一个小窗口(没有标题栏),在收到它们时会打印公共事件的名称.我在Windows 7,Mac OSX(El Capitan)和Ubuntu 14.04.1上运行此脚本.我在虚拟机(VMWare)中只运行了Ubuntu.

在Windows中,这似乎按预期工作.可以接收我的代码测试的所有事件.

在Ubuntu中,在Tkinter的窗口接收,预期的事件,但是,是从未收到过.实际上,即使在单击窗口之后,具有焦点的最后一个窗口仍继续接收按键.

在OSX中,Tkinter的窗口接收事件预期,但,是从未收到过.具有焦点的最后一个窗口不会像Ubuntu那样继续接收按键操作.这些事件表现得有些奇怪.单击窗口后才会收到该事件.然后,一旦事件发生,需要再次单击窗口以接收另一个事件.

我也在函数self.focus_force()结束前尝试过__init__.这会导致窗口接收事件在程序启动时,但没有进一步的,事件从未收到.

最终,我的问题是:有没有办法隐藏标题栏但是继续在OSX和Linux中接收键盘输入?


我知道处理同样问题的其他一些问题.在这三个问题中:

python tkinter overrideredirect; 无法接收击键(Linux)

root.overrideredirect和绑定

如何将Tkinter destroy()绑定到Debian中的键?

接受的答案是使用self.attributes('-fullscreen', True),这对我不起作用,因为我想要一个小小的窗口,而不是全屏应用程序.

还有一个问题:Tkinter overrideredirect不再接收事件绑定.这似乎与我的问题非常接近,但提供的细节较少,没有答案.


更新:我一直在试图调查我的问题的潜在机制.我知道Tkinter是Tcl/Tk的包装器,所以我想我会尝试在Tcl中重写我的代码.我真的不知道Tcl,但我认为我设法(或多或少)翻译我的Python:

#!/usr/bin/env wish
wm overrideredirect . True
wm geometry . "400x25+100+300"
bind .  {puts ""}
bind .  {puts ""}
bind .  {puts ""}
bind .  {puts ""}
bind .  {puts ""}
bind .  {puts ""}

我在Windows和Mac OSX中尝试了生成的程序.在Windows中我收到了事件,但在OSX中我没有收到.没有这wm overrideredirect . True条线,OSX确实收到了这些事件.因此看起来这个问题不是用Python,而是用Tcl/Tk.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有