Как преобразовать ui в py pyqt5
Перейти к содержимому

Как преобразовать ui в py pyqt5

  • автор:

Как конвертировать интерфейс пользователя (UI) в файлы Python (.py)

В этой статье мы рассмотрим способы преобразования интерфейса пользователя (UI) в файлы Python (.py). Это может быть полезно, когда вы хотите создать приложение с графическим интерфейсом на Python и использовать существующий дизайн, созданный с помощью различных инструментов для создания UI.

1. Использование Qt Designer

Qt Designer — это инструмент для создания пользовательского интерфейса на основе фреймворка Qt. Он позволяет создавать интерфейсы путем перетаскивания и размещения элементов, а затем экспортировать их в файлы .ui. Чтобы преобразовать .ui-файл в файл Python .py, вы можете использовать утилиту pyuic5, которая поставляется вместе с PyQt5.

Шаги:

  1. Установите PyQt5, если у вас его еще нет:
pip install PyQt5
  1. Откройте .ui-файл в Qt Designer и настройте его по своему усмотрению.
  2. Сохраните .ui-файл.
  3. Преобразуйте .ui-файл в файл Python .py с помощью следующей команды:
pyuic5 input.ui -o output.py

Где input.ui — путь к входному .ui-файлу, а output.py — путь к создаваемому .py-файлу.

2. Использование PyQt5.uic

PyQt5.uic — это модуль, который позволяет загружать файлы .ui и создавать объекты формы, которые можно использовать в вашем коде Python. Вы можете импортировать этот модуль и использовать его для загрузки .ui-файла и создания соответствующего объекта формы.

Пример:

from PyQt5 import uic # Загрузка .ui-файла form, _ = uic.loadUiType('input.ui') class MyWidget(form): def __init__(self): super().__init__() self.setupUi(self) # Создание экземпляра формы и запуск приложения app = QApplication([]) widget = MyWidget() widget.show() app.exec_()

Где input.ui — путь к входному .ui-файлу.

3. Использование PySide2-uic

PySide2-uic — это утилита командной строки, поставляемая вместе с PySide2. Она позволяет преобразовывать файлы .ui в файлы Python .py с помощью следующей команды:

pyside2-uic input.ui -o output.py

Где input.ui — путь к входному .ui-файлу, а output.py — путь к создаваемому .py-файлу.

Заключение

В этой статье мы рассмотрели несколько способов преобразования интерфейса пользователя (UI) в файлы Python (.py). Вы можете выбрать подходящий вам инструмент в зависимости от ваших потребностей и предпочтений. Использование существующего дизайна может ускорить разработку приложения с графическим интерфейсом на языке Python.

Как преобразовать код с интерфейсом на Python для использования с .ui файлом (Qt Designer)?

Все примеры с использованием PyQt5 написаны с инициализацией интерфейса на Python.
Как правильно преобразовывать его на использование с .ui файлом?
Например из вопроса код для затухания при смене вкладки в QTabWidget :

import sys from PyQt5.Qt import * class FaderWidget(QWidget): def __init__(self, *args, **kwargs): QWidget.__init__(self, *args, **kwargs) self.pixmap_opacity = None self.timeline = QTimeLine(333, self) self.timeline.valueChanged.connect(self.animate) self.timeline.finished.connect(self.close) def start(self, old_widget, new_widget): self.pixmap_opacity = 1.0 self.old_pixmap = QPixmap(new_widget.size()) old_widget.render(self.old_pixmap) self.timeline.start() self.resize(new_widget.size()) self.show() def paintEvent(self, event): if self.pixmap_opacity: QWidget.paintEvent(self, event) painter = QPainter(self) painter.setOpacity(self.pixmap_opacity) painter.drawPixmap(0, 0, self.old_pixmap) def animate(self, value): self.pixmap_opacity = 1.0 - value self.update() class FaderTabWidget(QTabWidget): def __init__(self, parent=None): QTabWidget.__init__(self, parent) self.currentChanged.connect(self.onCurrentIndex) self.last = -1 self.current = self.currentIndex() def onCurrentIndex(self, index): self.last = self.current self.current = self.currentIndex() if self.widget(self.last): self.widget(self.last).setCurrentIndex(1) old_widget = self.widget(self.last).widget(0) current_widget = self.widget(self.current).widget(0) fade = self.widget(self.current).widget(1) fade.start(old_widget, current_widget) def addTab(self, widget, text): stack = QStackedWidget(self) stack.addWidget(widget) fade = FaderWidget(self) fade.timeline.finished.connect(lambda: stack.setCurrentIndex(0)) stack.addWidget(fade) stack.setCurrentIndex(0 if self.currentIndex() == -1 else 1) QTabWidget.addTab(self, stack, text) if __name__ == "__main__": app = QApplication(sys.argv) window = QWidget() tabWidget = FaderTabWidget() tabWidget.addTab(QCalendarWidget(), "Tab1") editor = QTextEdit() editor.setPlainText("Hello world! " * 100) tabWidget.addTab(editor, "Tab2") layout = QVBoxLayout(window) layout.addWidget(tabWidget) window.show() sys.exit(app.exec_()) 

Как данный код адаптировать под использование с .ui файлом?
И можно ли будет по аналогии так делать с другими элементами: кнопками, текстовыми полями и т.д. Моя попытка совместить код (неправильная и нерабочая): main.py:

import sys from PyQt5 import uic from PyQt5.Qt import * class Window(QMainWindow): def __init__(self): super(Window, self).__init__() uic.loadUi('fading.ui', self) self.tabWidget = FaderTabWidget() self.tabWidget.addTab(QCalendarWidget(), "Tab3") self.tabWidget.addTab(QTextEdit(), "Tab4") class FaderWidget(QWidget): def __init__(self, *args, **kwargs): QWidget.__init__(self, *args, **kwargs) self.pixmap_opacity = None self.timeline = QTimeLine(333, self) self.timeline.valueChanged.connect(self.animate) self.timeline.finished.connect(self.close) def start(self, old_widget, new_widget): self.pixmap_opacity = 1.0 self.old_pixmap = QPixmap(new_widget.size()) old_widget.render(self.old_pixmap) self.timeline.start() self.resize(new_widget.size()) self.show() def paintEvent(self, event): if self.pixmap_opacity: QWidget.paintEvent(self, event) painter = QPainter(self) painter.setOpacity(self.pixmap_opacity) painter.drawPixmap(0, 0, self.old_pixmap) def animate(self, value): self.pixmap_opacity = 1.0 - value self.update() class FaderTabWidget(QTabWidget): def __init__(self, parent=None): QTabWidget.__init__(self, parent) self.currentChanged.connect(self.onCurrentIndex) self.last = -1 self.current = self.currentIndex() def onCurrentIndex(self, index): self.last = self.current self.current = self.currentIndex() if self.widget(self.last): self.widget(self.last).setCurrentIndex(1) old_widget = self.widget(self.last).widget(0) current_widget = self.widget(self.current).widget(0) fade = self.widget(self.current).widget(1) fade.start(old_widget, current_widget) def addTab(self, widget, text): stack = QStackedWidget(self) stack.addWidget(widget) fade = FaderWidget(self) fade.timeline.finished.connect(lambda: stack.setCurrentIndex(0)) stack.addWidget(fade) stack.setCurrentIndex(0 if self.currentIndex() == -1 else 1) QTabWidget.addTab(self, stack, text) if __name__ == "__main__": app = QApplication(sys.argv) w = Window() w.show() sys.exit(app.exec_()) 

fading.ui:

  MainWindow   0 0 691 488   MainWindow      0   Tab 1        Tab 2     Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!            0 0 691 21       

Отслеживать
75.2k 120 120 золотых знаков 38 38 серебряных знаков 57 57 бронзовых знаков
задан 30 июн 2021 в 20:18
61 3 3 серебряных знака 15 15 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Данный код можно адаптировать следующим образом:

  • встраиваем виджет FaderTabWidget в форму Qt Designer. Подробно как это делается уже публиковалось.

введите сюда описание изображения

введите сюда описание изображения

Получаем fading.ui

  MainWindow   0 0 691 488   MainWindow      1   Tab 1        Tab 2     Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!            0 0 691 21      FaderTabWidget QTabWidget 
fadertabwidget
1
  • конвертируем pyuic5 fading.ui -o fading_ui.py -x

fading_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(691, 488) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.tabWidget = FaderTabWidget(self.centralwidget) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.calendarWidget = QtWidgets.QCalendarWidget(self.tab) self.calendarWidget.setObjectName("calendarWidget") self.horizontalLayout_2.addWidget(self.calendarWidget) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.tab_2) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_2) self.plainTextEdit.setObjectName("plainTextEdit") self.horizontalLayout_3.addWidget(self.plainTextEdit) self.tabWidget.addTab(self.tab_2, "") self.horizontalLayout.addWidget(self.tabWidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 691, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1")) self.plainTextEdit.setPlainText(_translate("MainWindow", "Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! ")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2")) from fadertabwidget import FaderTabWidget # . 
  • создаем модуль fadertabwidget.py
from PyQt5.Qt import * class FaderWidget(QWidget): def __init__(self, *args, **kwargs): QWidget.__init__(self, *args, **kwargs) self.pixmap_opacity = None self.timeline = QTimeLine(333, self) self.timeline.valueChanged.connect(self.animate) self.timeline.finished.connect(self.close) def start(self, old_widget, new_widget): self.pixmap_opacity = 1.0 self.old_pixmap = QPixmap(new_widget.size()) old_widget.render(self.old_pixmap) self.timeline.start() self.resize(new_widget.size()) self.show() def paintEvent(self, event): if self.pixmap_opacity: QWidget.paintEvent(self, event) painter = QPainter(self) painter.setOpacity(self.pixmap_opacity) painter.drawPixmap(0, 0, self.old_pixmap) def animate(self, value): self.pixmap_opacity = 1.0 - value self.update() class FaderTabWidget(QTabWidget): def __init__(self, parent=None): QTabWidget.__init__(self, parent) self.currentChanged.connect(self.onCurrentIndex) self.last = -1 self.current = self.currentIndex() def onCurrentIndex(self, index): self.last = self.current self.current = self.currentIndex() if self.widget(self.last): self.widget(self.last).setCurrentIndex(1) old_widget = self.widget(self.last).widget(0) current_widget = self.widget(self.current).widget(0) fade = self.widget(self.current).widget(1) fade.start(old_widget, current_widget) def addTab(self, widget, text): stack = QStackedWidget(self) stack.addWidget(widget) fade = FaderWidget(self) fade.timeline.finished.connect(lambda: stack.setCurrentIndex(0)) stack.addWidget(fade) stack.setCurrentIndex(0 if self.currentIndex() == -1 else 1) QTabWidget.addTab(self, stack, text) 
import sys from PyQt5.Qt import * from fading_ui import Ui_MainWindow # +++ class Window(QMainWindow, Ui_MainWindow): # +++ Ui_MainWindow def __init__(self): super(Window, self).__init__() # uic.loadUi('fading.ui', self) # --- self.setupUi(self) # +++ self.tabWidget.setTabText(0, "Tab 1") # + self.tabWidget.setTabText(1, "Tab 2") # + # self.tabWidget = FaderTabWidget() # --- self.tabWidget.addTab(QCalendarWidget(), "Tab3") self.tabWidget.addTab(QTextEdit('Hello World'), "Tab4") if __name__ == "__main__": app = QApplication(sys.argv) w = Window() w.show() sys.exit(app.exec_()) 

Как конвертировать .ui в .py?

Класс QUiLoader позволяет автономным приложениям динамически создавать пользовательские интерфейсы во время выполнения, используя информацию, хранящуюся в файлах пользовательского интерфейса или указанные в путях подключаемых модулей. Больше https://doc.qt.io/qtforpython/PySide6/QtUiTools/QUiLoader.html

import os from PySide2 import QtCore, QtWidgets, QtUiTools class TestWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(TestWindow, self).__init__(parent) loader = QtUiTools.QUiLoader() file = QtCore.QFile(os.path.abspath("ui/mainwindow.ui")) file.open(QtCore.QFile.ReadOnly) self.window = loader.load(file, parent) file.close() self.window.show() . 

How to convert a .ui file to .py file

This .ui file is made by Qt Designer. It’s just a simple UI. All the commands or codes for doing this on the websites I have looked through are not for windows.

17.4k 8 8 gold badges 56 56 silver badges 106 106 bronze badges
asked Mar 8, 2014 at 8:06
SonicFancy SonicFancy
309 1 1 gold badge 3 3 silver badges 11 11 bronze badges
Say, pyuic4 -o ui_form.py form.ui doesn’t work.
Mar 8, 2014 at 8:08

4 Answers 4

The pyuic tool works in exactly the same way on all platforms:

C:\>pyuic4 -h Usage: pyuic4 [options] Options: --version show program's version number and exit -h, --help show this help message and exit -p, --preview show a preview of the UI instead of generating code -o FILE, --output=FILE write generated code to FILE instead of stdout -x, --execute generate extra code to test and display the class -d, --debug show debug output -i N, --indent=N set indent width to N spaces, tab if N is 0 [default: 4] -w, --pyqt3-wrapper generate a PyQt v3 style wrapper Code generation options: --from-imports generate imports relative to '.' --resource-suffix=SUFFIX append SUFFIX to the basename of resource files [default: _rc] 

I suspect the reason «it doesn’t work» is that the .ui file you are trying to convert is not in the current directory. So you need to cd to that directory first:

 C:\>cd C:\path\to\my\ui\files 
 C:\path\to\my\ui\files\>pyuic4 -o ui_form.py form.ui 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *