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

发布于 2021-01-29 15:01:31

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

关注者
0
被浏览
67
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看