Wie kann man im Qt Designer den Code einfach zu Python umwandeln?

1 Antwort

Dann solltest du ganz dringend lernen, diese Art von Fehlermeldung zu lese/verstehen.

Der Fehler tritt in der Zeile uic.loadUi('Test.ui', self) auf und besagt, dass die Datei "Test.ui" nicht an dem Ort zu finden ist, an dem diese erwartet wird.

Ja und wenn ich dann ausführe, .....

Wie genau führst du das Programm denn aus? Über nen Knopf in ner IDE, über die Kommandozeile (CMD), oder was ganz anderes?


PrincPersia 
Beitragsersteller
 12.05.2018, 20:56

über Python IDLE habe ich versucht aus zu führen.

Isendrak  12.05.2018, 21:05
@PrincPersia

Befindet sich denn die Test.ui im gleichen Ordner wie die Test.py?

Isendrak  12.05.2018, 21:41
@PrincPersia

Dann solltest du das vielleicht ändern... Das oder die Pfadangabe in Test.py anpassen.

PrincPersia 
Beitragsersteller
 12.05.2018, 21:49
@Isendrak

OK Ich habe diese ui Datei in derselbe Pfad gespeichert wo mein Python Projekt drauf gespeichert ist, diesmal ist es beim Ausführen kein Fehlermeldung, sondern er tut einfach nichts. Also so sieht mein Code aus:

from PyQt5 import uic, QtWidgets

import sys

class Ui(QtWidgets.QDialog):

   def __init__(self):

       super(Ui, self).__init__()

       uic.loadUi('Test.ui', self)

       self.show()

if __name__ == 'mainWindow':

   app = QtWidgets.QApplication(sys.argv)

   window = Ui()

   sys.exit(app.exec_())

Und wenn ich starte passiert nur das:

============== RESTART: C:/Users/PrinzPersia/Documents/Test.py ==============

>>>

Und diese Fenster wird nicht angezeigt. Weißt du noch eine Lösung?

Isendrak  12.05.2018, 21:59
@PrincPersia

Liegt evtl. an if __name__ == 'mainWindow': ändere das mal wieder so, wie es in deiner Frage formuliert war nach if __name__ == '__main__':

PrincPersia 
Beitragsersteller
 12.05.2018, 22:10
@Isendrak

Ja wenn ich wieder auf if __name__ == '__main__': setze, dann spuckt er mir diese Fehlermeldung:

Traceback (most recent call last):

 File "C:/Users/PrinzPersia/Documents/Test.py", line 12, in <module>

   window = Ui()

 File "C:/Users/PrinzPersia/Documents/Test.py", line 7, in __init__

   uic.loadUi('Test.ui', self)

 File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyQt5\uic\__init__.py", line 226, in loadUi

   return DynamicUILoader(package).loadUi(uifile, baseinstance, resource_suffix)

 File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyQt5\uic\Loader\loader.py", line 72, in loadUi

   return self.parse(filename, resource_suffix, basedir)

 File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyQt5\uic\uiparser.py", line 1000, in parse

   actor(elem)

 File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyQt5\uic\uiparser.py", line 801, in createUserInterface

   self.toplevelWidget = self.createToplevelWidget(cname, wname)

 File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyQt5\uic\Loader\loader.py", line 57, in createToplevelWidget

   (type(self.toplevelInst), classname)))

TypeError: ('Wrong base class of toplevel widget', (<class '__main__.Ui'>, 'QMainWindow'))

Darum habe ich von Main auf mainWindow ersetzt wie ich es auch im Qt Design bei objectName steht.

Isendrak  12.05.2018, 22:17
@PrincPersia

Die relevante Information findest du in dieser Zeile:

TypeError: ('Wrong base class of toplevel widget', (<class '__main__.Ui'>, 'QMainWindow'))

Deine Ui-Klasse verwendet QtWidgets.QDialog als Superklasse, erwartet wird allerdings QMainWindow (evtl. QtWidgets.QMainWindow).

Und noch so nebenbei:

Darum habe ich von Main auf mainWindow ersetzt wie ich es auch im Qt Design bei objectName steht.

Das hat mit Qt absolut gar nichts zu tun, dabei geht es um eine Python-spezifische Sache.

Das Modul, übar das das laufende Python-Programm gestartet wurde hat als Wert für das Attribut __name__ immer "__main__".

Das kann z.B. verwendet werden, wenn man ein Modul schreibt, das sowohl als Haupt- als auch als Nebenmodul verwendet werden kann (im zweiten Fall wird man den "Hauptcode" eher nicht ausführen wollen).

PrincPersia 
Beitragsersteller
 12.05.2018, 22:34
@Isendrak

OK habe diese Code eingegeben:

from PyQt5 import uic, QtWidgets

import sys

class Ui(QtWidgets.QDialog):

   def __init__(self):

       super(Ui, self).__init__()

       uic.loadUi('Test.ui', self)

       self.show()

if __name__ == '__main__':

   app = QtWidgets.QApplication(sys.argv)

   app = QtWidgets.QMainWindow()

   window = Ui()

   window.show()

   sys.exit(app.exec_())

Also dort nach dem if Satz habe ich dazu  app = QtWidgets.QMainWindow() eingegeben, doch beim Ausführen hat der Python irgendwie für paar Sekunde lange geladet und nun hat sich Abgestürzt und das Shell neu gestartet

>>>

============== RESTART: C:/Users/PrinzPersia/Documents/Test.py ==============

=============================== RESTART: Shell ===============================

>>>

Isendrak  12.05.2018, 22:50
@PrincPersia

Nej, nej... Du solltest die Superklasse von Ui ändern, nicht was auch immer du da fabriziert hast...

Versuchs mal damit:

from PyQt5 import uic, QtWidgets
import sys
 
class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('Test.ui', self)
        self.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    sys.exit(app.exec_())
PrincPersia 
Beitragsersteller
 12.05.2018, 22:52
@Isendrak

Ja jetzt funktioniert das. OK Vielen dank für deine Hilfe.