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

时间:2013-11-29 13:33:17

标签: python windows tkinter debian

以下代码在MS Windows中正常工作(按下q时脚本退出):

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("{0}x{1}+0+0".format(
            self.root.winfo_screenwidth(), self.root.winfo_screenheight())
        )
        self.root.overrideredirect(True)
        tk.Label(text="some text here").grid()
        self.root.bind('q', self.appexit)
        self.root.mainloop()

    def appexit(self, event):
        self.root.destroy()

App()

我尝试在“无窗口管理器”的Debian环境中运行它(启动到控制台,运行startx,它通过.xinitrc启动脚本(那里唯一的命令))。

脚本按预期启动,但按q不执行任何操作(我希望X关闭并返回文本控制台)。我之后尝试在self.root.focus()之前添加mainloop(),但它没有帮助。

MS Windows和Debian环境之间出现这种不同行为的原因是什么?

3 个答案:

答案 0 :(得分:2)

overrideredirect程序失去与窗口管理的连接,因此它似乎无法获取有关按下的键的信息,甚至无法聚焦。

MS Windows是一个大窗口管理器,因此overrideredirect似乎无法在该系统上运行。

也许您可以使用self.root.attributes('-fullscreen', True)代替self.root.overrideredirect(True)


顺便说一句:测试我使用self.root.after(5000, self.root.destroy) - 在我无法控制的情况下在5秒后杀死窗口。


修改

fullscreen的一些(工作)示例。

使用Linux上的overrideredirect程序可以获取键盘事件,因此绑定不起作用,并且您无法关注Entry()。但是鼠标和Button()有效。 overrideredirect适用于带有或不带按钮的“闪屏”。

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()

        # this works

        self.root.attributes('-fullscreen', True)

        # this doesn't work

        #self.root.overrideredirect(True)
        #self.root.geometry("800x600+100+100") # to see console behind
        #self.root.after(5000, self.appexit) # to kill program after 5s

        self.root.bind('q', self.q_pressed)

        tk.Label(text="some text here").grid()
        e = tk.Entry(self.root)
        e.grid()
        e.focus() # focus doesn't work with overrideredirect 

        tk.Button(self.root, text='Quit', command=self.appexit).grid()

        self.root.mainloop()

    def q_pressed(self, event):
        print "q_pressed"
        self.root.destroy()

    def appexit(self):
        print "appexit"
        self.root.destroy()

App()

答案 1 :(得分:1)

如果键绑定不起作用,则绑定所关联的窗口可能没有键盘焦点。在没有窗口管理器的情况下,您的程序可能没有键盘焦点。

您可以尝试强制它使用root.focus_force()进行关注。即使整个应用程序不是前台应用程序,这有时也会将焦点放在窗口上。这在某种程度上取决于窗口管理器,或缺少窗口管理器。

答案 2 :(得分:-1)

这通常对我有用:

def appexit(self, event):
    self.root.quit() # end mainloop
    self.root.destroy()