1

我在我的 Raspberry Pi 上使用带有 Python 3.2.3 的 Tkinter,我正在尝试制作一个检查按钮来切换窗口是否全屏。我遇到了两个问题:

首先,当我使用 时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 失去边框

- 关闭 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)

结果是:

-Toggle On 1:
-Window 失去边框

-Toggle Off 1:
-Window 重新获得边框

- 切换2: -
窗口消失

有什么解释吗?

4

2 回答 2

1

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

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

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

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

于 2013-06-27T01:24:00.330 回答
0

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

于 2013-06-19T11:27:49.097 回答