Fehler bei Scriptausführung: no attribute 'show'

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Hallo,

ich bin gerade dabei Python anhand eines Projektes zu lernen, welches später auch einen sinnvollen Zweck erfüllen soll. Darum wollte ich auch gleich mit einem GUI arbeiten und entschied mich füt PyQT.
Mit dem QtDesigner habe ich nun eine Oberfläche erstellt und diese pyuic4 auch umgewandelt. Problem ist das bei Ausführung des Scriptes folgende Fehlermeldung erscheint

Code: Alles auswählen

mdlg.show()
AttributeError: 'Ui_Dialog' object has no attribute 'show'
Folgendes hat pyuic4 erzeugt:

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created: Sun Nov 21 21:17:48 2010
#      by: PyQt4 UI code generator 4.5.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(20, 20, 46, 14))
        self.label.setObjectName("label")
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(20, 40, 113, 20))
        self.lineEdit.setObjectName("lineEdit")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
Eingefügt habe ich dann noch:

Code: Alles auswählen

import sys
sowie

Code: Alles auswählen

app = QtGui.QApplication(sys.argv)
mdlg = Ui_Dialog()
mdlg.show()
sys.exit(app.exec_())
Eine andere Möglichkeit, die ich probiert hatte, orientiert sich an dem Buch Python von Galileo Computing:

Code: Alles auswählen

# -*- coding: utf-8 -*-

# gex.py

import sys 
from PyQt4 import QtGui 
from gexmaindialog import Ui_Dialog as Dlg

class MeinDialog(QtGui.QDialog, Dlg): 
    def __init__(self): 
        QtGui.QDialog.__init__(self) 
        self.setupUi(self)

app = QtGui.QApplication(sys.argv) 
dialog = MeinDialog() 
dialog.show() 
sys.exit(app.exec_())
Dabei ist gexmaindialog die vom QtDesigner über pyuic4 erzeugte Datei. Hierbei erhalte ich aber die Fehlermeldung

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Markus\Pythonprojekte\Gaussian\gex.py", line 7, in <module>
    from gexmaindialog import Ui_Dialog as Dlg
 File "C:\Python26\lib\site-packages\spyderlib\interpreter.py", line 47, in _import
    result = self.builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named gexmaindialog
Die Dateien gex.py und gexmaindialog.py liegen in demselben Verzeichnis.

Vielen Dank für eure Hilfe
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Hi,

also da ist der ein oder ander Fehler. Ich verweise mal auf
das hier
das ist ein Beispiel wie man mit dem uic modul die files die vom Designer generiert werden dynamisch einbindet. Das hat den Vorteil dass Du später im Designer geänderten Code nicht von "hand" mit pyuic4 "Übersetzen" musst.

Entweder deine Ui_Dialog muss von QDialog erben oder ein weitere Klasse erbt von Ui_Dialog und QDialog dann gehts in die richtige Richtung. (Bsp.)

Das Python Buch auf das Du dich beziehst ist mit Vorsicht zu geniessen. Siehe diese kürzlich geführte Diskussion.

Lernst Du Programmieren oder willst Du Python lernen und kannst schon Programmieren ?
Falls ersteres zutrifft, verschieb die GUI-Programmierung noch ein bisschen und fang erstmal mit den Grundlagen an. GUI-Programmieren ist schon etwas anspruchsvoll und hat so seine Tücken und lenkt vom Wesentlichen ab.
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Hallo ichisich,

danke für deine schnelle Antwort.
Zur Frage mit den Prgrammierkenntnissen gebe ich mal ein deutliches jein :D
Soll heißen, habe schon mal Programmieren bzw. die Anfänge gelernt (C++). Hatte aber schon immer so meine schwierigkeiten mit der Objektorientierung. In anderen Sprach (Scriptsprachen) habe ich nur prozedural programmiert, insofern sind gewisse Grundlagen klar. Deswegen wollte ich auch gleich mit der GUI-Programmierung anfangen. Auch wenn es schwer ist, will ich versuchen mich da durchzubeißen.

Das erste beispiel, welches ich gepostet hatte, hat mir auch nicht wirklich gefallen, weil man eben nicht mehr ohne weiteres die GUI ändern kann. Habe mich deswegen den zweiten Weg gewählt und dein angegebenes Beispiel adaptiert, erhalte also http://paste.pocoo.org/show/294517/

Code: Alles auswählen

# -*- coding: utf-8 -*-

# gex.py

import sys 
from PyQt4 import QtGui 
from gexmaindialog import Ui_Dialog

class MyDialog(QtGui.QDialog, Ui_Dialog):
    def __init__(self):
        super(MyDialog, self).__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myDialog = MyDialog()
    myDialog.show()
    sys.exit(app.exec_())
mit der GUI gexmaindialog.py http://paste.pocoo.org/show/294518/.

Der Fehler bleibt allerdings bei

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Markus\Pythonprojekte\Gaussian\gex.py", line 7, in <module>
    from gexmaindialog import Ui_Dialog as Dlg
File "C:\Python26\lib\site-packages\spyderlib\interpreter.py", line 47, in _import
    result = self.builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named gexmaindialog
Wenn ich das richtig interpretiere, mag er also irgendiwe nicht die gexmaindialog.py finden.

Grüße
Markus
BlackJack

@mushroom: Was ist denn das aktuelle Arbeitsverzeichnis wenn Du das ausführst? Und was ist diese `spyderlib` die da im Traceback auftaucht und offenbar beim Import dazwischen geschaltet ist?
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Im Kapitel 11 im Open Book steht was über Module und wie die Struktur aufgebaut ist. Vielleicht hilft das dir weiter !?
Gruß
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

@BlackJack

Also beide Dateien liegen im selben Verzeichnis unter C:\Users\Markus\Pythonprojekte\Gaussian\

Ich verwende alles in allem Python(x,y) in der Version 2.6.5.3 und daraus den Editor Spyder. Die Datei interpreter.py enthält folgendes: http://paste.pocoo.org/show/294660/.

@ichisich Danke für den Hinweis, werde es mir mal zu Gemüte führen.
BlackJack

@mushroom: Ist denn das aktuelle Arbeitsverzeichnis von dem Prozess identisch mit dem Pfad wo die Dateien liegen?

Und kannst Du das ganze ausserhalb von der IDE starten?
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Jetzt hab ich's.
Musste erstmal mit dem Editor klarkommen. Habe das Arbeitsverzeichnis geändert und zwar dorthin, wo die Dateien liegen. Und siehe da, es klappt. :-) Genauso klappt das Starten der Datei direkt ohne den Editor.

Puh, schwere Geburt. Dann mache ich mich mal an die "richtige" Arbeit ran. Mit ein paar Fragen werde ich euch sicher noch behelligen :wink:

Auf jeden Fall Danke für eure Hilfe. Tolles Forum.

Grüße
Markus
Antworten