pyuic kann nicht gefunden werden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

Hallo,

ich schreibe gerade an einem Plugin in Python für das GIS Programm Quantum GIS. QGIS beinhaltet ua. Python 2.5 und PyQt4 mit denen ich arbeite. Ich habe in QtCreator 2.1 ein GUI geschrieben, dass ich jetzt gerne mit meinem Python Code verknüpfen würde. Ich habe versucht mit pyuic "mainwindow.ui" in "mainwindow.py" umzuwandeln, habe hier allerdings Probleme.

Code: Alles auswählen

pyuic -o mainwindow.py mainwindow.ui
NameError: name 'pyuic' is not defined

Code: Alles auswählen

from PyQt4 import pyuic
ImportError: cannot import name pyuic
Pyuic liegt im QGIS Ordner C:\Programme\Quantum GIS Copiapo\apps\Python25\Lib\site-packages\PyQt4\uic

Ich habe es auch dynamisch versucht, auch hier kein Erfolg. Der Code-Snippet stammt aus diesem Thread: http://www.python-forum.de/viewtopic.ph ... ic#p191886

Code: Alles auswählen

from PyQt4 import uic
self.ui = uic.loadUi("mainwindow.ui", self)
Traceback (most recent call last):
..._gui.py", line 34, in __init__
self.ui = uic.loadUi("mainwindow.ui", self)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\__init__.py", line 112, in loadUi
return DynamicUILoader().loadUi(uifile, baseinstance)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\Loader\loader.py", line 21, in loadUi
return self.parse(filename)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\uiparser.py", line 759, in parse
document = parse(filename)
File "", line 45, in parse
File "", line 22, in parse
IOError: [Errno 2] No such file or directory: 'mainwindow.ui'
mainwindow.ui liegt zusammen mit den .cpp und .h Dateien aus dem QtCreator make hinüberkopiert in dem gleichen Ordner, wie die .py datei in der der oben genannt Code steht.

Ich verstehe nicht, wo das Problem liegt. Warum kann pyuic nicht gefunden/verwendet werden?
Etliche online Tutorials sagen zwar, dass pyuic verwendet werden kann, keiner sonnst scheint mein Problem aber online beschrieben zu haben.

Vielen vielen Dank für jegliche Hilfe,

Amelie
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

Da sind ein paar Sachen durcheinander gelaufen.
1. `pyuic` ist ein Kommandozeilenprogramm und muss auch in der Kommandozeile eingegeben werden, _nicht_ in der Python-Shell
2. `uic` ist das Python-Modul, darum laesst sich auch `pyuic` nicht importieren
3. Ich kenne zwar Quantum GIS nicht, aber ich wuerde sagen, dass es das Arbeitsverzeichnis aendert du solltest also absolute Pfade nutzen. Falls die `ui` Datei im selben Verzeichnis wie das Skript liegt, kannst du folgendes nutzen:

Code: Alles auswählen

import os.path
code_dir = os.path.dirname(os.path.abspath(__file__))
...
selfui = uic.loadUi(os.path.join(code_dir, "mainwindow.ui"), self)
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

Da sind ein paar Sachen durcheinander gelaufen.
1. `pyuic` ist ein Kommandozeilenprogramm und muss auch in der Kommandozeile eingegeben werden, _nicht_ in der Python-Shell
2. `uic` ist das Python-Modul, darum laesst sich auch `pyuic` nicht importieren
Oh.... das erklärt Teile. Ich habe gerade versucht pyuic über die Windows cmd line einzugeben und komme damit leider auch nicht weiter. Hier erhalte ich auf den Befehl (noch ohne Beachtung der abs Pfade der Umzuwandelnden Dateien)

Code: Alles auswählen

set path=%path%;C:\Programme\Quantum GIS Copiapo\apps\Python25
python pyuic -o mainwindow.py mainwindow.ui
python: can't open file or directory 'pyuic': [Errno 2] No such file or directory
Liegt das evtl daran, dass der python Pfad wegen der Leerzeichen im Pfadnamen, nicht richtig gesetzt wird?
3. Ich kenne zwar Quantum GIS nicht, aber ich wuerde sagen, dass es das Arbeitsverzeichnis aendert du solltest also absolute Pfade nutzen. Falls die `ui` Datei im selben Verzeichnis wie das Skript liegt, kannst du folgendes nutzen:
Danke für den Tipp! Das hat das Problem für die dynamische Einbindung in das Skript (meine ich) behoben. Leider bin ich gleich in das nächste hineingeschlittert - das gehört aber nicht mehr hier her. Allerdings möchte ich - als Anfänger mit Python und Qt und Programmieren generell - die Dinge erst einmal einfach halten. Da an der .ui datei eigentlich nichts mehr geändert werden sollte, scheint mir die einmalige Umwandlung sicherer als die dynamische.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Amelie hat geschrieben:Da an der .ui datei eigentlich nichts mehr geändert werden sollte, scheint mir die einmalige Umwandlung sicherer als die dynamische.
Inwiefern sicherer?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dein `python` Aufruf versucht die Datei `pyuic` im aktuellen Verzeichnis zu starten und die scheint es nicht zu geben.

Hast du es schon ohne das `python` versucht? Wenn das nicht klappt, solltest du `python wirklicher\pfad\zu\pyuic -o ...` nutzen

Ich persoenlich halte ja die dynamische Variante fuer einfacher - und vor allem pythonischer, aber ich kann deine Haltung da nachvollziehen ;)

In welches Problem bist du denn reingeschlittert? Wir sind schliesslich hier um Probleme zu loesen.
BlackJack

@Amelie: Erstens dürften die Leerzeichen tatsächlich Probleme machen und zweitens versuchst Du schon wieder das Programm mit Python auszuführen. ``pyuic`` ist eigentlich ein eigenständiges Programm.

Und das Programm ``pyuic`` muss unter dem angegebenen Pfad dann natürlich auch tatsächlich liegen.

Am dynamischen Laden der UI ist nichts unsichererer als am Generieren von Quelltext. Und einfacher ist das dynamische laden der UI IMHO auch, weil ein Zwischenschritt bei der Entwicklung weg fällt, den man sonst vergessen könnte, oder automatisieren muss.
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

BlackJack hat geschrieben:Am dynamischen Laden der UI ist nichts unsichererer als am Generieren von Quelltext. Und einfacher ist das dynamische laden der UI IMHO auch, weil ein Zwischenschritt bei der Entwicklung weg fällt, den man sonst vergessen könnte, oder automatisieren muss.
Ich hätte gedacht, dass das einmalige Generieren sicherer wäre, weil die Funktion dann abgeschloßen wäre und sich in dem Teil keine Fehler mehr einschleichen können. Aber das ist wahrscheinlich eine vage Vorstellung, von jemandem, der die Vorgänge noch nicht richtig versteht (als ferienlektüre steht DiveintoPython ganz oben). Auf jeden Fall habe ich mich entschloßen, das Ganze doch dyn. einzubinden (Vielleicht soll ja später doch noch das UI geändert werden, wer weiß...).
cofi hat geschrieben:In welches Problem bist du denn reingeschlittert? Wir sind schliesslich hier um Probleme zu loesen.
Das ist nett!
Das Problem liegt immernoch bei Laden der Ui. Ich benutze jetzt Folgendes (wobei ich auch rel und fest-kodierten Pfad mit gleicher Fehlermeldung versucht habe). Die Ui Datei liegt im gleichen Ordner wie das Skript, trotzdem kann es nicht gefunden werden.

Code: Alles auswählen

from PyQt4.uic import loadUi
code_dir = os.path.dirname(os.path.abspath(__file__))
self.ui = loadUi(os.path.join(code_dir, "Ui_GemeindeEnergieBeratung.ui"), self)
und erhalte die Fehlermeldung:
Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/vorname.nachname/.qgis/python/plugins\myfile\myfile_plugin.py", line 60, in run
self.dialog = myfileDialog(self.iface)
File "C:/Dokumente und Einstellungen/amelie.lesser/.qgis/python/plugins\myfile\myfile_gui.py", line 46, in __init__
self.ui = loadUi("C:/Dokumente und Einstellungen/amelie.lesser/.qgis/python/plugins\myfile\Ui_myfile.ui", self)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\__init__.py", line 112, in loadUi
return DynamicUILoader().loadUi(uifile, baseinstance)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\Loader\loader.py", line 21, in loadUi
return self.parse(filename)
File "C:\PROGRA~1\QUANTU~1\apps\Python25\lib\site-packages\PyQt4\uic\uiparser.py", line 759, in parse
document = parse(filename)
File "", line 45, in parse
File "", line 22, in parse
IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\vorname.nachname\\.qgis\\python\\plugins\\myfile\\Ui_myfile.ui'
Warum werden die slashes unterschiedlich dargestellt? Selbst, wenn ich im fest-kodierten Code nur ein '\' habe erweitert er es automatisch auf '\\'. Sollte hier nicht eigentlich ein Escape Character entstehen, oder wird es als tatsächlicher '\' erkannt, weil es keine der hier gesehenen \buchstabe als escape sequence gibt? Sind die Slashes überhaupt Grund für die Fehlermeldung? Wenn nicht, was könnte es sonst sein?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Amelie hat geschrieben:

Code: Alles auswählen

IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\vorname.nachname\\.qgis\\python\\plugins\\myfile\\Ui_myfile.ui'
Warum werden die slashes unterschiedlich dargestellt? Selbst, wenn ich im fest-kodierten Code nur ein '\' habe erweitert er es automatisch auf '\\'. Sollte hier nicht eigentlich ein Escape Character entstehen, oder wird es als tatsächlicher '\' erkannt, weil es keine der hier gesehenen \buchstabe als escape sequence gibt? Sind die Slashes überhaupt Grund für die Fehlermeldung? Wenn nicht, was könnte es sonst sein?

Code: Alles auswählen

In [7]: '\y'
Out[7]: '\\y'

In [8]: '\o'
Out[8]: '\\o'

In [9]: '\i'
Out[9]: '\\i
Ja, es wird automatisch so dargestellt und nein es ist nicht dafuer verantwortlich Windows-Pfad-Literale sollte man mit Raw-Strings nutzen, dann kann man auch nich vergessen sie bei Escape-Sequenzen zu escapen.

Gibt es die Datei aus dem `IOError`? Leserechte, etc?
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

Amelie hat geschrieben:Gibt es die Datei aus dem `IOError`? Leserechte, etc?
Die Datei gibt es. Schreibweise korrekt. Pfad korrekt. Alle Lese-/Schreibrechte vorhanden. Richtiges (.ui) Format.
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

Oh man, da war ich gerade wirklich doof. Die Datei war abgespeichert als 'Ui_myfile.ui.ui' aber wurde im Explorer als 'Ui_myfile.ui' (Typ: UI-Datei) angezeigt. Jetzt klappts auch mit dem uic.loadUi('myfile').

Vielen Dank für eure Hilfe!

P.S. Ganz aus der Welt ist das load Problem leider immer noch nicht, siehe dazu neuen Thread: http://www.python-forum.de/viewtopic.php?f=24&t=25720
Antworten