Tkinter Python 如何最大化窗口

53
我想将一个窗口初始化为最大化,但是我不知道该如何实现。我正在使用Python 3.3和Windows 7上的Tkinter 8.6。我猜答案就在这里:http://www.tcl.tk/man/tcl/TkCmd/wm.htm#m8,但我不知道该如何将其输入到我的Python脚本中。
此外,我需要获取窗口的宽度和高度(无论是最大化还是用户重新调整后),但我想我可以自己找到答案。
9个回答

120

你可以通过调用来实现

root.state('zoomed')

5
也适用于Windows,不像root.attributes('-zoomed', True)。 - tgikal
1
使用Python 3.9 | Windows操作系统工作。 - Faraaz Kurawle
这在Linux中不起作用。请参见下面azeeman的答案。 - relent95

60

如果你想将全屏属性设置为True,那么很容易:

root = Tk()
root.attributes('-fullscreen', True)

不过,它不显示标题栏。如果您想保持可见,可以使用 geometry() 方法调整 Tk 元素的大小:

root = Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))

通过 winfo_width()winfo_height() 函数,你可以获取窗口的宽度和高度,并且你也可以绑定一个事件处理器到 <Configure> 事件:

def resize(event):
    print("New size is: {}x{}".format(event.width, event.height))

root.bind("<Configure>", resize)

2
还有root.overrideredirect(True)(移除标题栏) - jfs
只要我有一个显示器,这个代码就可以正常工作。我该如何修改代码,使其仅在一个显示器上最大化,而不是跨越整个虚拟桌面? - graywolf
非常出色的工作,这两个解决方案都可以根据您是否需要标题栏来使用。 - bretcj7
1
这并不会将窗口最大化,正如您可以在右上角的三个小按钮中看到的那样。使用整个屏幕与最大化窗口是不同的。 - buhtz
将Windows位置设置为0|0在Windows上不起作用,因为标题栏和窗口管理器中的其他内容会影响它。@jfs但是Tk.overrideredirect函数并不能直接移除它。相反,在Windows上,它告诉Windows窗口管理器完全忽略该窗口,因此该窗口不会有框架或标题栏。 - Nummer_42O

44

使用 'zoomed' 属性显示带标题栏的最大化窗口

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

4
它不仅在Windows上运行,它在Xubuntu上也运行得很好。 - Brōtsyorfuzthrāx
2
适用于Ubuntu 14.04 - J.F下次最好自己检查一下。 - Yekhezkel Yovel
正如其他人所述,'-zoomed' 在 Windows 版本中不可用。 - IAbstract
@Sylvester Kruin:明确一下:在Ubuntu 18.04上,root.attributes('-zoomed', True) 对我有效,而 root.wm_state('zoomed') 则无效。 - jfs
@jfs 我可以确认,如果你使用win.state("zoomed")函数进行设置,zoomed在Windows上是可行的。 - codingCat
显示剩余2条评论

15

我在其他网站上找到了这个:

import Tkinter

MyRoot = Tkinter.Tk()
MyRoot.state("zoomed")

MyRoot.mainloop()

这解决了我的问题。


2
@user3292534的答案的副本。 - martineau

12

第一种方法是使用root.state('zoomed'),但不一定适用于所有情况。它可以在Windows和我的Ubuntu机器上工作。然而,在我的Arch机器上,它不起作用。


第二种方法是先获取maxsize,然后手动设置几何尺寸,例如:

m = root.maxsize()
root.geometry('{}x{}+0+0'.format(*m))
这对大多数机器都有效,但并非所有机器都有效。例如,在我的 Arch 下,maxsize() 返回 (1425, 870),而最大化窗口的实际几何尺寸应为 (1440, 848)。因此,您也不能依赖它。
第三种方法,我认为是最好的方法,是使用 root.wm_attributes('-zoomed', 1)。它是普遍可用的,似乎也是最安全的。在某些机器上,它可能仅按宽度或高度缩放,但与之前的方法相比,这个方法永远不会使窗口部分超出屏幕。
最后,如果您想要一个全屏幕而不仅仅是缩放的窗口,请使用 root.wm_attributes('-fullscreen', 1)。它提供了一个原生链接到窗口管理器的行为,因此比手动设置几何形状和使用 overrideredirect 等方法更加有效(在某些平台上,这些方法可能导致未受管理的窗口,该窗口只能通过其自己的界面或杀死进程来关闭,在任务栏上不会显示等)。

3
最Pythonic的方法是" root.wm_state('zoomed'),就像@J.F.Sebastian所提到的那样。

3
无法在Python3.6及Tkinter 8.6上工作。不允许使用zoomed - buhtz

0

最近我遇到了一个类似的问题,我正在支持的一个库也需要将Windows 10添加为开发目标。感谢我在这里找到的信息,现在我们正在做以下操作:

class INI_Link:
    """A connector class between a value stored in an ini file, and a value stored elsewhere that can be get and set with two helper functions."""
    def __init__(self, getter, setter, varname, inigroup="Settings", inifile=''):
        """Remember that getter is called first to provide the default value.
        Then the ini value is read if available, if not the default value is used."""
        self._get = getter
        self._set = setter
        self._save = lambda value :inidb(inifile)[inigroup].__setitem__(varname, getter())
        self._load = lambda :inidb(inifile)[inigroup].get(varname, getter())

        #first load
        self._lastvalue = self._load()
        print(self._lastvalue)
        self._set(self._lastvalue)


        self._callbacks=[]
    def trace(self, callback, mode='w'):
        """this only traces for .value.set() not for changes to the underlying value in either location.
        if you never touch this again until .commit() at the end of your program, then it will never trigger until then.
        call .probe() to force to check for changes without returning anything."""
        self.callbacks.append(callback)
    def probe(self):
        """check for changes, if there have been any, allert all traces."""
        self._monitor(self._get())
    def __get__(self):
        value = self._get()
        self._monitor(value)
        return value
    def __set__(self, value):
        self._set(value)
        self._save(value)
        self._monitor(value)
    def _monitor(value):
        "helper to dispatch callbacks"
        if value != self._lastvalue:
            self._lastvalue = value
            for cb in self._callbacks:
                try:
                    cb()
                except:
                    pass
    def commit(self):
        """Call this right before getter is no longer useful."""
        self._save(self._get())

然后在主窗口类的__init__() 函数中

    self._geometry = INI_Link(self.tkroot.geometry, self.tkroot.geometry, "window_geometry")
        try:
            #umbuntu and others, not arch
            self._zoomed = INI_Link(lambda:self.tkroot.wm_attributes('-zoomed'),
                                    lambda z: self.tkroot.wm_attributes('-zoomed', z)
                                    , "window_zoomed")
        except:
            #windows and others, not umbuntu
            self._zoomed = INI_Link(lambda: self.tkroot.state() == 'zoomed',
                                    lambda z: self.tkroot.state(['normal','zoomed'][z])
                                    , "window_zoomed")

然后当窗口被关闭时:

            #save zoomed state.
            self._zoomed.commit()
            try:
                if self.tkroot.wm_attributes('-zoomed'):
                    self.tkroot.wm_attributes('-zoomed', False)
                    self.tkroot.update()
            except:
                if self.tkroot.state() != 'normal':
                    self.tkroot.state('normal')
                    self.tkroot.update()
            #save window size in normal state
            self._geometry.commit()

0

正如Tcl/Tk官方文档所述,对于wm_attributes('-zoomed', True)

请求窗口最大化。在Windows和Mac OS X上,这与wm state zoomed相同。

这意味着wm_state('zoomed')适用于Mac和Windows,而您需要在X11上使用wm_attributes('-zoomed', True)来最大化窗口。


-1

使用TkAgg作为后端,这是唯一的组合,可以最大化窗口而不需要全屏:

win_manager = plt.get_current_fig_manager()
win_manager.window.state('zoomed')
win_manager.full_screen_toggle()

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