python运行停留窗口,全屏Python TKinter或wxPython窗口,但是“停留在所有窗口的底部”吗?...

I want to create a fullscreen panel that visually blocks access to everything on the screen (desktop, menu, Unity Panel, etc in Ubuntu (11.10)), but stays below other applications' opened windows.

This is mainly to make the laptop child proof. I want the kid (4 years old) to have access to some selected apps ie. gcompris, childs play, tux math, etc. but not really to other apps and settings. Something like custom desktop + launcher panel without anything to break, no access to files, etc.

I want the panel to contain some buttons that would start other applications (using subprocess.call) but the panel itself needs to stay under anything that's launched from it or to make things easier just so it stays under any opened fullscreen games and every opened window (even when the panel takes focus).

Python tkinter's fullscreen overrideredirect(True) would be perfect (with a password protected close button) if not the fact that it does not allow other applications to appear over it and I'm not sure if it is possible to make it stay at the bottom of everything.

Any idea how to change this behavior if possible, or any other tools that would enable me to do this in python or otherwise?

Edit: additional info:

I have got it nearly working but another strange behaviour with overrideredirect(True). I could lower() the app at the start and its ok, but when I do it with the overrideredirect(True) the app disappears completely. Non-fullscreen testing code below:

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

when you run it as it is it will open new window and pressing the 'Lower' button will send it to the back, but if you uncomment the app.overrideredirect(True) line and press the button the app will still run but will no longer be visible.

Edit...

Ok, I think I get it:

>>>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.

...

So, first I am asking the window manager to ignore my window, but later I still want the wm to do something to my window... hypcracy :)

Any other ways to strip window decoration without asking the wm to ignore the window?

Edit. Another look at the problem with a different tool - wxPython

This time I'm trying it the easy way - using the Boa Constructor. While app.lower() on a windowed Frame worked fine with Tkinter, for some reason I have a problem with wxPython now. In the code below - pressing the button opens a gedit window over the Frame, than 2 seconds later frame is brought to the top and another 2 seconds later it should fall to the bottom of the window stack, but that does not happen, at least not on my 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

if I could make the Lower() work somehow it would be easily done by ie.:

def OnFrame1Activate(self, event):

self.ShowFullScreen(True)

def OnFrame1EnterWindow(self, event):

self.Lower()

Now I run out of ideas, probably I will just stick to the Guest Account as suggested.

解决方案

This is how I set the window position in pygame on windows.

With this, it will cover all other windows, if you change the -1 to a 1 it will be behind other windows, I only know it works in 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)

Making a window FULLSCREEN is done with:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值