2015-06-24 85 views
11

Ho riscontrato un problema durante la creazione di un'applicazione Python 3 tkinter. Attualmente sto sviluppando utilizzando un sistema Mac OSX, ma normalmente utilizzo un sistema operativo Windows.Applicazione a schermo intero Python 3 Tkinter Borderless

Vorrei che l'applicazione occupasse l'intero schermo senza che la barra del titolo di Window Manager e la cornice fossero intorno all'applicazione, spesso riferita a una finestra senza bordi a pieno schermo nei giochi.

Ho provato a utilizzare root.attributes("-fullscreen", True) con root.overrideredirect(True) e root.wm_attributes("-topmost", 1). Tuttavia l'inclusione della linea root.overrideredirect(True) non gli consente di andare a schermo intero corretto; mostra ancora il Dock del Mac e la barra delle applicazioni, e interrompe anche i miei collegamenti alla tastiera nell'applicazione. Senza la riga root.overrideredirect(True), l'applicazione passa alla modalità a schermo intero (nascondendo il dock e la barra delle attività), ma la finestra non riempie l'intero schermo; lascia una fessura nella parte inferiore e mantiene anche la barra del titolo e il bordo/il bordo del gestore finestre.

Ecco un esempio del mio codice:

import tkinter as tk 

class App(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 

     self.parent = parent 

     self.initUI() 

    def initUI(self): 

     self.parent.title("Fullscreen Application") 

     self.pack(fill="both", expand=True, side="top") 

     self.parent.wm_state("zoomed") 

     self.parent.bind("<F11>", self.fullscreen_toggle) 
     self.parent.bind("<Escape>", self.fullscreen_cancel) 

     self.fullscreen_toggle() 

     self.label = tk.Label(self, text="Fullscreen", font=("default",120), fg="black") 
     self.label.pack(side="top", fill="both", expand=True) 

    def fullscreen_toggle(self, event="none"): 

     self.parent.focus_set() 
     self.parent.overrideredirect(True) 

     self.parent.attributes("-fullscreen", True) 
     self.parent.wm_attributes("-topmost", 1) 

    def fullscreen_cancel(self, event="none"): 

     self.parent.overrideredirect(False) 
     self.parent.attributes("-fullscreen", False) 
     self.parent.wm_attributes("-topmost", 0) 

     self.centerWindow() 

    def centerWindow(self): 

     sw = self.parent.winfo_screenwidth() 
     sh = self.parent.winfo_screenheight() 

     w = sw*0.7 
     h = sh*0.7 

     x = (sw-w)/2 
     y = (sh-h)/2 

     self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    App(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 

spero che qualcuno è in grado di aiutare! Grazie!

MODIFICA: L'ho appena provato sul mio computer Windows. Senza lo self.parent.overrideredirect(True), crea l'app e funziona perfettamente come desiderato (schermo intero senza il bordo di Window Manager o la barra del titolo). Questo deve essere solo un problema di OSX.

+1

Hai provato a cambiare la geometria della radice e aggiungere un extra 5 o qualcosa alla larghezza e/o all'altezza? – Elxafil

+0

Ho, purtroppo non ha funzionato. Grazie comunque per il suggerimento. :) – jacobian

+0

Selezionare una risposta o un commento sulla risposta che non ha soddisfatto la correzione richiesta. –

risposta

0

Per risolvere il problema OS-X fornirò una soluzione che risolve un problema simile per me. (Aveva alcuni problemi usando fullscreen tra Linux e Windows)

Volevi liberarti della barra dei gestori di finestre? Date un'occhiata a the docs indica un'opzione che rimuove gli elementi di gestione delle finestre usando l'opzione -toolwindow.

Per quanto riguarda le dimensioni della vostra applicazione qui è quello che mi ha aiutato con linux - un "zoom manuale":

class MyClass(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.overrideredirect(True) # depending on your needs 
     self.attributes("-toolwindow", 1) # this line removes the window managers bar 

     try:         # Automatic zoom if possible 
      self.wm_state("zoomed") 
      print("Using automatic zoom") 
     except tk.TclError:     # Manual zoom 
      # Bad Argument Error is a TclError 
      print("Using manual zoom") 

      # get the screen dimensions 
      width = self.winfo_screenwidth() 
      height = self.winfo_screenheight() 

      # build a geometry string. 
      # form: width x height + x_offset + y_offset 
      geom_string = "%dx%d+0+0" % (width, height) 
      self.wm_geometry(geom_string) 

prega di notare che non sto usando un tk.Tk non configurato() - Istanza qui - la mia la classe è the tk.Tk() - Istanza. Quindi non ho bisogno di sovrascrivere il genitore ma solo "me stesso" parlando del POV della classe.

+0

Le finestre degli strumenti hanno una barra del titolo senza icona, minimizza e massimizza il pulsante. Ha un titolo e un pulsante di chiusura. Questa non è una buona soluzione. –

0
#!/usr/bin/python 
import Tkinter as tk 

class App(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 

     self.parent = parent 

     self.initUI() 

    def initUI(self): 

     self.parent.title("Fullscreen Application") 

     self.pack(fill="both", expand=True, side="top") 

     self.parent.wm_state("zoomed") 

     self.parent.bind("<F11>", self.fullscreen_toggle) 
     self.parent.bind("<Escape>", self.fullscreen_cancel) 

     self.fullscreen_toggle() 

     self.label = tk.Label(self, text="Fullscreen", font=("default",120), fg="black") 
     self.label.pack(side="top", fill="both", expand=True) 

    def fullscreen_toggle(self, event="none"): 

     self.parent.focus_set() 
     self.parent.overrideredirect(True) 
     self.parent.overrideredirect(False) #added for a toggle effect, not fully sure why it's like this on Mac OS 
     self.parent.attributes("-fullscreen", True) 
     self.parent.wm_attributes("-topmost", 1) 

    def fullscreen_cancel(self, event="none"): 

     self.parent.overrideredirect(False) 
     self.parent.attributes("-fullscreen", False) 
     self.parent.wm_attributes("-topmost", 0) 

     self.centerWindow() 

    def centerWindow(self): 

     sw = self.parent.winfo_screenwidth() 
     sh = self.parent.winfo_screenheight() 

     w = sw*0.7 
     h = sh*0.7 

     x = (sw-w)/2 
     y = (sh-h)/2 

     self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    App(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 
+0

Se vuoi essere più specifico [collegamento] (https://stackoverflow.com/questions/44328765/how-do-i-display-a-tkinter-application-in-fullscreen-on-macos) – Gumboy