【问题标题】:Toggle Fullscreen (overrideredirect and geometry)切换全屏(覆盖重定向和几何)
【发布时间】:2013-06-19 03:26:29
【问题描述】:

我在我的 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)

结果:

-打开 1:
-窗口失去边框

-关闭 1:
- 窗口被推到屏幕的左上角
- 边界仍然缺失

-开启 2:
-窗口正常全屏

-从 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)

结果:

-打开 1:
-窗口失去边框

-关闭 1:
-Window 恢复边框

-开启 2:
-窗口消失

有什么解释吗?

【问题讨论】:

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


    【解决方案1】:

    我发现解决方案很复杂,但我的代码不起作用的原因是因为 tkinter 的主循环似乎每次循环只能处理对窗口的一次更改(而且它似乎每秒循环大约 200 次) .因此,做

    Root = Tk()
    Root.geometry("1000x1000")
    Root.overrideredirect(True)
    

    将导致 tkinter 只处理覆盖重定向,而忘记几何。解决方案是使用 Root.after(int, func) 超过 5 毫秒后调用 overrideredirect 和后续函数(撤回和去图标化)。

    不幸的是,尽管如此,它仍然不稳定(尽管通常有效)。我最好的猜测是,如果 CPU 因程序或中断等而过载,可能会导致 tkinter 的主循环的速度混乱,从而导致其中一个函数调用被忽略。这在大多数计算机上可能不是问题,但在 Raspberry Pi 上肯定是一个问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 起初这种工作(窗口会失去边框,然后在我关闭全屏时自动进入左上角,然后在我第二次打开时正常全屏),但是当我添加了这些方法以在全屏关闭时将其返回到普通窗口,它只会在我第一次打开全屏时丢失边框,然后在全屏关闭时正确返回窗口,然后在第二次全屏时消失。
      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多