Генерация кода Python с помощью pyside-uic

Как я могу сгенерировать код Python из файла QtDesigner? Я нашел pyside-uic, но не могу найти пример синтаксиса. Я запускаю win7 и pythonxy с помощью spyder.


person ArtDijk    schedule 14.12.2010    source источник


Ответы (8)


pyside-uic более или менее идентичен pyuic4, поэтому на странице руководства указано:

Usage:
        pyside-uic [options] <ui-file>

Options:
    --version
        show program's version number and exit

    -h,--help
        show this help message and exit

    -oFILE,--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

    -iN,--ident=N
        set indent width to N spaces, tab if N is 0 (default: 4)

Я обычно использую это так:

pyside-uic -o output.py input.ui
person FrederikNS    schedule 04.05.2011
comment
Обычно я использую это так (в Windows): pyside-uic.exe useful_filename.ui > useful_filename_ui.py Тогда я могу отслеживать, используя это простое соглашение об именах. В будущем я планирую больше не использовать это, а вместо этого буду использовать класс QUILoader (см. @Sven ниже) ... - person Neon22; 05.12.2012
comment
Я предпочитаю создавать UI-код с помощью pyside-uic, а не с помощью загрузчика, потому что 1-й: с дизайнером и xml-кодом вы никогда не поймете, как на самом деле размещен материал. Итак, вы продолжаете бороться, как самому динамически кодировать Qt. 2-й: компиляция в py, а затем pyc выполняется один раз, пока вы не измените пользовательский интерфейс, а не каждый раз, когда запускаете свой скрипт! 3-й: вы избегаете большого количества сложностей в своем коде. Это import против всего этого загрузчика! Я знаю, что это уже не вопрос времени, но мне всегда хочется много тратить при загрузке xml. - person ewerybody; 12.03.2015

Просто попробовал QUILoader от Pyside, отлично работает:

from PySide import QtGui  
from PySide import QtCore
from PySide import QtUiTools

class MyWidget(QtGui.QMainWindow):
    def __init__(self, *args):  
       apply(QtGui.QMainWindow.__init__, (self,) + args)

       loader = QtUiTools.QUiLoader()
       file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui")
       file.open(QtCore.QFile.ReadOnly)
       self.myWidget = loader.load(file, self)
       file.close()

       self.setCentralWidget(self.myWidget)

if __name__ == '__main__':  
   import sys  
   import os
   print("Running in " + os.getcwd() + " .\n")

   app = QtGui.QApplication(sys.argv)  

   win  = MyWidget()  
   win.show()

   app.connect(app, QtCore.SIGNAL("lastWindowClosed()"),
               app, QtCore.SLOT("quit()"))
   app.exec_()

Я использовал Eclipse и QTDesigner для создания файла .ui (щелкните правой кнопкой мыши модуль, «Создать -> Другое ..», выберите «Qt Designer -> Форма Qt Designer»). Никакого явного вызова uic не требуется.

person Sven    schedule 03.01.2012
comment
+1 за хороший, полный пример. Однако с одной этой вещью я застрял: QFile направляет путь к верхнему каталогу пакета для пути к файлу, а не каталог, в котором находится этот код. Просто для тех, кто застрял в будущем. - person IsaacS; 30.10.2012
comment
Проблема в том, что loader.load возвращает объект. Но в uic мы получаем класс, а затем можем создавать подклассы в соответствии с нашими потребностями. Но в loader.load всегда возвращайте экземпляр объекта, поэтому нет подкласса или настройки. Даже он не может загрузить пользовательский виджет: обратитесь к этой ошибке: bugreports.qt-project.org / browse / PYSIDE-77 - person Sarim; 06.07.2013

pyside-uic.exe MyWindow.ui -o MyWindow.py 

это то, что я делал, и он работает нормально (насколько я знаю)

person Mike    schedule 02.12.2011

import pysideuic
import xml.etree.ElementTree as xml
from cStringIO import StringIO

def loadUiType(uiFile):
    """
    Pyside "loadUiType" command like PyQt4 has one, so we have to convert the 
    ui file to py code in-memory first and then execute it in a special frame
    to retrieve the form_class.
    """
    parsed = xml.parse(uiFile)
    widget_class = parsed.find('widget').get('class')
    form_class = parsed.find('class').text

    with open(uiFile, 'r') as f:
        o = StringIO()
        frame = {}

        pysideuic.compileUi(f, o, indent=0)
        pyc = compile(o.getvalue(), '<string>', 'exec')
        exec pyc in frame

        # Fetch the base_class and form class based on their type
        # in the xml from designer
        form_class = frame['Ui_%s'%form_class]
        base_class = eval('QtGui.%s'%widget_class)

    return form_class, base_class

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

pyside-uic.exe MyWindow.ui -o MyWindow.py
person Community    schedule 07.01.2013
comment
откуда ты взял pysideuic? Потому что его нет в пакете PySide. - person Romulus; 10.09.2014

Класс QUiLoader выполнит эту работу без создания промежуточного файла.

http://www.pyside.org/docs/pyside/PySide/QtUiTools/QUiLoader.html

person Neon22    schedule 14.01.2011
comment
по состоянию на декабрь 2010 года разработчики pyside соглашаются, что quiloader не готов. вместо этого используйте pyside-uic. - person Neon22; 04.02.2011
comment
Источник? Изменилась ли эта позиция? - person Nick Zalutskiy; 20.12.2011

Прочтите документацию. В этом конкретном случае http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#pyuic4:

The pyuic4 utility is a command line interface to the uic module. The command has the following syntax:

pyuic4 [options] .ui-file

The full set of command line options is:
-h, --help  A help message is written to stdout.
--version   The version number is written to stdout.
-i N, --indent=N
    The Python code is generated using an indentation of N spaces. If N is 0 then a tab is used. The default is 4.
-o FILE, --output=FILE
    The Python code generated is written to the file FILE.
-p, --preview   The GUI is created dynamically and displayed. No Python code is generated.
-w, --pyqt3-wrapper
    The generated Python code includes a small wrapper that allows the GUI to be used in the same way as it is used in PyQt v3.
-x, --execute   The generated Python code includes a small amount of additional code that creates and displays the GUI when it is executes as a standalone application.
--from-imports  Resource modules are imported using from . import rather than a simple import.
person Community    schedule 14.12.2010
comment
Ооо! Полностью пропустил бит PySide. К счастью, PyQt4 многое сделал правильно, поэтому PySide не пришлось сильно менять :) - person ; 14.12.2010

Использование QtUiTools (как предлагается в другом ответе) в настоящее время не рекомендуется командой PySide.

Читайте полную историю здесь: https://groups.google.com/forum/?fromgroups=#!topic/pyside/_s1HPe6XTZs

person Max Ekman    schedule 09.11.2012

Посмотрите на C: \ Python27 \ Lib \ site-packages \ PySide \ scripts \ uic.py (или там, где у вас установлен python). Если вы посмотрите на этот сценарий, вы увидите параметры, помеченные и описанные на странице руководства (которую я не знаю, как правильно просматривать в Windows. Приветствуются советы.) Здесь http://manpages.ubuntu.com/manpages/precision/man1/pyside-uic.1.html

Я немного запутался, пытаясь посмотреть на C: \ Python27 \ Lib \ site-packages \ pysideuic \ pyside-uic.1, так как я подумал, что это должен быть вызываемый файл. Даже попытка рассматривать это как справочную страницу для меня невозможна из-за всех лишних символов. Вы не можете изучить синтаксис, пытаясь угадать, какие символы лишние, а какие нет!

В Windows вы можете автоматизировать это с помощью командного файла, конечно, сохранив текстовый файл с вышеупомянутой строкой (ниже для справки) с расширением .bat, например uic_generator.bat.

pyside-uic MyWindow.ui -o MyWindow.py

person steventaitinger    schedule 28.11.2014