Fullscreenmodus/Dialoge und Tkinter unter Ubuntu und MAC OS

Fragen zu Tkinter.
Antworten
kmansour
User
Beiträge: 9
Registriert: Mittwoch 14. Februar 2007, 15:07

Donnerstag 15. Februar 2007, 08:18

Hallo alle zusammen,
ich programmiere gerade einen Fullscreen Editor (hier).
Das Programm geht nach dem Start in den FullScreenmodus, bei Bedarf kommen noch einige Dialoge hoch. Unter Windows mit Python 2.5 und dem mitgeliefertem Tkinter ist das alles kein Problem.

Probleme habe ich, wenn ich das ganze unter Ubuntu oder MAC OS laufen lasen will (bei beiden Systemen die gleichen Probleme):
Das Program geht in den Fullscreenmodus, allerdings ist um die mittlere Editiertfläche ein Rahmen gezogen, der Cursor ist nicht sichtbar und ich kann nichts eingeben.
Unter Ubuntu geht es paradoxerweise nach unzähligen Alt-Tab Drücken irgendwann doch (der Rahmen verschwindet, Cursor und Text erscheinen, Eingabe möglich). Beim MAC nicht.
Versuche ich einen Dialog aufzurufen, erscheint wieder der Rahmen um die mittlere Editierfläche, der Text verschwindet und nichts geht mehr.

Fehlerausgaben/Exceptions gibt es KEINE.

Ich will den Source hier jetzt nicht komplett posten, er ist über den Link im Zip erhältlich.
Nur zwei Stellen davon (relevant ist Matrix.py).
Hier setze ich den Fullscreenmodus (w, h sind die ermittelten Screengrößen). Ein self.lift() hat nicht geholfen.

Code: Alles auswählen

def toggleFullScreen(self, event):
        if self.fullscreen==False:
            self.overrideredirect(1)
            self.geometry("%dx%d+0+0"%(self.w,self.h)) 
            self.fullscreen=True           
        else:
            self.overrideredirect(0)
            self.geometry("%dx%d+0+0"%(800,600))
            self.fullscreen=False

und hier ein Beispiel für einen Dialog der über dem Programm erscheinen sollte:

Code: Alles auswählen

def OnQuit(self,event):
        if self.modified==True:
            if tkMessageBox.askyesno("Text was modified", "Do you want to save before quitting ?"):
                self.OnSave(None)
        event.widget.quit()
Da es bei Windows geht vermute ich fast schon, dass es entweder ein Bug bei einem der OS ist oder aber, dass es eine bestimmte Version der TK Bibliothek sein muß. Ich habe leider keinen MAC und mein Ubuntu läuft in einer VM.
Natürlich kann ich auch einfach einen total dummen Fehler gemacht haben ;)

Wäre sehr dankbar für Hilfe.
kmansour
User
Beiträge: 9
Registriert: Mittwoch 14. Februar 2007, 15:07

Samstag 17. Februar 2007, 18:19

Hab ich die Frage schlecht formuliert oder kann mir keiner helfen ? ;)
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

Montag 19. Februar 2007, 20:39

Hallo kmansour,
kann deinen Fehler unter GNU/Linux(KDE-Oberfläche) bestätigen. Kann aber so keinen Programmierfehler finden. Wenn ich den Code so schreibe:

Code: Alles auswählen

import Tkinter

class Matrix_App:
        def __init__(self, master):
                self.master = master
                self.master.config(bg = 'black')
                self.w = self.master.winfo_screenwidth()
                self.h = self.master.winfo_screenheight()
                self.master.geometry('%dx%d+0+0' % (self.w,self.h))
                self.master.wm_overrideredirect(1)
                self.button = Tkinter.Button(self.master, bg = 'yellow', text = 'close', command = self.close)
                self.button.pack()
                self.master.mainloop()
                
        def close(self):
                self.master.destroy()
        
root = Tkinter.Tk()
matrix = Matrix_App(root)


klappt es bei mir auch GNU/Linux, mit dem Fullscreen ohne Menüleiste.
Vielleicht hilft dir das weiter.

Gruß Flano
kmansour
User
Beiträge: 9
Registriert: Mittwoch 14. Februar 2007, 15:07

Donnerstag 1. März 2007, 13:12

Danke für die Antwort,
habe das ganze mal umgeschrieben aber es geht trotzdem nicht.
Werde wohl alles auskommentieren müssen und dann stück für Stück wieder einbinden. Ich denke es wird ne Weile dauern weil ich eben keinen Linuxrechner habe :(
Benutzeravatar
wuf
User
Beiträge: 1477
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 4. März 2007, 02:08

Hallo kmansour

Ich habe Deinen Matrix-Editor unter LINUX SuSE-10.0
ausgetestet. Tkinter scheint ein Problem zu haben
bei der Fokusübergabe an ein Fenster, welches sich
im overrideredirect(TRUE)-Modus befindet.

Dies ist zu sehen wenn Du Dein Skriptkode wie folgt
abänderst:

Code: Alles auswählen

	def toggleFullScreen(self, event):
		if self.fullscreen==False:
			self.overrideredirect(1)
			#self.geometry("%dx%d+0+0"%(self.w,self.h))
			self.geometry("%dx%d+0+0"%(500,500))
			self.focus_force()
			self.fullscreen=True           
		else:
			self.overrideredirect(0)
			self.geometry("%dx%d+0+0"%(800,600))
			self.fullscreen=False
(Beim obigen Kodeabschnitt wird das EditorFenster
beim Start auf eine Grösse von 500 x 500 reduziert!
Somit bleibt genug Platz um ein Terminal-Konsole-
Fenster sichtbar neben dem Editor-Fenster zu platz-
ieren. Als weiteres wird diesem Fenster mit der
Methode self.focus_force() versucht den Fokus auf-
zuzwingen. Dies bewirkt das einblenden eines grünen
blinkenden Cursor im Editor-Fenster.)

Nach dem Du jetzt das Skript mit python Matrix.py
aus der Terminal-Konsole gestartet hast sollte
das Matrix-Editor-Fenster an der linken oberen
Ecke des Bildschirmes mit einem blinkenden grünen
Cursor dargestellt werden. Nun sollte man meinen
das Editor-Fenster besitzt den Fokus. Das komische
ist nur, dass der Fokus beim Fenster der Terminal-
Konsole bleibt sichtbar an der blau gefärbten Titel-
leiste. Über die Tastatur eingegeben Zeichen weden
aber in der Terminal-Konsole ausgegeben und nicht
an der Stelle des grünen Cursors im Editor-Fenster
Aus diesem Grund nimmt das Editorfenster auch kein
Editor-Kontrollbefehle entgegen. Das Programm kann
nur mit dem Befehl Ctrl-C in der Konsole beendet
werden da das Editor-Fenster Rahmenlos ist.

Nun ändere den Skriptkode wie folgt ab:

Code: Alles auswählen

	def toggleFullScreen(self, event):
		if self.fullscreen==False:
			self.overrideredirect(0)
			#self.geometry("%dx%d+0+0"%(self.w,self.h))
			self.geometry("%dx%d+0+0"%(500,500))
			self.fullscreen=True           
		else:
			self.overrideredirect(0)
			self.geometry("%dx%d+0+0"%(800,600))
			self.fullscreen=False
Starte das Skript wieder über die Terminal-Konsole
mit python Matrix.py. Jetzt wird in der linken oberen
Ecke des Bildschirms wieder das Editor-Fenster einge-
blendet. Das Editor-Fenster ist nun mit eine Titelleiste
ausgestattet, welche anzeigt das dieses Fenster den Fokus
besitzt. Im schwarzen Innenbereich des Editor-Fensters
ist wieder ein grüner blinkender Cursor zu sehen. Das
Fenster mit der Terminal-Konsole hat den Fokus verloren
und dem Editor-Fenster übergeben. Eingaben über die
Tastatur werden nun eindeutig dem Editor-Fenster zu-
gewiesen. Es werden auch alle Editor-Kontrollbefehle
angenommen!

Feststellung:
Hier liegt eventuell ein Fehlverhalten des TCL-Window-
manager unter LINUX, möglicherweise auch unter MAC vor.

Wie ich Deinem Post entnehme kannst Du dies auf Deinem
Rechner nicht unter LINUX auspropieren. Probiere das
obige einmal auf dem MAC aus. Mit Titelleiste funktioniert
Dein Matrix-Editor bei mir unter LINUX korrekt.

Hier folgt der Skriptkode für ein Editor-Fenster mit
Titelleiste und im Fullscreen-Modus:

Code: Alles auswählen

	def toggleFullScreen(self, event):
		if self.fullscreen==False:
			self.overrideredirect(0)
			self.geometry("%dx%d+0+0"%(self.w,self.h))
			self.fullscreen=True           
		else:
			self.overrideredirect(0)
			self.geometry("%dx%d+0+0"%(800,600))
			self.fullscreen=False
Viel Erfolg und Gruss von wuf :wink:
Zuletzt geändert von wuf am Sonntag 4. März 2007, 02:29, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1477
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 4. März 2007, 02:24

Frage an die Administratoren:

Feststellung mein Post wird nicht so angezeigt
wie ich es über den Forum-Editor eingegeben habe.

Ist mir eventuell ein Fehler unterlaufen?

Gruss wuf :wink:
Take it easy Mates!
BlackJack

Sonntag 4. März 2007, 12:02

Du scheinst den Text so eingegeben zu haben, dass er im Eingabetextfeld "gut" aussieht, dass solltest Du lassen. Manuelle Zeilenumbrüche sollten nur nach Absätzen stehen. Wie breit der Bereich für den Text bei der Anzeige später ist, hängt von der Fenstergrösse und Schrifteinstellung bei jedem einzelnen Besucher dieser Seite ab. Das ist HTML und kein PDF oder Druckerzeugnis, feste Grössen und Positionen darf man da nicht erwarten oder erzwingen wollen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 4. März 2007, 12:25

wuf hat geschrieben:Feststellung mein Post wird nicht so angezeigt
wie ich es über den Forum-Editor eingegeben habe.
Wie das kommt hat BlackJack schon erklärt - es hindert dich aber nichts daran, den alten Post zu editieren und richtig zu formatieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
kmansour
User
Beiträge: 9
Registriert: Mittwoch 14. Februar 2007, 15:07

Sonntag 4. März 2007, 18:42

wuf hat geschrieben:Hallo kmansour

Ich habe Deinen Matrix-Editor unter LINUX SuSE-10.0
ausgetestet. Tkinter scheint ein Problem zu haben
bei der Fokusübergabe an ein Fenster, welches sich
im overrideredirect(TRUE)-Modus befindet.
...

Viel Erfolg und Gruss von wuf :wink:
Bin Deinen Post mal durchgegangen und habe die Änderungen so wie geschrieben durchgeführt.
Ich habe weder MAC noch Linux. Nur eine Virtuelle Machine mit Ubuntu drauf. Allerdings verhält es sich exakt wie von Dir vermutet und auch beschrieben.
Ich hatte noch gehofft ein Ändern der Reihenfolge von focus_force und overridedirect könnte klappen aber es ging nicht.

Ist etwas schade. So muss ich wohl damit leben, dass es einen Fehler gibt, denn ich nicht selbst so einfach beheben kann.

Ich werde die Woche dann wohl den Code einchecken und je nach Betriebssystem das eine oder andere Verhalten anschalten.

Vielen Dank für die Hilfe.

Gruß
Kerim
Benutzeravatar
wuf
User
Beiträge: 1477
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 4. März 2007, 23:36

Hallo BlackJack und Leonidas

Besten Dank für Eure Tipps!

Gruss wuf :wink:
Take it easy Mates!
Antworten