Wie kann man im Qt Designer den Code einfach zu Python umwandeln?
Hallo.
Also ich brauche Hilfe. Ich würde gern Windows Forms über Python statt mit C# programmieren, weil Python kann bis unendlich viel rechnen als C# und daraus möchte ich einen super Taschenrechner programmieren.
Ich verwende den Qt Designer und versuche denn Code umzuwandeln. Ich habe im Internet geschaut und diesen 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)
window = Ui()
sys.exit(app.exec_())
Ja und wenn ich das dann ausführe, spuckt er diese Fehlermeldung aus:
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 992, in parse
document = parse(filename)
File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\xml\etree\ElementTree.py", line 1183, in parse
tree.parse(source, parser)
File "C:\Users\PrinzPersia\AppData\Local\Programs\Python\Python35-32\lib\xml\etree\ElementTree.py", line 583, in parse
source = open(source, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'Test.ui'
Wisst ihr, woran es liegt? Ich kenne mich im Qt Designer gar nicht gut aus und Videotutorials anschauen ist wegen der niedrigen Bildschirmauflösung sehr anstrengend.
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?
Befindet sich denn die Test.ui im gleichen Ordner wie die Test.py?
Dann solltest du das vielleicht ändern... Das oder die Pfadangabe in Test.py anpassen.
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?
Liegt evtl. an if __name__ == 'mainWindow': ändere das mal wieder so, wie es in deiner Frage formuliert war nach if __name__ == '__main__':
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.
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).
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 ===============================
>>>
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_())
Ja jetzt funktioniert das. OK Vielen dank für deine Hilfe.
über Python IDLE habe ich versucht aus zu führen.