在Tkinter上显示全屏模式

69

我该如何在Tkinter中让一个窗口以全屏模式显示?我看到了这段代码,觉得很有用:

>>> import Tkinter
>>> root = Tkinter.Tk()
>>> root.overrideredirect(True)
>>> root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))

...但是是否有可能编辑代码,使得按下 Esc 键自动将窗口"还原"?

8个回答

110

我觉得这就是你要找的内容:

Tk.attributes("-fullscreen", True)  # substitute `Tk` for whatever your `Tk()` object is called
你可以使用wm_attributes替代attributes。然后只需绑定转义键并将其添加到处理程序中即可。
Tk.attributes("-fullscreen", False)

另一个问题的答案提到了这一点(使用wm_attributes)。所以,这就是我发现的方式。但由于某些原因,没有人直接说明这就是答案。所以,我觉得值得发布。

下面是一个在Xubuntu 14.04上测试过的工作示例,它使用F11来切换全屏模式,并且只有按下Escape键才能关闭全屏模式:

import sys
if sys.version_info[0] == 2:  # Just checking your Python version to import Tkinter properly.
    from Tkinter import *
else:
    from tkinter import *


class Fullscreen_Window:

    def __init__(self):
        self.tk = Tk()
        self.tk.attributes('-zoomed', True)  # This just maximizes it so we can see the window. It's nothing to do with fullscreen.
        self.frame = Frame(self.tk)
        self.frame.pack()
        self.state = False
        self.tk.bind("<F11>", self.toggle_fullscreen)
        self.tk.bind("<Escape>", self.end_fullscreen)

    def toggle_fullscreen(self, event=None):
        self.state = not self.state  # Just toggling the boolean
        self.tk.attributes("-fullscreen", self.state)
        return "break"

    def end_fullscreen(self, event=None):
        self.state = False
        self.tk.attributes("-fullscreen", False)
        return "break"

if __name__ == '__main__':
    w = Fullscreen_Window()
    w.tk.mainloop()
如果你也想隐藏一个菜单,我找到的只有两种方法。一种是销毁它,另一种是创建一个空白菜单来切换。
翻译后:

如果你也想隐藏一个菜单,我找到的只有两种方法。一种是销毁它,另一种是创建一个空白菜单来切换。

self.tk.config(menu=self.blank_menu)  # self.blank_menu is a Menu object

当你想再次显示它时,将其切换回到你的菜单。

self.tk.config(menu=self.menu)  # self.menu is your menu.

2
你为什么要手动使用 w.tk.destroy?我以前从未在 Python Tk 应用程序中看到过这种做法。 - exhuma
1
@exhuma(我不知道为什么之前没有看到你的评论。)很好的问题。感谢指出这一点。在这里似乎是不必要的。我想我在刚开始 Tkinter 编程时曾看见其他人这样做,而且我一直保持着这个习惯,没有太多考虑它。然而,在我曾经编写的某些程序中可能有原因,但我不知道那个原因是什么。无论如何,这不影响执行,但我会将其从代码中删除,并将主循环放在构造函数外面。 - Brōtsyorfuzthrāx
2
@exhuma 我找到了一些原因。 显然,一些开发环境在没有它的情况下会出现故障(尽管您似乎不需要在常规Python环境中使用它)。 这个链接提供了一个代码示例和解释:http://effbot.org/tkinterbook/tkinter-hello-again.htm - Brōtsyorfuzthrāx
1
这基本上让你有能力使用TKinter运行一个信息亭吗? - Bill Greer
1
基本上是这样,但是在上面的例子中,您仍然可以按Alt + F4关闭程序等,而且它被编程为再次按F11或Esc将退出该模式。当然,您可以更改程序,也许获得安全的信息亭模式,但我还没有尝试过。您至少需要覆盖一堆键绑定。 - Brōtsyorfuzthrāx

39

这将创建一个全屏窗口。默认情况下,按下 Escape 键会将窗口大小调整为 '200x200+0+0'。 如果您移动或调整窗口大小,则 Escape 键在当前几何形状和先前几何形状之间切换。

import Tkinter as tk

class FullScreenApp(object):
    def __init__(self, master, **kwargs):
        self.master=master
        pad=3
        self._geom='200x200+0+0'
        master.geometry("{0}x{1}+0+0".format(
            master.winfo_screenwidth()-pad, master.winfo_screenheight()-pad))
        master.bind('<Escape>',self.toggle_geom)            
    def toggle_geom(self,event):
        geom=self.master.winfo_geometry()
        print(geom,self._geom)
        self.master.geometry(self._geom)
        self._geom=geom

root=tk.Tk()
app=FullScreenApp(root)
root.mainloop()

2
请注意:在我的机器上(Ubuntu),使用 root.overrideredirect(True) 后,<Escape> 没有任何效果。如果不使用 root.overrideredirect,则标题栏将显示。 - jfs
4
这对我没有用。它唯一做的就是最大化窗口。 - exhuma
7
这不是全屏,而是最大化……并不完全相同。如需真正的全屏,请参见@Shule的答案。 - dm76
self._geom中的+0+0部分以及geometry方法并不是必需的。只有在显式地将窗口放置在屏幕上某个位置时才需要它。 - Superior

31

我认为如果你只想要全屏,就不需要设置几何形状或最大尺寸等。

你只需要这样做:

- 如果你在 Ubuntu 上工作:

root=tk.Tk()
root.attributes('-zoomed', True)

-如果你正在使用Windows操作系统:

root.state('zoomed')

现在,为了在全屏模式和将其最小化到任务栏之间切换,您可以使用:

Root.iconify()

18

这里有一个使用lambda的简单解决方案:

root = Tk()
root.attributes("-fullscreen", True)
root.bind("<F11>", lambda event: root.attributes("-fullscreen",
                                    not root.attributes("-fullscreen")))
root.bind("<Escape>", lambda event: root.attributes("-fullscreen", False))
root.mainloop()

按下“Esc”键时,将退出全屏模式;按下“F11”键时,将切换到全屏模式。


12

这将在 Mac 上创建一个完全全屏窗口(没有可见的菜单栏),而不会影响键绑定

import tkinter as tk
root = tk.Tk()

root.overrideredirect(True)
root.overrideredirect(False)
root.attributes('-fullscreen',True)


root.mainloop()

2

嗯,伙计,我也在Windows上尝试做同样的事情,帮助我的是一些使用root.state()方法的lambda表达式。

root = Tk()
root.bind('<Escape>', lambda event: root.state('normal'))
root.bind('<F11>', lambda event: root.state('zoomed'))

0

只需使用:

# importing tkinter for gui
import tkinter as tk


# creating window
window = tk.Tk()
 
# setting attribute
window.state('zoomed')
window.title("Full window")
 
# creating text label to display on window screen
label = tk.Label(window, text="Hello world!")
label.pack()
 
window.mainloop()

如果你想隐藏除了窗口以外的所有内容,你也可以使用以下代码:

import tkinter as tk
root = tk.Tk()

root.overrideredirect(True)
root.overrideredirect(False)
root.attributes('-fullscreen',True)
root.title("FullScreen")
label = tk.Label(root, text="Hello! Press  logo on the keypad > select the python logo > Close window to close")
labela = tk.Label(root, text="")
label.pack()
labela.pack()

root.mainloop()

-6
root = Tk()
root.geomentry('1599x1499')

11
这个答案假设了屏幕的尺寸。如果某人的屏幕大小不同,或者代码预计在具有不同屏幕尺寸的机器上运行,则此答案将没有用处。一个好的答案应该展示如何获取屏幕尺寸(但不要重复现有答案中的任何部分)。 - snakecharmerb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接