小编典典

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

python

以下代码在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环境之间这种不同行为的原因可能是什么?


阅读 237

收藏
2021-01-20

共1个答案

小编典典

使用overrideredirect程序会失去与窗口管理的联系,因此似乎无法获得有关按键的信息,甚至无法获得焦点。

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

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


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


编辑:

一些(有效的)示例fullscreen

overrideredirect在Linux上使用时,程序可以获取键盘事件,因此绑定不起作用,并且您无法集中注意力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()
2021-01-20