Пользовательский интерфейс PyQt5 не отображается при загрузке из файла - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь загрузить созданный мной файл .ui. Однако, когда я запускаю свое приложение python, главное окно пусто. Я считаю, что проблема в строке, в которой я загружаю фактический файл. Во всех примерах, которые я видел, вы можете просто загрузить файл, если файл .py находится в том же каталоге. Однако у меня это не сработало, поэтому мне пришлось использовать абсолютный путь. Это устранило FileNotFoundError, которое я получал, но теперь у меня есть эта проблема.

from PyQt5 import QtWidgets, uic
import sys
import os

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        ui_path = os.path.dirname(os.path.abspath(__file__))
        uic.loadUiType(os.path.join(ui_path, "myfile.ui"))[0]
        self.show()

app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()

Myfile.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="enabled">
   <bool>true</bool>
  </property>
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1141</width>
    <height>885</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QFrame" name="sidebar">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>200</width>
      <height>720</height>
     </rect>
    </property>
    <property name="maximumSize">
     <size>
      <width>16777215</width>
      <height>720</height>
     </size>
    </property>
    <property name="styleSheet">
     <string notr="true">background-color: rgb(209, 102, 24)</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QPushButton" name="pushButton">
     <property name="geometry">
      <rect>
       <x>40</x>
       <y>170</y>
       <width>75</width>
       <height>23</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <pointsize>12</pointsize>
      </font>
     </property>
     <property name="text">
      <string>Graph</string>
     </property>
     <property name="flat">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="Line" name="line">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>120</y>
       <width>200</width>
       <height>20</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color:rgb(255, 255, 255)</string>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Plain</enum>
     </property>
     <property name="lineWidth">
      <number>3</number>
     </property>
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
    </widget>
   </widget>
   <widget class="QFrame" name="topbar">
    <property name="enabled">
     <bool>true</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>200</x>
      <y>0</y>
      <width>911</width>
      <height>135</height>
     </rect>
    </property>
    <property name="sizePolicy">
     <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
      <horstretch>0</horstretch>
      <verstretch>0</verstretch>
     </sizepolicy>
    </property>
    <property name="minimumSize">
     <size>
      <width>911</width>
      <height>0</height>
     </size>
    </property>
    <property name="maximumSize">
     <size>
      <width>1920</width>
      <height>16777215</height>
     </size>
    </property>
    <property name="styleSheet">
     <string notr="true">background-color:rgb(12, 76, 173)</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QLineEdit" name="lineEdit">
     <property name="geometry">
      <rect>
       <x>430</x>
       <y>70</y>
       <width>113</width>
       <height>20</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background-color:rgb(255, 255, 255)</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
     <property name="placeholderText">
      <string>Search</string>
     </property>
    </widget>
   </widget>
   <widget class="QFrame" name="body">
    <property name="geometry">
     <rect>
      <x>200</x>
      <y>130</y>
      <width>911</width>
      <height>591</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">background-color:rgb(255, 254, 247)</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::NoFrame</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Plain</enum>
    </property>
    <property name="lineWidth">
     <number>0</number>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

1 Ответ

2 голосов
/ 17 июня 2020

Как документы указывает:

loadUiType (uifile, from_imports = False, resource_suffix = '_ r c', import_from = '.')

Загрузите файл .ui Qt Designer и вернет кортеж сгенерированного класса формы и базового класса Qt . Затем их можно использовать для создания любого количества экземпляров пользовательского интерфейса без необходимости более одного синтаксического анализа файла .ui.

(выделено мной)

Это возвращает 2 класса и не заполняет ни одно окно, вместо использования loadUiType вы должны использовать loadUi, как указано docs :

loadUi (uifile, baseinstance = None, package = '', resource_suffix = '_ r c')

Загрузите файл .ui Qt Designer, и вернет экземпляр пользовательского интерфейса .

(выделено мной)

import os
import sys

from PyQt5 import QtWidgets, uic


class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        ui_path = os.path.dirname(os.path.abspath(__file__))
        uic.loadUi(os.path.join(ui_path, "myfile.ui"), self)
        self.show()


def main():
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    app.exec_()


if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...