我在我的Raspberry Pi上使用Tkinter和Python 3.2.3,我正在尝试制作一个按钮,以切换窗口是否全屏。我遇到了两个问题:
首先,当我使用Root.overrideredirect(True)
时,一切都很完美,但是当我使用Root.overrideredirect(False)
时,没有任何反应,窗口也没有重新获得它的边界。
其次,当我使用Root.geometry("{0}x{1}+0+0".format(Root.winfo_screenwidth(), Root.winfo_screenheight()))
时,按钮(我构建为自动居中)自动重新对齐到屏幕中心,但窗口本身不会改变大小。
为什么会这样,我该如何使它发挥作用?
尝试解决方案后,这是目前的情况:
Root = Tk()
Mark0 = False
def Loop(): #Always looping
if Fullscreen.get() and not Mark0:
Root.overrideredirect(True)
Root.geometry("{0}x{1}+0+0".format(Root.winfo_screenwidth(), Root.winfo_screenheight()))
Root.withdraw()
Root.deiconify()
Mark0 = True
elif not Fullscreen.get() and Mark0:
Root.overrideredirect(False)
Root.geometry("320x240")
#Root.withdraw()
#Root.deiconify()
Mark0 = False
Root.after(5, Loop)
结果:
-Toggle On 1:
-Window失去边界
-Toggle Off 1:
-Window被推入屏幕的左上角
-Border仍然缺失
-Toggle On 2:
-Window正确地全屏显示
- 从Toggle Off 1
进一步切换重复Root = Tk()
Mark0 = False
def Loop(): #Always looping
if Fullscreen.get() and not Mark0:
Root.overrideredirect(True)
Root.geometry("{0}x{1}+0+0".format(Root.winfo_screenwidth(), Root.winfo_screenheight()))
Root.withdraw()
Root.deiconify()
Mark0 = True
elif not Fullscreen.get() and Mark0:
Root.overrideredirect(False)
Root.geometry("320x240")
Root.withdraw()
Root.deiconify()
Mark0 = False
Root.after(5, Loop)
结果:
-Toggle On 1:
-Window失去边界
-Toggle Off 1:
-Window重获边界
-Toggle On 2:
-Window消失
有任何解释吗?
答案 0 :(得分:1)
我发现解决方案很复杂,但我的代码不起作用的原因是因为tkinter的主循环似乎只能处理每个循环对窗口的一次更改(并且它似乎每秒循环大约200次) 。因此,做
Root = Tk()
Root.geometry("1000x1000")
Root.overrideredirect(True)
将导致tkinter仅处理覆盖重定向,并忘记几何。解决方案是使用Root.after(int,func)调用overrideredirect并在5毫秒以后跟进函数(撤销和取消图标化)。
不幸的是,尽管它仍然不稳定(尽管通常有效)。我最好的猜测是,如果CPU过载了程序或中断或诸如此类的东西,它可能导致tkinter主循环的速度变得混乱,导致其中一个函数调用被忽略。这在大多数计算机上可能不是问题,但在Raspberry Pi上肯定是一个问题。
答案 1 :(得分:0)
您需要撤消然后重新显示该窗口,以便可以通知窗口管理器它需要重绘(或删除)边框。使用根窗口的withdraw
和deiconify
方法。