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()
9条答案
按热度按时间wlzqhblo1#
你可以通过打电话
yuvru6vn2#
如果你想将fullscreen属性设置为True,那么很容易:
但是,它不显示标题栏。如果你想让它保持可见,你可以使用
geometry()
方法调整Tk元素的大小:使用
winfo_width()
和winfo_height()
可以获取窗口的宽度和高度,还可以将事件处理程序绑定到<Configure>
事件:iklwldmw3#
使用“缩放”属性显示带有标题栏的最大化窗口
u0sqgete4#
我在其他网站上找到了这个:
这解决了我的问题。
knpiaxh15#
第一种方法是使用
root.state('zoomed')
,但不应该是普遍可用的。它可以在Windows和我的Ubuntu机器上工作。然而,在我的Arch机器下,它没有。第二种方法是先获取 maxsize,然后手动设置几何体,如:
这适用于大多数机器,但不是所有机器。例如,在Arch下,
maxsize()
返回(1425, 870)
,而最大化窗口的真实的几何应该是(1440, 848)
。所以,你也不能依赖它。第三,在我看来,最好的方法是使用
root.wm_attributes('-zoomed', 1)
。它是普遍可用的,似乎是最安全的。在一些机器上只能按宽度或高度缩放,但与以前的方法相比,这个方法永远不会给予你一个部分在屏幕外的窗口。最后,如果你想要一个全屏,而不仅仅是缩放窗口,使用
root.wm_attributes('-fullscreen', 1)
。它提供了一个到窗口管理器行为的本地链接,因此比使用overrideredirect
和手动设置几何图形(在某些平台上可能导致非托管窗口,只能通过自己的界面关闭或杀死进程,不会显示在任务栏上等)要好得多。31moq8wy6#
最有意思的是“
root.wm_state('zoomed')
,正如@J.F.塞巴斯蒂安提到的bvjveswy7#
我最近遇到了一个类似的问题,我支持的一个库也需要添加Windows 10作为开发目标。感谢我在这里找到的信息,这就是我们现在正在做的:
然后在主窗口类的
__init__()
中然后当窗口关闭时:
23c0lvtd8#
正如tcl/tk的官方文档所述,
wm_attributes('-zoomed', True)
:请求将窗口最大化。这与在Windows和Mac OS X上缩放的wm状态相同。
这意味着
wm_state('zoomed')
在Mac和Windows上工作,而您需要在X11**上使用wm_attributes('-zoomed', True)
**来最大化窗口。tquggr8v9#
使用TkAgg作为后端,这是唯一一个在没有全屏的情况下最大化窗口的组合: