Задать вопрос
@doktorfish0078

Как добиться видимости объектов созданных в формах Qt Designer при разработке кода в PyCharm?

Разрабатываю виртуальные лабы по физике. Создаю форму в qt designer, создаю в ней нужные кнопки,объекты,ползунки и прочее, далее нужно прописывать их действия, это делаю на Python'е
Создал файл, создаю класс и загружаю свою Ui форму
class TestLaba(QMainWindow):
    def __init__(self):
        super(TestLaba, self).__init__()
        uic.loadUi('TEST.ui', self)

И вот хочу например задать кнопке какой-то значение. Пишу self. и думаю,как же я её назвал, лезу в форму,смотрю название, обращаюсь к ней self.button. И думаю, ля,а какие у неё методы вообще
Приходиться писать QtWidjets.QButton. чтобы посмотреть методы по подсказке
Да,я в курсе,что есть документация и прочее, но так удобно, когда есть подсказки
Проблема в том,что питон файл и класс с котором я веду разработку не видят объекты созданные в форме, когда я пишу код
Разумеется,если я напишу self.button.clicked.connect(self.метод_с_действием_кнопки) он сработает,но хотелось бы не писать с завязанными глазами
Я нашёл другой вариант, можно конвертировать UI в Py, так и сделал, получить файл со всеми переменными
class Ui_Laba2(object):
    def setupUi(self, Laba2):
        Laba2.setObjectName("Laba2")
        Laba2.resize(948, 759)
        Laba2.setStyleSheet("background-color: rgb(167, 255, 207);")
        self.centralwidget = QtWidgets.QWidget(Laba2)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(50, 50, 501, 71))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.Reostat = QtWidgets.QSlider(self.verticalLayoutWidget)
        self.Reostat.setMaximum(240)
        self.Reostat.setSingleStep(1)
        self.Reostat.setSliderPosition(0)
        self.Reostat.setTracking(True)
        ........

И импортировал его в свой код и стал загружать уже не Ui ,а Py
import labaa2

class Laba2(QMainWindow,labaa2.Ui_Laba2):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

И теперь если я напишу self. мне выдадутся подсказки,какие объекты у меня есть
5f8c69254597f587872077.png
И чтобы узнать какие есть методы у моего слайдера не нужно будет писать QtWidgets.QSlider. и смотреть подсказки,а просто написать
5f8c6961bf23e488156886.png
И вот казалось бы счастье, но я разрабатываю это приложение, постоянно меняю форму, пишу тестовые методы
А Py файл, который получен при конвертации из Ui не обновляется сам, тобишь при каждом изменении надо бы снова конвертировать файл,а для этого нужно открыть cmd написать pyuic5 path.io -o path.py
Как-то не очень удобно.
В статье https://tproger.ru/translations/python-gui-pyqt/ написано,что "файл с дизайном будет полностью перезаписываться каждый раз при изменении дизайна, мы не будем изменять его."
и было бы очень неплохо,чтобы так было. Как можно этого добиться или как иным путём можно оптимизировать работу?
  • Вопрос задан
  • 1427 просмотров
Подписаться 2 Средний 4 комментария
Решения вопроса 1
@bbkmzzzz
Заведите в классе отдельное поле для форм, будет удобнее.
import labaa2

class Laba2(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = self.setupUi(self)


Тогда вся форма будет в ui
self.ui.button # например

Дело в том, что QtDesigner создает файлы в "своем формате" (xml, если правильно помню), попробуйте открыть ui файл блокнотом, увидите. Питон ни сном ни духом, что там такое находится и как с этим взаимодействовать, вот тут на сцену и выходит uic. Он преобразует дерево виджетов ui в валидный питоновский класс, который использует установленную питоновскую библиотеку-обертку над Qt.
С uic 2 подхода:
1. uic.loadUi('TEST.ui', self)
(есть смысл запихнуть это в отдельное поле класса, например, self.ui = uic.loadUi('TEST.ui', self), дабы не возникло не нужных пересечений имен, да и, на мой взгляд, аккуратнее получиться, мало ли еще одну форму в этот же класс грузить будете.)
uic парсит ui файл, и создает сущности. Каждый раз, при запуске программы это будет происходить.
+ Не требует промежуточных звеньев
- Не работает автодополнение IDE
- Парсинг и формирование питон класса при каждом запуске.
2. Конвертация заранее.
- Требует промежуточное действие между формой и программой. (преобразование в ui в py)
+ Работает автодополнение
+ Не тратится время на преобразование при запуске программы.
+ В PyCharm можно настроить конвертацию на горячую клавишу.

Не надо наследовать класс сразу от двух классов, в 99.9% Вам это не надо, а странных для вас эффектов можете огрести.
С использованием предварительной конвертации
Импортируйте сконвертированную форму в самом начале, дайте ей понятное название, потом подключите
import labaa2
from labaa2.Ui_Laba2 import Ui_что_там_у_вас as MainForm_UI

class Laba2(QMainWindow,):
    def __init__(self):
        super().__init__()
        self.ui = MainFormUI()
        self.ui.setupUi(self)

теперь вся форма будет в ui, автодополнение работает, Pycharm скорее всего не увидит сигналов, но это нормально, работать они, естественно, будут.

P.S. Pycharm и External tools
Картинки

5f8caa995f6ff805437661.png
5f8cad28bb2ce085833759.png
Для такой организации формочек
5f8cadf60e0e2969686885.png
Правой кнопкой по файлу - то, как Вы назовете external tool.
5f8caefc48637441580438.png
# импорт
import labaa2
from forms.py.temp_ui import Ui_MainWindow as MainForm


class Laba2(QMainWindow,):
    def __init__(self):
        super().__init__()
        self.ui = MainForm()
        self.ui.setupUi(self)


Добавление хоткея
5f8cafbe07d7f009801572.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы