我想将一个窗口初始化为最大化,但是我不知道该如何实现。我正在使用Python 3.3和Windows 7上的Tkinter 8.6。我猜答案就在这里:http://www.tcl.tk/man/tcl/TkCmd/wm.htm#m8,但我不知道该如何将其输入到我的Python脚本中。
此外,我需要获取窗口的宽度和高度(无论是最大化还是用户重新调整后),但我想我可以自己找到答案。
此外,我需要获取窗口的宽度和高度(无论是最大化还是用户重新调整后),但我想我可以自己找到答案。
你可以通过调用来实现
root.state('zoomed')
如果你想将全屏属性设置为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)
root.overrideredirect(True)
(移除标题栏) - jfsTk.overrideredirect
函数并不能直接移除它。相反,在Windows上,它告诉Windows窗口管理器完全忽略该窗口,因此该窗口不会有框架或标题栏。 - Nummer_42O使用 'zoomed' 属性显示带标题栏的最大化窗口
root = Tk()
root.attributes('-zoomed', True)
'-zoomed'
在 Windows 版本中不可用。 - IAbstractroot.attributes('-zoomed', True)
对我有效,而 root.wm_state('zoomed')
则无效。 - jfs我在其他网站上找到了这个:
import Tkinter
MyRoot = Tkinter.Tk()
MyRoot.state("zoomed")
MyRoot.mainloop()
这解决了我的问题。
第一种方法是使用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
等方法更加有效(在某些平台上,这些方法可能导致未受管理的窗口,该窗口只能通过其自己的界面或杀死进程来关闭,在任务栏上不会显示等)。root.wm_state('zoomed')
,就像@J.F.Sebastian所提到的那样。zoomed
。 - buhtz最近我遇到了一个类似的问题,我正在支持的一个库也需要将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()
正如Tcl/Tk官方文档所述,对于wm_attributes('-zoomed', True)
:
请求窗口最大化。在Windows和Mac OS X上,这与wm state zoomed相同。
这意味着wm_state('zoomed')
适用于Mac和Windows,而您需要在X11上使用wm_attributes('-zoomed', True)
来最大化窗口。
使用TkAgg作为后端,这是唯一的组合,可以最大化窗口而不需要全屏:
win_manager = plt.get_current_fig_manager()
win_manager.window.state('zoomed')
win_manager.full_screen_toggle()