全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?

Posted

技术标签:

【中文标题】全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?【英文标题】:Fullscreen Python TKinter or wxPython window, but 'stay at the bottom' of all windows? 【发布时间】:2012-01-23 02:47:20 【问题描述】:

我想创建一个全屏面板,在视觉上阻止对屏幕上所有内容的访问(Ubuntu (11.10) 中的桌面、菜单、Unity 面板等),但保持在其他应用程序打开的窗口下方。

这主要是为了使笔记本电脑儿童安全。我希望孩子(4 岁)能够访问一些选定的应用程序,即。 gcompris、childs play、tux math 等,但对其他应用程序和设置而言并非如此。诸如自定义桌面+启动器面板之类的东西,没有任何东西可以破坏,无法访问文件等。

我希望面板包含一些可以启动其他应用程序的按钮(使用 subprocess.call),但面板本身需要停留在从它启动的任何东西下,或者为了让事情变得更容易,这样它就可以停留在任何打开的全屏游戏和每个打开的窗口(即使面板获得焦点)。

Python tkinter 的全屏 overrideredirect(True) 将是完美的(带有受密码保护的关闭按钮),如果不是因为它不允许其他应用程序出现在它上面而且我不确定是否有可能让它保持不变在一切的底部。

知道如果可能的话如何改变这种行为,或者任何其他可以让我在 python 或其他方式中做到这一点的工具?

编辑:附加信息:

我已经让它几乎可以工作了,但是 overrideredirect(True) 的另一个奇怪行为。我可以在开始时降低()应用程序并且没问题,但是当我使用 overrideredirect(True) 执行此操作时,应用程序会完全消失。非全屏测试代码如下:

from tkinter import *

def btn1_click():app.quit();app.destroy()
def btn2_click():app.lower()    
def handler():
    if tkinter.messagebox.askyesno("Quit?", "Are you sure you want to quit?"):
        app.quit();app.destroy()

app = Tk()
app.title("Testing...")
app.geometry('300x100+200+100')
#app.overrideredirect(True) 
#app.lower()

b1 = Button(app, text = "Exit!", width = 10, command = btn1_click);b1.pack()
b2 = Button(app, text = "Lower", width = 10, command = btn2_click);b2.pack()
app.protocol("WM_DELETE_WINDOW", handler)
app.mainloop()

当您按原样运行它时,它将打开新窗口并按下“降低”按钮会将其发送到后面,但如果您取消注释 app.overrideredirect(True) 行并按下按钮,应用程序仍将运行但将不再可见。

编辑... 好的,我想我明白了:

>>>help(tkinter)
...
     |  overrideredirect = wm_overrideredirect(self, boolean=None)
     |      Instruct the window manager to ignore this widget
     |      if BOOLEAN is given with 1. Return the current value if None
     |      is given.
...

所以,首先我要求窗口管理器忽略我的窗口,但后来我仍然希望 wm 对我的窗口做一些事情......虚伪:)

在不要求 wm 忽略窗口的情况下剥离窗口装饰的任何其他方法?

编辑。用不同的工具再看问题 - wxPython

这次我尝试了一种简单的方法 - 使用 Boa 构造函数。虽然窗口框架上的 app.lower() 在 Tkinter 上运行良好,但由于某种原因,我现在遇到了 wxPython 的问题。在下面的代码中 - 按下按钮在 Frame 上打开一个 gedit 窗口,2 秒后框架被带到顶部,另外 2 秒后它应该落到窗口堆栈的底部,但至少不会发生这种情况不在我的 Ubuntu 上。

def OnButton3Button(self, event):
    subprocess.call("gedit") #opens gedit above the Frame
    time.sleep(2) #waits for 2 seconds
    self.Raise() #brings the Frame to the top
    time.sleep(2) #waits for another 2 seconds
    self.Lower() #should Lower the Frame to the bottom, but it doesn't

如果我可以让 Lower() 以某种方式工作,那么 ie 很容易做到:

def OnFrame1Activate(self, event):
    self.ShowFullScreen(True)

def OnFrame1EnterWindow(self, event):
    self.Lower()

现在我的想法已经用完了,可能我会按照建议坚持使用访客帐户。

【问题讨论】:

点击“切换用户”>访客怎么样? 感谢您的建议,值得一试,将启用访客并查看“访客”帐户是否是用户证明,我的意思是“不阅读随机点击器”证明,但仍然想知道是否可以用python阻止一切:) 【参考方案1】:

这就是我在 pygame on windows 中设置窗口位置的方式。 这样,它将覆盖所有其他窗口,如果将 -1 更改为 1 它将位于其他窗口之后,我只知道它在 Windows 中有效。

import pygame, time, datetime, ctypes
from pygame.locals import *
from ctypes import windll

pygame.init()
set_window_pos = windll.user32.SetWindowPos
monitorsize = ctypes.windll.user32
resolution_X = monitorsize.GetSystemMetrics(0)
resolution_Y = monitorsize.GetSystemMetrics(1)

screen = pygame.display.set_mode((255, 242), pygame.NOFRAME)
set_window_pos(pygame.display.get_wm_info()['window'], -1, (resolution_X - 255), 50, 0, 0, 0x0001)

制作一个全屏窗口是通过以下方式完成的:

screen = pygame.display.set_mode((800, 350), FULLSCREEN) # this works in linux

【讨论】:

以上是关于全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?的主要内容,如果未能解决你的问题,请参考以下文章

python Tkinter 全屏显示

在 Tkinter 上显示全屏模式

在 Tkinter 上显示全屏模式

强制 Tkinter 窗口停留在全屏顶部 - Windows 10

Python图像全屏显示

了解Tkinter窗口几何