HOWTO · Tkinter

如何在 Tkinter 中建立全屏視窗

本教程介紹瞭如何在 Tkinter 中建立全屏視窗。

本頁內容

若要讓 Tkinter 視窗全螢幕顯示,請將 -fullscreen 屬性設為 True。下方的 Windows 範例也會將 F11 綁定為切換全螢幕模式,並以 Escape 離開。在 Ubuntu 上,請使用 -zoomed 將視窗最大化。如果希望視窗填滿螢幕,同時保留標題列和邊框,則可改為將視窗尺寸設為螢幕大小。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

is_fullscreen = True
is_fullscreen = not is_fullscreen
print(is_fullscreen)
False

這個簡短的狀態轉換示範了 Windows 範例使用的切換方式:每按一次 F11,就會變更目前狀態。下方的 GUI 範例適用於互動式桌面環境。如果無法開啟顯示裝置,範例會捕捉 tk.TclError,讓無頭環境中的執行程序正常結束,而不會假裝視窗已顯示;請在範例指定的平台上執行,才能查看視窗行為。

在 Windows 上將 Tkinter 視窗設為全螢幕

tk.Tk.attributes 可接受平台專用的視窗屬性。在 Windows 上,建立根視窗時將 -fullscreen 設為 True,即可在啟動時隱藏一般視窗裝飾。請讓儲存的狀態與這個初始設定一致,否則第一次按下 F11 時,可能會將屬性設為原本已有的值。按下 Escape 會同時將儲存的狀態和視窗屬性設為 False。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import os
import tkinter as tk


class FullscreenExample:
    def __init__(self):
        self.window = tk.Tk()
        self.window.attributes("-fullscreen", True)
        self.fullscreen = True
        self.window.bind("<F11>", self.toggle_fullscreen)
        self.window.bind("<Escape>", self.leave_fullscreen)
        self.window.mainloop()

    def toggle_fullscreen(self, event=None):
        self.fullscreen = not self.fullscreen
        self.window.attributes("-fullscreen", self.fullscreen)

    def leave_fullscreen(self, event=None):
        self.fullscreen = False
        self.window.attributes("-fullscreen", False)


if __name__ == "__main__":
    try:
        FullscreenExample()
    except tk.TclError as error:
        display_error = str(error)

event 參數讓 Tkinter 能將按鍵事件傳給各個處理函式。如果不想另外儲存狀態變數,可以使用 lambda 讀取目前的屬性值並將它反轉:

import os
import tkinter as tk

try:
    window = tk.Tk()
    window.attributes("-fullscreen", True)
    window.bind(
        "<F11>",
        lambda event: window.attributes(
            "-fullscreen", not window.attributes("-fullscreen")
        ),
    )
    window.bind("<Escape>", lambda event: window.attributes("-fullscreen", False))
    window.mainloop()
except tk.TclError as error:
    display_error = str(error)

不帶參數的 attributes("-fullscreen") 會讀取目前的值。這種做法可避免維護兩份必須保持同步的狀態。如果較大型的應用程式在離開全螢幕時也應關閉視窗,請將 Escape 綁定至一般的關閉處理函式。

在 Ubuntu 上使用 zoomed 視窗屬性

Ubuntu 的 Tk 視窗管理器支援 -zoomed 屬性,可將視窗最大化。這與無邊框的 -fullscreen 行為不同;若想使用桌面環境一般的最大化視窗樣式,請選擇此方式。此範例適用於 Ubuntu;若要用於其他 Linux 發行版或 macOS,請先另外確認其行為。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import os
import tkinter as tk


class UbuntuZoomedExample:
    def __init__(self):
        self.window = tk.Tk()
        self.window.attributes("-zoomed", True)
        self.zoomed = True
        self.window.bind("<F11>", self.toggle_zoomed)
        self.window.bind("<Escape>", self.leave_zoomed)
        self.window.mainloop()

    def toggle_zoomed(self, event=None):
        self.zoomed = not self.zoomed
        self.window.attributes("-zoomed", self.zoomed)

    def leave_zoomed(self, event=None):
        self.zoomed = False
        self.window.attributes("-zoomed", False)


if __name__ == "__main__":
    try:
        UbuntuZoomedExample()
    except tk.TclError as error:
        display_error = str(error)

與 Windows 範例相同,由於視窗啟動時已最大化,請將儲存的狀態初始化為 True。第一次按下 F11 時,視窗會還原;再次按下則會重新最大化。按下 Escape 會還原一般視窗狀態。如果目前環境的視窗管理器不支援此屬性,可以改用下方填滿螢幕並保留裝飾的方式,或在目標 Ubuntu 桌面環境中確認其行為。

填滿螢幕並保留視窗裝飾

若要保留標題列和邊框,請使用 winfo_screenwidth() 和 winfo_screenheight() 設定視窗要求的寬度與高度。geometry 方法接受例如 1440x900 這樣的尺寸;加上 +0+0 可將視窗放在螢幕左上角。視窗管理器裝飾也會占用空間,因此即使要求的客戶區尺寸與螢幕相同,視窗外框仍可能稍微超出螢幕範圍。此方式不會使用 -fullscreen,也不提供全螢幕切換功能。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import os
import tkinter as tk

try:
    window = tk.Tk()
    width = window.winfo_screenwidth()
    height = window.winfo_screenheight()
    window.geometry(f"{width}x{height}+0+0")
    window.mainloop()
except tk.TclError as error:
    display_error = str(error)

螢幕尺寸方法會回傳 Tkinter 所回報顯示器的像素尺寸。如果視窗需要限制在不含面板或 Dock 的工作區內,請改用符合該工作區的尺寸,而非整個螢幕的大小。如需 Tkinter 入門介紹,請參閱 Tkinter;如需了解 geometry 方法,請參閱 Tkinter Geometry Managers。