在 Tkinter 上显示全屏模式

Posted

技术标签:

【中文标题】在 Tkinter 上显示全屏模式【英文标题】:Display fullscreen mode on Tkinter 【发布时间】:2011-12-19 10:46:55 【问题描述】:

如何在 Tkinter 中以全屏模式显示框架?我看到了这段代码,非常有用……:

>>> import Tkinter
>>> root = Tkinter.Tk()
>>> root.overrideredirect(True)
>>> root.geometry("0x1+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))

...但是是否可以编辑代码,以便点击 Esc 自动使窗口“恢复”?

【问题讨论】:

【参考方案1】:
root = Tk()
root.geomentry('1599x1499')

【讨论】:

这个答案假设了屏幕的尺寸。如果有人有不同尺寸的屏幕,或者代码预计在不同屏幕尺寸的机器上运行,这将没有用。一个好的答案将显示如何获取屏幕尺寸(但不重复任何现有答案)。【参考方案2】:

是的,伙计,我试图在 Windows 中做同样的事情,而帮助我的是使用 root.state() 方法的一些 lambdas。

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

【讨论】:

【参考方案3】:

这是一个简单的 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()

这将在按下 Escape 时使屏幕退出全屏,并在按下 F11 时切换全屏。

【讨论】:

【参考方案4】:

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

import tkinter as tk
root = tk.Tk()

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


root.mainloop()

【讨论】:

【参考方案5】:

我认为如果您只寻找全屏,则无需设置几何或最大尺寸等。

你只需要这样做:

-如果你在 ubuntu 上工作:

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

-如果您在 Windows 上工作:

root.state('zoomed')

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

Root.iconify()

【讨论】:

【参考方案6】:

我想这就是你要找的东西:

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.

【讨论】:

为什么要手动使用w.tk.destroy?我以前从未在 Python Tk 应用程序中看到过这种情况。 @exhuma(由于某种原因,我直到现在才看到您的评论。)好问题。感谢您指出了这一点。这里似乎没有必要。我想当我第一次开始 Tkinter 编程时,我看到其他人这样做了,我没有多想就一直坚持下去。但是,我曾经编程过的某个程序或其他程序中可能有它的原因,但我不知道那个原因是什么。无论如何,它不会影响执行,但我会从这里的代码中编辑它并将主循环也放在构造函数之外。 @exhuma 我找到了它背后的一些原因。显然,一些开发环境在没有它的情况下会出现故障(尽管您在常规 Python 环境中似乎不需要它)。此链接提供代码示例和说明:effbot.org/tkinterbook/tkinter-hello-again.htm 这基本上让您能够使用 TKinter 运行信息亭吗? @BillGreer 基本上,是的,但是在上面的示例中,您仍然可以按 Alt+F4 关闭程序和内容,并且它已被编程,因此再次按 F11,否则 Esc 将退出该模式。当然,您可以更改程序,并可能获得安全的信息亭模式,但我没有尝试过。至少,您必须重写一堆键绑定。【参考方案7】:

这将创建一个全屏窗口。默认情况下,按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("0x1+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()

【讨论】:

注意:root.overrideredirect(True) &lt;Escape&gt; 不会在我的机器上调用任何东西(Ubuntu)。如果没有root.overrideredirect,则会显示标题栏。 这对我不起作用。它唯一做的就是最大化窗口。 这不是全屏,而是最大化...不太一样,对于真正的全屏,请参阅@Shule 的回答 +0+0self._geom 的一部分,并且方法“几何”不是强制性的。仅当显式将窗口放置在屏幕上的某个位置时才应放置它

以上是关于在 Tkinter 上显示全屏模式的主要内容,如果未能解决你的问题,请参考以下文章

python Tkinter 全屏显示

tkinter:在窗口中显示时间

全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?

强制 Tkinter 窗口停留在全屏顶部 - Windows 10

将matplotlib嵌入到tkinter应用程序中

用Tkinter打造GUI开发工具(49)在Tkinter窗口上动态显示matplotlib.pyplot图形