2011-12-18 14 views
5

Voglio creare un pannello a schermo intero che blocchi visivamente l'accesso a tutto sullo schermo (desktop, menu, Unity Panel, ecc in Ubuntu (11.10)), ma rimane al di sotto delle finestre aperte di altre applicazioni.Fullscreen Python TKinter o finestra wxPython, ma 'stai in fondo' a tutte le finestre?

Questo è principalmente per rendere il computer portatile a prova di bambino. Voglio che il bambino (4 anni) abbia accesso ad alcune app selezionate, ad es. gcompris, childs play, tux math, ecc. ma non proprio per altre app e impostazioni. Qualcosa come desktop personalizzato + pannello di avvio senza nulla da violare, nessun accesso ai file, ecc.

Voglio che il pannello contenga alcuni pulsanti che avviino altre applicazioni (usando subprocess.call) ma il pannello stesso deve rimanere sotto tutto ciò che viene lanciato da esso o per rendere le cose più facili solo così rimane sotto qualsiasi gioco a schermo intero aperto e ogni finestra aperta (anche quando il pannello si focalizza).

overrideredirect fullscreen di

Python Tkinter (True) sarebbe perfetto (con una password protetta pulsante di chiusura), se non il fatto che esso non consente ad altre applicazioni di apparire su di esso e non sono sicuro se è possibile farlo rimani al fondo di tutto.

Qualche idea su come modificare questo comportamento se possibile, o altri strumenti che mi consentano di farlo in python o in altro modo?

Edit: Informazioni aggiuntive:

ho capito quasi di lavoro ma un altro strano comportamento con overrideredirect (True). Potrei abbassare() l'app all'inizio e va bene, ma quando lo faccio con overrideredirect (True) l'app scompare completamente. Non a schermo intero codice di prova di seguito:

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

quando si esegue così com'è si aprirà una nuova finestra e premendo il tasto 'inferiore' lo invierà alla schiena, ma se si tolgono i commenti alla app.overrideredirect (True) linea e premere il pulsante l'app verrà ancora eseguita ma non sarà più visibile.

Modifica ... Ok, penso che ho capito:

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

Quindi, prima chiedo il window manager di ignorare la mia finestra, ma poi ho ancora voglia il wm fare qualcosa per il mio finestra ... ipocrazia :)

Altri modi per rimuovere la decorazione della finestra senza chiedere al wm di ignorare la finestra?

Modifica. Un altro aspetto del problema con uno strumento diverso: wxPython

Questa volta lo sto provando nel modo più semplice - utilizzando Boa Constructor. Mentre app.lower() su un frame con finestra ha funzionato bene con Tkinter, per qualche motivo ho un problema con wxPython ora. Nel codice sottostante - premendo il pulsante si apre una finestra gedit sul Frame, che dopo 2 secondi il frame viene portato in alto e altri 2 secondi dopo dovrebbe cadere nella parte inferiore dello stack della finestra, ma ciò non accade, almeno non sulla mia 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 

se potevo fare Inferiore() lavorano in qualche modo si sarebbe fatto facilmente cioè .:

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

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

Ora corro a corto di idee, probabilmente mi limiterò a bastone per l'account Guest come suggerito.

+2

ne dite basta cliccare su "Cambia utente"> Guest? – unutbu

+0

Grazie per il suggerimento, vale la pena provare, abilitare Ospite e vedere se l'account "Ospite" è a prova di utente, intendo dire "non leggendo random clicker", ma chiedendo comunque se è possibile bloccare tutto con python :) – Ireneusz

risposta

2

Ecco come ho impostato la posizione della finestra in pygame su Windows. Con questo, coprirà tutte le altre finestre, se si modifica il -1 in un 1 sarà dietro altre finestre, so solo che funziona 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) 

Fare un FULLSCREEN finestra è fatto con:

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