Я попытался загрузить файл Ui из скрипта Python следующим образом.
from PyQt5 import uic, QtWidgets
import sys
class Ui(QtWidgets.QDialog):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi('SomeUi.ui', self)
self.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Ui()
sys.ex
Когда я отлаживаю и дохожу до строки window = Ui()
, у меня появляется ошибка:
-> window = Ui()
(Pdb) n
TypeError: TypeErro...ndow')),)
Что не так с моим кодом?
Вы можете скомпилировать файл .ui в файл .py с помощью утилиты пюик, которая является частью PyQt.
Найдите утилиту где-нибудь в dist-пакетах python, например, в моей системе (debian linux), она находится в
/usr/lib/python3/dist-packages/PyQt5/uic/pyuic.py
Запустите его с помощью python, указав исходный файл .ui и параметр -o с файлом результата py.
cd /usr/lib/python3/dist-packages/PyQt5/uic/
python3 ./pyuic.py /home/user/my-app/my-file.ui -o /home/user/my-app/my-file.py
Вы получите файл .py, который будет содержать что-то вроде этого:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(555, 470)
// and so on... lots of lines...
Импортируйте этот файл и создайте подкласс этого Ui_MainWindow (имя может быть другим) своим классом окна.
Я думал, что могу вызвать этот файл SomeUi.ui
напрямую.
Если вы внимательно прочитаете документацию (pyqt.sourceforge.net/Docs/PyQt5/designer.html), вы обнаружите, что класс uic.loadUi RETURNS, который вы должны создать для использования интерфейса.
Файл SomeUi.ui, вероятно, имеет
QMainWindow
в качестве виджета верхнего уровня, но ваш классUi
наследуется отQDialog
- отсюда ошибка типа. Если вы используетеclass Ui(QtWidgets.QMainWindow)
, код должен работать (хотя последняя строка должна бытьapp.exec()
).