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

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

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

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

    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 将退出该模式。当然,您可以更改程序,并可能获得安全的信息亭模式,但我没有尝试过。至少,您必须重写一堆键绑定。
    【解决方案2】:

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

    【讨论】:

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

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

    你只需要这样做:

    -如果你在 ubuntu 上工作:

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

    -如果您在 Windows 上工作:

    root.state('zoomed')
    

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

    Root.iconify()
    

    【讨论】:

      【解决方案4】:

      这是一个简单的 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 时切换全屏。

      【讨论】:

        【解决方案5】:

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

        import tkinter as tk
        root = tk.Tk()
        
        root.overrideredirect(True)
        root.overrideredirect(False)
        root.attributes('-fullscreen',True)
        
        
        root.mainloop()
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:
            root = Tk()
            root.geomentry('1599x1499')
            

            【讨论】:

            • 这个答案假设了屏幕的尺寸。如果有人有不同尺寸的屏幕,或者代码预计在不同屏幕尺寸的机器上运行,这将没有用。一个好的答案将显示如何获取屏幕尺寸(但不重复任何现有答案)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多