Tkinter ohne aufpoppendes Terminal unter Mac ???

Fragen zu Tkinter.
Antworten
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Sonntag 18. März 2007, 01:58

Hi,
ich habe ein Macbook, OsX Tiger mit MacPython Insstallation 2.4 (2.5 machte keinen Unterschied). Wenn ich die beigelegten Beispielscripte im Programmverzeichnis unter /MacPython 2.4/Extras/Demo/tkinter/ mit dem PythonLauncher (unter Zuhilfenahme des Finders) öffne, öffnen diese immer, genauso wie meine selbstgeschriebenen Scirpte, mit einem Terminalwindow. Das Terminalwindow ist, je nach Einstellung des PythonLauncher, leer (d.H ich kann es schließen ohne das es Auswirkung auf die geöffnete Applikation hat) oder die Anwendung startet in dem Fenster und ist somit, logischerweise, an das Terminal gebunden. Ich habe bis jetzt keinen Weg bzw. Tip gefunden, der ein Starten einer Tkinter Applikation, aus dem Finder heraus, unter Mac (Tiger) ohne aufpoppendes Terminal ermöglicht. Um auszuschließen, daß etwas an meinem System nicht stimmt, hatte ich auch schon eine Neuinstallation des OS durchgeführt, ohne Erfolg. Ich suche, leider, schon seit Wochen nach einem Hinweis der das Problem lösen könnte. Mich würde es brennend interessieren, wie es anderen Mac Usern mit Tkinter ergeht.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 18. März 2007, 08:40

Hi!

Gleich mal vorweg, ich hab keine Ahnung von MacOS.

Unter Windows verhindert man das Terminal indem man dem Pythonscript die Endung .pyw gibt. Hast du das schon mal versucht?

Gruß, mawe
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Sonntag 18. März 2007, 11:16

*.pyw funktioniert nicht (obwohl ich im Netz sowas auch schon als Tip für Mac gefunden hatte), weder in der "magic line" noch als Endung.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 18. März 2007, 12:49

In Windows geht es auch mit

Code: Alles auswählen

pythonw.exe programm.py
statt

Code: Alles auswählen

python.exe programm.py
Gibt es pythonw.exe bei Dir?
MfG
HWK
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Sonntag 18. März 2007, 13:34

pythonw ist unter Mac vorhanden. Und natürlich kann ich in der Konsole mit einem bestimmten Interpreter das Script aufrufen. Nur macht es hier keinen Unterschied ob ich pythonw oder python wähle, da ja schon eine Konsole (Terminalfenster) geöffnet ist. Es soll ja das Script ohne Terminal, also nicht aus dem Terminal heraus, aufgerufen werden. Das Tkinter Script soll aus dem Finder (Dateimanager unter Mac) gestartet werden und dann ohne aufpoppendes Terminalfenster starten.
HWK hat geschrieben:In Windows geht es auch mit

Code: Alles auswählen

pythonw.exe programm.py
statt

Code: Alles auswählen

python.exe programm.py
Gibt es pythonw.exe bei Dir?
MfG
HWK
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 18. März 2007, 15:27

Aber du kannst doch festlegen, mit welchem Programm bestimmte Dateien geöffnet werden sollen, oder? Und da nimmst du einfach pythonw für Python-Scripts.

PS: Hab ich schon erwähnt, dass ich keine Ahnung von MacOs habe? :)
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Sonntag 18. März 2007, 16:20

Schön wärs, aber der Mac ist sowas wie ne Glucke die einen vor falschem Tun beschützt :wink: . Es lassen sich leider nur Anwendungen mit der Endung *.app (das sind speziell gepackte Verzeichnisse) festlegen. Leider ist /usr/local/bin/pythonw kein app. Hierführ gibt es den PythonLaucher.app, der eigentlich die Einstellung - run in a Terminal window - mitbringt, so das ein Deaktivieren möglich ist, aber diese Einstellungsmöglichkeit bleibt leider ohne Auswirkung.
mawe hat geschrieben:Aber du kannst doch festlegen, mit welchem Programm bestimmte Dateien geöffnet werden sollen, oder? Und da nimmst du einfach pythonw für Python-Scripts.
Macht ja nichts, aber gibt es hier im Forum auch Mac User??? :D - Das Problem ist, daß ich alles Erdenkliche und Unerdekliche - da geraten, wahrscheinlich schon ausprobiert habe. Irgendwie schwindet die Hoffnung das ein alter "Mac - Hase" die Löung aus dem Hut zaubert - Wunschdenken. :( Aber vielleicht hat ja doch noch jemand eine funktionierende Idee....
mawe hat geschrieben:PS: Hab ich schon erwähnt, dass ich keine Ahnung von MacOs habe? :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 18. März 2007, 16:23

In Windows kann man eine Verknüpfung auf ein Programm erstellen. Als Ziel kann man dann "C:\Programme\Python24\pythonw.exe Programm.py" eintragen. Wenn man dann die Verknüpfung startet, wird das Python-Programm ohne Konsolenfenster ausgeführt. Vielleicht geht so etwas ähnliches beim Mac auch.
MfG
HWK
midan23
User
Beiträge: 137
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Montag 19. März 2007, 08:56

Mit diesem Problem hab ich mich auch schon mal befassen dürfen ...
Nach mehrtägiger Suche hatte ich folgendes herausgefunden:
  1. Es ist kein richtiges Terminal-Fenster, sondern es handelt sich dabei um die TK-Console ...
  2. Es macht in dieser Hinsicht keinen Unterschied, ob man python oder pythonw verwendet
  3. Man sollte Python-Programme mit GUI (egal womit realisiert) immer mit pythonw starten ... Damit wird ein Fehler in Aqua umgangen (fragt mich aber nicht nach Details ...)
  4. Man kann das Problem in eigenen Programmen lösen:

    Code: Alles auswählen

    root=Tkinter.Tk()
    try:
    	root.tk.call('console','hide')
    except Tkinter.TclError:
    	pass
    
    (Alternativ könnte man statt TK was anderes verwenden ...)
  5. Die IDLE-Version von Python 2.5 hat dieses Problem nicht ... (Ganz offensichtlich haben die Entwickler einen Weg gefunden, dieses Problem zum lösen)
    Man könnte also dort man im Source-Code nachschauen ...
  6. Eine Lösung, die direkt in TK wirkt und keine Änderungen im Source-Code erfordert gibt es meines Wissens nach nicht.
EDIT:
HWK hat geschrieben: In Windows kann man eine Verknüpfung auf ein Programm erstellen. Als Ziel kann man dann "C:\Programme\Python24\pythonw.exe Programm.py" eintragen. Wenn man dann die Verknüpfung startet, wird das Python-Programm ohne Konsolenfenster ausgeführt. Vielleicht geht so etwas ähnliches beim Mac auch.
Aber sicher :
Die Ausführung von Programmen übernimmt der PythonLauncher. Wenn man diesen direkt startet, kann man unter anderem Einstellen womit die Programme gestartet werden sollen.
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Montag 19. März 2007, 14:52

:D :D :D
Das ist die Lösung, genau das was ich will. Vielen Dank für eure Mühe.
Es bleibt noch ein kleiner Wehrmuthstropfen, der Pythonlauncher ist in der Standardeinstellung eingestellt auf: Python GUI Script ohne terminal ausführen, Python Script im Terminal ausführen, Python Bytecode Document im Terminal ausführen. Jetzt passiert es leider, daß erst wenn ich, Python Script ohne Terminal ausführen, einstelle, die Tkinter Scripte ohne Terminal ausgeführt werden. Daraus schließe ich, daß der PythonLauncher die Tkinter Scripte nicht als GUI Scripte erkennt. Gibt es eine Möglichkeit dem PythonLauncher mitzuteilen das es sich um ein GUI Script handelt ???
midan23 hat geschrieben:Mit diesem Problem hab ich mich auch schon mal befassen dürfen ...
Nach mehrtägiger Suche hatte ich folgendes herausgefunden:
  1. Es ist kein richtiges Terminal-Fenster, sondern es handelt sich dabei um die TK-Console ...
  2. Es macht in dieser Hinsicht keinen Unterschied, ob man python oder pythonw verwendet
  3. Man sollte Python-Programme mit GUI (egal womit realisiert) immer mit pythonw starten ... Damit wird ein Fehler in Aqua umgangen (fragt mich aber nicht nach Details ...)
  4. Man kann das Problem in eigenen Programmen lösen:

    Code: Alles auswählen

    root=Tkinter.Tk()
    try:
    	root.tk.call('console','hide')
    except Tkinter.TclError:
    	pass
    
    (Alternativ könnte man statt TK was anderes verwenden ...)
  5. Die IDLE-Version von Python 2.5 hat dieses Problem nicht ... (Ganz offensichtlich haben die Entwickler einen Weg gefunden, dieses Problem zum lösen)
    Man könnte also dort man im Source-Code nachschauen ...
  6. Eine Lösung, die direkt in TK wirkt und keine Änderungen im Source-Code erfordert gibt es meines Wissens nach nicht.
midan23
User
Beiträge: 137
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Montag 19. März 2007, 22:25

Ich hab da mal nachgeschaut (Python 2.5) ...

Der Python Launcher nimmt immer die Einstellungen für Python Script ... und ich hab auch ziemlich schnell rausgefunden wiso :

Unter Mac OS X ist eine via Doppelklick startbare Anwendung eigentlich ein Ordner mit der Erweiterung .app. In diesem Ordner liegt ein Ordner mit Namen Contents, welcher unter anderem die Datei Info.plist enthält.

Wenn man sich den Inhalt dieser Datei beim Python Launcher anschaut (ist eine XML-Datei), merkt man schnell wo das Problem liegt:

Code: Alles auswählen

<dict>
	<key>CFBundleTypeExtensions</key>
	<array>
		<string>py</string>
		<string>pyw</string>
	</array>
	<key>CFBundleTypeIconFile</key>
	<string>PythonSource.icns</string>
	<key>CFBundleTypeName</key>
	<string>Python Script</string>
	<key>CFBundleTypeRole</key>
	<string>Viewer</string>
	<key>NSDocumentClass</key>
	<string>MyDocument</string>
</dict>
Beide Dateierweiterungen "py" und "pyw" sind mit "Python Script" verknüpft.

Ein kleines Experiment zeigt: Wenn man den oben gezeigten Teil durch folgenden ersetzt:

Code: Alles auswählen

<dict>
	<key>CFBundleTypeExtensions</key>
	<array>
		<string>py</string>
	</array>
	<key>CFBundleTypeIconFile</key>
	<string>PythonSource.icns</string>
	<key>CFBundleTypeName</key>
	<string>Python Script</string>
	<key>CFBundleTypeRole</key>
	<string>Viewer</string>
	<key>NSDocumentClass</key>
	<string>MyDocument</string>
</dict>
<dict>
	<key>CFBundleTypeExtensions</key>
	<array>
		<string>pyw</string>
	</array>
	<key>CFBundleTypeIconFile</key>
	<string>PythonSource.icns</string>
	<key>CFBundleTypeName</key>
	<string>Python GUI Script</string>
	<key>CFBundleTypeRole</key>
	<string>Viewer</string>
	<key>NSDocumentClass</key>
	<string>MyDocument</string>
</dict>
erhält man das gewünschte Verhalten.
(Bisher nur mit einem kleinen wxPython-basierten Script getestet)

Ach ja, es empfiehlt sich vom Python Launcher vor der Modifikation eine Sicherheitskopie zu machen ...
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Dienstag 20. März 2007, 16:14

Ich frage mich, ob das nun ein feature oder Bug des PythonLauncher ist ?!? Dein Vorschlag scheint jedenfalls eine Möglichkeit zu sein. Der Nachteil ist das sich diese Modifikation nicht einfach per Script, z.B. im Programmstart integriert, ausühren lässt, wahrscheinlich sind root Rechte dafür nötig. Schöner wäre natürlich, wenn man den PythonLauncher "von Außen" dazu bringen (überlisten) könnte, die Tkinter Anwendung als GUI Applikation zu interpretieren. Hat vielleicht hierzu noch jemand eine Idee ???

ps: Hab ich das richtig verstanden, Script mit wxPython hat das gleiche Problem, wird also auch nicht als GUI Application erkannt?
midan23 hat geschrieben:Ich hab da mal nachgeschaut (Python 2.5) ...

Der Python Launcher nimmt immer die Einstellungen für Python Script ... und ich hab auch ziemlich schnell rausgefunden wiso :

Unter Mac OS X ist eine via Doppelklick startbare Anwendung eigentlich ein Ordner mit der Erweiterung .app. In diesem Ordner liegt ein Ordner mit Namen Contents, welcher unter anderem die Datei Info.plist enthält.

Wenn man sich den Inhalt dieser Datei beim Python Launcher anschaut (ist eine XML-Datei), merkt man schnell wo das Problem liegt.....

Beide Dateierweiterungen "py" und "pyw" sind mit "Python Script" verknüpft..........

Ach ja, es empfiehlt sich vom Python Launcher vor der Modifikation eine Sicherheitskopie zu machen ...
midan23
User
Beiträge: 137
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Dienstag 20. März 2007, 20:44

Im Grunde genommen ist das halb so schlimm ...

Man nimmt Python Launcher während der Entwicklung und danach nimmt man Build Applet um eine direkt startbare Anwendung zu erhalten ...
andreas
User
Beiträge: 7
Registriert: Sonntag 18. März 2007, 01:09
Wohnort: Berlin
Kontaktdaten:

Mittwoch 21. März 2007, 00:22

Ich bin erstaunt, das funktioniert bei Dir? Ich hab das bei den Beispielscripten probiert, es ist noch nie eins danach als *.app gelaufen. Und außerdem ist mir schleierhaft was ich mit Anwendungen machen soll die sich auf mehrere Scripte verteilen, irgendwie scheint das Build Applet dafür nicht konzipiert zu sein.
midan23 hat geschrieben:Im Grunde genommen ist das halb so schlimm ...

Man nimmt Python Launcher während der Entwicklung und danach nimmt man Build Applet um eine direkt startbare Anwendung zu erhalten ...
midan23
User
Beiträge: 137
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Mittwoch 21. März 2007, 06:25

Dabei ist es recht einfach (Python 2.5 vorausgesetzt) ...

Nehmen wir einfach mal die Desktop-Variante von MoinMoin:
  1. Download und entpacken
  2. Starten von Build Applet und Auswahl von "moin.py"
  3. Paketinhalt der erzeugten Anwendung anzeigen lassen
  4. Folgendes in den "Resources" Ordner kopieren:
    • Den Ordner "wiki"
    • Den Ordner "MoinMoin"
    • Die Datei "wikiconfig.py"
Jetzt hat man eine einfache Anwendung ...

Man sollte allerdings nicht davon ausgehen, das sie auch auf anderen Macs läuft, dazu würden ihr noch ein paar Sachen fehlen.
Aber auch dafür gibt es eine Lösung: http://cheeseshop.python.org/pypi/py2app/
(Ich weiss allerdings nicht, wie gut diese funktioniert, da ich dieses Tool noch nie verwendet habe)
Antworten