5

Python 2.7 と PySide 1.1.2 を使用するプロジェクトに取り組んでいます。私のコードは GNU/Linux で問題なく動作していますが、Windows (7 および 8) にも配布したいと考えています。ユーザーが Python と PySide をインストールすることは期待できないので、py2exe を使用することにしました (cx_freeze と pyinstaller も試しました)。

まず、私のファイル ツリーは次のとおりです: My Project on GitHub

setup.py を作成しました。

# -*- coding: utf-8 -*-

from distutils.core import setup
import py2exe

setup(
    console=['bin/metusuite.py'],
    name='metusuite',
    version='0.1',
    author='H. Gökhan Sarı',
    author_email='me@th0th.me',
    packages=['metusuite_libs'],
    package_dir={'metusuite_libs': 'metusuite_libs'},
    package_data={'metusuite_libs': ['ui/*', 'images/*']},
    scripts=['bin/metusuite.py'],
    url='https://github.com/th0th/metusuite/',
    license='LICENSE.txt',
    description='METU Suite.',
    long_description=open('README.md').read(),
)

私が走るとき

setup.py py2exe

「dist」フォルダーに metusuite.exe が正常にビルドされますが、アプリケーションは Qt Designer で作成された外部ユーザー インターフェイス ファイルに依存しており、それらが見つからないため、エラーが発生します。

Designer: An error has occurred while reading the UI file at line 1, column 0: Premature end of document.
Traceback (most recent call last):
  File "metusuite.py", line 38, in <module>
  File "metusuite_libs\msCafeteriaMenu.pyc", line 37, in __init__
  File "metusuite_libs\msCafeteriaMenu.pyc", line 17, in __init__
RuntimeError: Unable to open/read ui device

そして、その構造に *.ui ファイル (いくつかの .png アイコンもあります) を追加する方法がわかりませんでした。.ui ファイルを Python コードに変換することを考えていましたが、アイコンを追加する必要があるときに同じ問題が発生しました。

したがって、py2exe構造にuiおよびpngファイルを追加するにはどうすればよいですか? または、私が達成しようとしていることの代替方法はありますか?

4

1 に答える 1

10

さて、私はあなたが2つの現実的なことのいずれかを行うことができると思います:

  1. pyside-uicを使用して .ui ファイルを .py ファイルにコンパイルし、コードを変更して、ユーザー インターフェイス用に py ファイルの条件付き読み込みを行い、png ファイルを Qt リソース ファイルに配置します。
  2. その中にuiファイルを含むQtリソースファイルを作成し、それをpyside-rccでコンパイルしてから、QtUiToolsまたは同様のプロセスを使用してuiファイルをロードします

pyside-uic

pyside-uicC++ での Qt の知識と相関するプログラムに ui ファイルをロードする最も簡単な方法であるため、ui ファイルをロードする方法を使用することを非常に好みます。pyside-uicは PySide アプリケーションに含まれており、私にとっては、Python インストールの Scripts ディレクトリにありますC:\Python27\Scripts\pyside-uic.exe。C++ コンパイルが ui ファイルを処理する方法からメモを取ると、通常、ui ファイルを ui_[ui ファイルの名前].py のような名前にコンパイルします。

C:\Python27\Scripts\pyside-uic mainwindow.ui > ui_mainwindow.py

その結果の .py ファイル内で、pyside-uic は、Ui_ を前に付けた ui ファイルの基本クラスと同じ名前のクラスを作成します。したがって、たとえば、MainWindow という名前のクラスの定義を含む mainwindow.ui を作成した場合、作成されるクラスは Ui_MainWindow になります。ui ファイルで SourceWindow という名前のクラスが定義されている場合、.py ファイル内のクラスは Ui_SourceWindow. objectNameQt Designerでは、オブジェクト ツリーのルート要素 (ウィンドウの右上) に設定することで、クラス名を設定します。

ファイル cafeteria_menu,ui および dialog_login.ui を使用すると、派生クラス Ui_cafeteria_menu および Ui_dialog_login を取得できます。

.py ファイルを生成したら、それをウィジェットの定義ファイルにインポートして使用し、Ui ファイルのクラスの setupUi メソッドを使用して使用できます。

from PySide import QtCore, QtGui
from ui_mainwindow import Ui_MainWindow

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

クラスの ui を定義したら、ウィジェットのすべての接続と ui 要素に self.ui からアクセスする必要があります。

        self.ui.lineEdit.textChanged[str].connect(self.processText)

.png ファイルを Qt リソース ファイルに配置する必要があるため、それについては次のセクションで説明します。

pyside-rcc

Likepyside-uicpyside-rccPySide アプリケーションに含まれていますが、私のものは Scripts ではなく Python の site-packages ディレクトリにあります (同じ場所にある場合は、いつでもコピーできます)。

C:\Python27\lib\site-packages\PySide\pyside-rcc.exe

Qt リソース ファイルをコンパイルする前に、まず Qt ツールの 1 つを使用して作成する必要があります。Qt Creator は、Qt に関連するほぼすべての機能を 1 つのアプリケーションで実行できるため、Qt Creator を使用しています。Qt リソース システムのドキュメントによると、リソース ファイルは実際には、リソース システムのファイル パスと内部パスを定義する単なる XML ファイルです。必要に応じてファイルを設定および編成できますが、コンパイルに関しては、リソース ファイルで定義されたすべてのファイルが同じディレクトリまたはファイルのサブディレクトリにある必要があります。リソース ファイルを定義したら、pyside-rcc.exe を使用して .py ファイルにコンパイルする必要があります。通常、リソース ファイルにはプロジェクトと同じ名前を付け、すべてを 1 つのリソース ファイルにまとめて、リソースをより簡潔に処理できるようにします。

C:\Python27\lib\site-packages\PySide\pyside-rcc.exe -py2 MyProject.qrc > MyProject_Resources.py

-py2 スイッチは、ファイルからの出力を Python 2.x 用にフォーマットする必要があることを定義します。Python 3.x を使用している場合、または将来使用する予定がある場合は、-py3 スイッチを使用すると、結果は Python 3.x と互換性があります。

すべてを一緒に入れて

既に ui ファイルを直接ロードしているためQUiLoader、QUiLoader ステートメントをリファクタリングして、リソース システムから ui リソースを開く QFile をロードするだけです。リソース システムのファイルを使用するには、pyside-rcc から生成された Resource .py ファイルをプログラムのメイン スクリプト ファイルにインポートするだけです。リソース ファイルの最後の行は、プログラム全体で使用されるリソースを初期化する qInitResources()。QFile を使用してファイルをロードするには、「:」で始まるパスを使用し、リソース ファイルで定義されたパスを参照します。サブカテゴリとして定義された ui ファイルと png ファイルを持つ ui と images を持つファイル msResources.qrc を作成できます。

したがって、リソースファイルが次のようになっている場合

/ui
    cafeteria_menu.ui
    dialog_login.ui
/images
    cafeteria-menu.png
    exit.png
    logo.png
    mail-fetch.ong

そして、これらのファイルをロードしたい場合は、次のように QIcon または QFile を作成するだけです:

cafeteriaMenuIcon = QtGui.QIcon(":/images/cafeteria-menu.png")
cafeteriaMenuUi = QtCore.QFile(":/ui/cafeteria_menu.ui")

msCafeteriaMenu の GUICafeteriaMenu のコードで使用する場合、GuiCafeteriaMenu の__init__メソッドを変更して、リソースから ui ファイルをロードして使用するだけです。

uiFile = QFile(":/ui/cafeteria_menu.ui")
uiFile.open(QFile.ReadOnly)
UiLoader.load(uiFile, self)
uiFile.close()

おそらく、pyside-rcc から metsuite_libs パッケージへの出力を msResources.py のようなものに配置し、msResources ファイルを__init__.pyパッケージの一部としてファイルにインポートします。そうすれば、.py ファイルを作成してプログラムにインポートすると、余分なファイルがパッケージにカプセル化され、setup.py ファイルを変更する必要がなくなります。py2exe 変換を行う前に、リファクタリングされたプログラムを実行すると、正常に動作するはずです。さらに、ui ファイルの処理方法に関係なく、常にリソース ファイルを使用して、アイコンをプログラムにパッケージ化できるようにする必要があります。移植性の理由から、アイコンにリソース ファイルを使用することは、おそらく慣れるには良い習慣です。

于 2012-11-18T19:00:11.463 に答える