以下代码在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 :(得分: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()