Der folgende Code funktioniert in MS Windows ordnungsgemäß (das Skript wird beim Drücken von q beendet):

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("{0}x{1}+0+0".format(
            self.root.winfo_screenwidth(), self.root.winfo_screenheight())
        )
        self.root.overrideredirect(True)
        tk.Label(text="some text here").grid()
        self.root.bind('q', self.appexit)
        self.root.mainloop()

    def appexit(self, event):
        self.root.destroy()

App()

Ich habe versucht, es in einer Debian-Umgebung ohne Fenstermanager auszuführen (Boot to Console, startx ausführen, wodurch das Skript über .xinitrc gestartet wird (der einzige Befehl dort)).

Das Skript startet wie erwartet, aber das Drücken von q bewirkt nichts (ich hatte erwartet, dass X geschlossen wird und zur Textkonsole zurückkehrt). Ich habe später versucht, nur für den Fall self.root.focus() vor dem mainloop() hinzuzufügen, aber es hat nicht geholfen.

Was könnte der Grund für dieses unterschiedliche Verhalten zwischen der MS Windows- und der Debian-Umgebung sein?

0
WoJ 29 Nov. 2013 im 17:33

3 Antworten

Beste Antwort

Mit overrideredirect verliert das Programm die Verbindung zur Fensterverwaltung, so dass es den Anschein hat Ich kann keine Informationen über gedrückte Tasten erhalten und selbst diese können nicht fokussiert werden.

MS Windows ist ein großer Fenstermanager, daher scheint overrideredirect auf diesem System nicht zu funktionieren.

Vielleicht könnten Sie self.root.attributes('-fullscreen', True) anstelle von self.root.overrideredirect(True) verwenden


Übrigens: Zum Testen benutze ich self.root.after(5000, self.root.destroy) - um das Fenster nach 5s zu beenden, wenn ich es nicht kontrollieren kann.


BEARBEITEN:

Ein (funktionierendes) Beispiel mit fullscreen.

Mit overrideredirect unter Linux kann das Programm Tastaturereignisse abrufen, sodass die Bindung nicht funktioniert und Sie sich nicht auf Entry() konzentrieren können. Aber Maus und Button() funktionieren. overrideredirect ist gut für "Begrüßungsbildschirm" mit oder ohne Schaltflächen.

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()

        # this works

        self.root.attributes('-fullscreen', True)

        # this doesn't work

        #self.root.overrideredirect(True)
        #self.root.geometry("800x600+100+100") # to see console behind
        #self.root.after(5000, self.appexit) # to kill program after 5s

        self.root.bind('q', self.q_pressed)

        tk.Label(text="some text here").grid()
        e = tk.Entry(self.root)
        e.grid()
        e.focus() # focus doesn't work with overrideredirect 

        tk.Button(self.root, text='Quit', command=self.appexit).grid()

        self.root.mainloop()

    def q_pressed(self, event):
        print "q_pressed"
        self.root.destroy()

    def appexit(self):
        print "appexit"
        self.root.destroy()

App()
1
furas 2 Dez. 2013 im 18:49

Wenn eine Tastenbelegung nicht funktioniert, hat das Fenster, dem die Bindung zugeordnet ist, wahrscheinlich nicht den Tastaturfokus. In Ihrer Situation ohne Fenstermanager hat Ihr Programm wahrscheinlich keinen Tastaturfokus.

Sie können versuchen, den Fokus mit root.focus_force() zu erzwingen. Dadurch wird manchmal ein Fenster fokussiert, auch wenn die Anwendung als Ganzes nicht die Vordergrund-App ist. Dies hängt etwas vom Fenstermanager oder dessen Fehlen ab.

1
Bryan Oakley 2 Dez. 2013 im 22:34

Das funktioniert normalerweise bei mir:

def appexit(self, event):
    self.root.quit() # end mainloop
    self.root.destroy()
-1
User 29 Nov. 2013 im 14:17