2011-12-18 139 views
5

Quiero crear un panel de pantalla completa que bloquea visualmente el acceso a todo en la pantalla (escritorio, menú, Unity Panel, etc. en Ubuntu (11.10)), pero permanece debajo de las ventanas abiertas de otras aplicaciones.Pantalla completa Python TKinter o ventana de wxPython, pero "quédate en la parte inferior" de todas las ventanas?

Esto es principalmente para hacer que la computadora portátil sea a prueba de niños. Quiero que el niño (4 años) tenga acceso a algunas aplicaciones seleccionadas, es decir. gcompris, childs play, tux math, etc., pero no realmente a otras aplicaciones y configuraciones. Algo así como escritorio personalizado + panel de iniciador sin nada que romper, sin acceso a archivos, etc.

Quiero que el panel contenga algunos botones que iniciarían otras aplicaciones (usando subprocess.call) pero el panel en sí tiene que permanecer bajo cualquier cosa que se inicie a partir de ella o para facilitar las cosas, de modo que permanezca en cualquier juego abierto de pantalla completa y en cada ventana abierta (incluso cuando el panel se enfoca).

Python tkinter a pantalla completa overrideredirect (True) sería perfecto (con un botón de cierre protegido con contraseña) si no es el hecho de que no permite que otras aplicaciones aparezcan sobre él y no estoy seguro de si es posible hacerlo alójate en el fondo de todo.

¿Alguna idea de cómo cambiar este comportamiento si es posible, o cualquier otra herramienta que me permita hacer esto en python o de otra manera?

Editar: Información adicional:

lo tengo casi trabajando pero otro comportamiento extraño con overrideredirect (Verdadero). Podría bajar() la aplicación al principio y está bien, pero cuando lo hago con overrideredirect (True) la aplicación desaparece por completo. No pantalla completa código de prueba a continuación:

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

cuando se ejecuta, ya que es se abrirá una nueva ventana y pulsando el botón 'Baja', lo enviará a la parte de atrás, pero si se quite la app.overrideredirect (Verdadero) línea y presione el botón, la aplicación seguirá ejecutándose pero ya no estará visible.

Editar ... Ok, creo que lo entiendo:

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

Así, en primer lugar pido al gestor de ventanas no hacer caso de mi ventana, pero más tarde todavía quiero el wm que hacer algo para mi ventana ... hipócrita :)

¿Alguna otra forma de quitar la decoración de la ventana sin pedirle a la mujer que ignore la ventana?

Editar. Otro vistazo al problema con una herramienta diferente - wxPython

Esta vez lo intento de la manera más fácil: usando el Boa Constructor. Mientras app.lower() en un Marco con ventana funcionó bien con Tkinter, por alguna razón tengo un problema con wxPython ahora. En el siguiente código: al presionar el botón, se abre una ventana de gedit sobre el fotograma, luego de 2 segundos el fotograma se lleva a la parte superior y otros 2 segundos más tarde, debe caer al final de la ventana, pero eso no sucede, al menos no en mi 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 

si podía hacer el Bajo() Trabajo de alguna manera sería hacer fácilmente es decir .:

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

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

Ahora me quedo sin ideas, probablemente solo se adherirá a la cuenta de invitado como sugirió.

+2

¿Qué tal haga clic en "Cambiar de usuario"> Pensiones? – unutbu

+0

Gracias por la sugerencia, vale la pena intentarlo, habilitará al Invitado y verá si la cuenta "Invitado" es a prueba del usuario, quiero decir "sin leer el clic aleatorio", pero aún me pregunto si es posible bloquear todo con Python :) – Ireneusz

Respuesta

2

Así es como configuro la posición de la ventana en pygame en las ventanas. Con esto, cubrirá todas las demás ventanas, si cambia el -1 a un 1 estará detrás de otras ventanas, solo sé que funciona en 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) 

Realización de una ventana FULLSCREEN se hace con:

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