Łączenie pliku qtDesigner .ui z python / pyqt?

81

Więc jeśli przejdę do QtDesigner i zbuduję interfejs użytkownika, zostanie on zapisany jako plik .ui. Jak mogę to zrobić jako plik Pythona lub użyć tego w Pythonie?

Chris
źródło
1
Użyłem PySide QUiLoader, aby to osiągnąć - zobacz post [4442286] [1] [1]: stackoverflow.com/questions/4442286
Sven
Następująca metoda jest jeszcze bardziej praktyczna: stackoverflow.com/questions/14892713/ ...
iled

Odpowiedzi:

62

Innym sposobem użycia .ui w kodzie jest:

from PyQt4 import QtCore, QtGui, uic
class MyWidget(QtGui.QWidget)
    ...
    #somewhere in constructor:
    uic.loadUi('MyWidget.ui', self)

oba podejścia są dobre. Nie zapominaj, że jeśli używasz plików zasobów Qt (niezwykle przydatnych) dla ikon i tak dalej, musisz je również skompilować:

pyrcc4.exe -o ui/images_rc.py ui/images/images.qrc

Zauważ, że podczas uickompilacji interfejsu dodaje „import images_rc” na końcu pliku .py, więc musisz wkompilować zasoby do pliku o tej nazwie lub zmienić jego nazwę w wygenerowanym kodzie.

Maxim Popravko
źródło
2
Czy możesz dodać, jak uzyskać dostęp do zmiennej po zakończeniu? Takich jak pushButton?
Jonathan,
3
@JonathanLeaders Jeśli istnieje przycisk zdefiniowany w pliku .ui, po prostu nazwij go w ten sposób: self.pushButton. Możesz także załadować interfejs użytkownika do dowolnego atrybutu klasy: uic.loadUi ('uifile.ui', self.ui) i wywoływać widżety i takie rzeczy, jak self.ui.pushButton.
Maxim Popravko
49

Łącząc odpowiedź Maxa i post na liście mailingowej Shriramany Sharmy , stworzyłem mały działający przykład ładowania mywindow.uipliku zawierającego QMainWindow(więc po prostu wybierz opcję stworzenia głównego okna w File-Newoknie dialogowym Qt Designera ).

Oto kod, który go ładuje:

import sys
from PyQt4 import QtGui, uic

class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        uic.loadUi('mywindow.ui', self)
        self.show()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())
metakermit
źródło
3
To powinna być najlepsza odpowiedź, ponieważ jest to kompletny przykład.
Francesco Pasa
29

Musisz wygenerować plik Pythona z pliku interfejsu użytkownika za pomocą narzędzia pyuic (site-packages \ pyqt4 \ bin)

pyuic form1.ui > form1.py

z pyqt4

pyuic4.bat form1.ui > form1.py

Następnie możesz zaimportować form1 do swojego skryptu.

luc
źródło
25

Uważam, że ten artykuł jest bardzo pomocny.

http://talk.maemo.org/archive/index.php/t-43663.html

Krótko opiszę działania, aby utworzyć i zmienić plik .ui na plik .py, zaczerpnięte z tego artykułu.

  1. Uruchom Qt Designer z menu Start.
  2. W oknie „Nowy formularz” utwórz „Okno główne”
  3. Z pozycji „Wyświetl widżety” u dołu „Menu pola widżetów” po lewej stronie
    dodaj „Widżet z etykietą”. (Kliknij Przeciągnij i upuść)
  4. Kliknij dwukrotnie nowo dodany widget etykiet, aby zmienić jego nazwę na „Hello World”
  5. w tym momencie możesz użyć skrótu Control + R, aby zobaczyć, jak będzie wyglądać.
  6. Dodaj przyciski lub tekst lub inne widżety, przeciągając i upuszczając, jeśli chcesz.
  7. Teraz zapisz swój formularz. Plik-> Zapisz jako-> „Hello World.ui” (Control + S wywoła również
    opcję „Zapisz jako”). Zapisz katalog, w którym zapisałeś swój
    plik „Hello World” .ui . (Dla wygody zapisałem swoje w (C :))

Plik jest tworzony i zapisywany, teraz wygenerujemy z niego kod Pythona za pomocą pyuic!

  1. Z menu Start otwórz okno poleceń.
  2. Teraz „cd” do katalogu, w którym zapisałeś swój „Hello World.ui”. Po prostu musiałem „cd \” i znalazłem się w moim znaku zachęty „C:>”, w którym zapisano plik „Hello World.ui”.
  3. Gdy dojdziesz do katalogu, w którym przechowywany jest plik, wpisz następujące polecenie.
  4. pyuic4 -x helloworld.ui -o helloworld.py
  5. Gratulacje!! Masz teraz aplikację GUI Pythona Qt4 !!
  6. Kliknij dwukrotnie plik helloworld.py, aby go uruchomić. (Używam pyscriptera i po dwukrotnym kliknięciu
    otwiera się w pyscripter, a następnie „uruchamiam” plik z tego miejsca)

Mam nadzieję, że to komuś pomoże.

xopenex
źródło
1
Kompilowałem używając: pyuic4 helloworld.ui> helloworld.py. Naprawdę trzeba przekazać argumenty -x i -o do pyuic4. Dzięki za informację!.
muammar
Świetne wyjaśnienie, zwłaszcza że kod "generowania GUI" jest faktycznie w wygenerowanym pliku, pomógł mi, pozdrawiam!
Valmond
16

Możesz również użyć uicw PyQt5 z następującym kodem.

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.exit(app.exec_())
Akshay
źródło
12

Moim zdaniem czystszym sposobem jest najpierw eksport do .py, jak wspomniano powyżej:

pyuic4 foo.ui > foo.py

A następnie użyj go w swoim kodzie (np. main.py), Na przykład:

from foo import Ui_MyWindow


class MyWindow(QtGui.QDialog):
    def __init__(self):
        super(MyWindow, self).__init__()

        self.ui = Ui_MyWindow()
        self.ui.setupUi(self)

        # go on setting up your handlers like:
        # self.ui.okButton.clicked.connect(function_name)
        # etc...

def main():
    app = QtGui.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

W ten sposób daje możliwość innym osobom, które nie używają qt-designer do czytania kodu, a także zachowuje kod funkcjonalności na zewnątrz, foo.pyktóry mógłby zostać nadpisany przez projektanta. Po prostu odwołujesz się uido MyWindowklasy, jak widać powyżej.

stelios
źródło
self.ui.okButton.clicked.connect(self.function_name)daje mi TypeError: event() takes 1 positional argument but 2 were given. Jak to rozwiązałeś?
Ahsanul Haque
9

Możesz przekonwertować pliki .ui na wykonywalny plik Pythona za pomocą poniższego polecenia.

pyuic4 -x form1.ui > form1.py

Teraz możesz od razu uruchomić plik Pythona jako

python3(whatever version) form1.py

Możesz zaimportować ten plik i możesz go używać.

Jeba
źródło
FYI Jeśli pominiesz opcję -x, nie otrzymasz części kodu, która tworzy i uruchamia aplikację. Widziałem kilka odpowiedzi, w których pomijano „-x”. Ta odpowiedź jest najbardziej kompletna.
To nie maszyna.
5

możesz skompilować pliki ui w ten sposób

pyuic4 -x helloworld.ui -o helloworld.py
reviloera
źródło
4

Aby skompilować pliki .ui do plików .py, zrobiłem:

python pyuic.py form1.ui > form1.py

Att.

filipemr
źródło
2

w pyqt5 do konwersji z pliku ui do pliku .py

pyuic5.exe youruifile.ui -o outputpyfile.py -x

Aju George
źródło
0

Korzystanie z Anaconda3 (wrzesień 2018) i projektanta QT 5.9.5. W projektancie QT zapisz plik jako ui. Otwórz monit Anaconda. Wyszukaj swój plik: cd C: .... (skopiuj / wklej ścieżkę dostępu do pliku). Następnie napisz: pyuic5 -x helloworld.ui -o helloworld.py (helloworld = nazwa twojego pliku). Wchodzić. Uruchom Spyder. Otwórz plik .py.

Pifpy
źródło
0

( Listopad 2020 ) To zadziałało dla mnie ( UBUNTU 20.04 ):

pyuic5 /home/someuser/Documents/untitled.ui > /home/someuser/Documents/untitled.py
Achraf JEDAY
źródło