简体   繁体   中英

Fullscreen Python TKinter or wxPython window, but 'stay at the bottom' of all windows?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM