切换全屏(overrideredirect和几何)

时间:2013-06-19 03:26:29

标签: python-3.x tkinter raspberry-pi

我在我的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消失

有任何解释吗?

2 个答案:

答案 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)

您需要撤消然后重新显示该窗口,以便可以通知窗口管理器它需要重绘(或删除)边框。使用根窗口的withdrawdeiconify方法。