【问题标题】:Cant exit fullscreen on tkinter window python无法在tkinter窗口python上退出全屏
【发布时间】:2021-08-23 15:20:09
【问题描述】:

我试图让这个窗口全屏,然后可以用任何键逃脱。我无法将转义键绑定到实际转义窗口,也无法从其他类似帖子中找出问题所在。

代码如下:

import tkinter as tk
from tkinter import *

root=Tk()

root.overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
root.focus_set()
root.bind("<Escape>", lambda e: root.quit())

#mybuttonsandframesgohere

root.mainloop()

【问题讨论】:

  • 顺便说一句:你在mainloop() 中忘记了()
  • 该链接中建议的方法不包括菜单栏。是的,这是一个错字,我很抱歉
  • 在某些系统(如 Linux)上,root.overrideredirect 删除了显示边框的窗口管理器 (WM),但 WM 也会将键/鼠标事件从系统发送到您的程序。如果 WM 不发送事件,那么您的程序不知道您点击了 ESC。
  • 你用的是什么操作系统?

标签: python tkinter binding fullscreen


【解决方案1】:

在某些系统(如 Linux)上,root.overrideredirect(True) 删除了显示边框的窗口管理器 (WM),但 WM 也会将键/鼠标事件从系统发送到您的程序。如果 WM 不发送事件,那么您的程序不知道您点击了 ESC。

这适用于我在 Linux Mint(基于 Ubuntu 和 Debian)上。 Rasbian 基于 Debian。

import tkinter as tk

def close_escape(event=None):
    print("escaped")
    root.destroy()

root = tk.Tk()

root.overrideredirect(True)
root.overrideredirect(False)

root.attributes("-fullscreen", True)
root.wm_attributes("-topmost", 1)
root.focus_set()

root.bind("<Escape>", close_escape)

root.after(5000, root.destroy) # close after 5s if `ESC` will not work

root.mainloop()

我将root.after(5000, root.destroy) 仅用于测试 - 如果ESC 不起作用,则在 5 秒后关闭它。

我使用close_escape 只是为了查看它是否被ESC 或after() 关闭。如果代码有效,那么您可以使用root.bind("&lt;Escape&gt;", lambda event:root.destroy())

import tkinter as tk

root = tk.Tk()

root.overrideredirect(True)
root.overrideredirect(False)

root.attributes("-fullscreen", True)
root.wm_attributes("-topmost", 1)
root.focus_set()

root.bind("<Escape>", lambda event:root.destroy())

root.mainloop()

顺便说一句:你也可以尝试不使用root.overrideredirect() - 也许它对你有用

import tkinter as tk

root = tk.Tk()

root.attributes("-fullscreen", True)
root.wm_attributes("-topmost", 1) # keep on top
#root.focus_set()

root.bind("<Escape>", lambda event:root.destroy())

root.mainloop()

【讨论】:

  • 不是按命令关闭,而是在5s后关闭,而且打印语句也打印出来了。
  • 如果它打印了"escaped",那么它应该意味着它用ESC关闭了窗口。
  • 需要注意的一点:在 root.bind 中用 root.destroy 替换函数 close_escape 似乎确实有效。不知道为什么,但我会把函数保留在那里
  • 我不明白在root.overrideredirect(False) 之后紧跟root.overrideredirect(True) 有什么用。对我来说,这与根本不使用overrideredirect 是一样的。
  • 为什么将标志设置为True,然后设置为False?这没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多