Создание автономных приложений Mac OS X с Python (проблема с внешним ini-файлом) - PullRequest
0 голосов
/ 09 июня 2019

У меня проблема при компиляции автономного приложения в Mac OS (на самом деле я использую macOS Mojave 10.14.4) с некоторыми данными во внешнем INI-файле

Попытка компилировать с использованием py2app .

Мой main.py

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMessageBox

from decryptwindow import Ui_Dialog  # importing our generated file

import sys
import os

class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)


    app = QtWidgets.QApplication([])
    application = mywindow()
    application.show()
    sys.exit(app.exec())

Мой файл интерфейса ( decryptwindow.py )

# Created by: PyQt5 UI code generator 5.11.3

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QInputDialog, QFileDialog, QListWidget, QMessageBox
from PyQt5.QtCore import pyqtSlot
import os
import configparser

from itertools import filterfalse
from pathlib import Path

import click
import PyPDF2

config = configparser.RawConfigParser()
config.read('config.ini')
path_val = config.get('DEFAULT', 'path')
browsetooltip = config.get('LANGUAGE', 'browsetooltip')
selectbutton = config.get('LANGUAGE', 'selectbutton')

if not os.path.exists(path_val):
    path_val = /Users


class Ui_Dialog(QWidget):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(325, 269)
        self.directory = path_val
        self.BrowsepushButton = QtWidgets.QPushButton(Dialog)
        self.BrowsepushButton.setEnabled(True)
        self.BrowsepushButton.setGeometry(QtCore.QRect(240, 10, 75, 23))
        self.BrowsepushButton.setObjectName("BrowsepushButton")
        self.BrowsepushButton.setToolTip(browsetooltip)
        self.BrowsepushButton.clicked.connect(self.BrowsepushButton_on_click)
        self.fileslistWidget = QtWidgets.QListWidget(Dialog)
        self.fileslistWidget.setGeometry(QtCore.QRect(20, 10, 201, 171))
        self.fileslistWidget.setObjectName("fileslistWidget")
        # fill the fileslistWidget with the files from the folder 
        # The folder is taken from the config.ini
        for file_name in os.listdir(path_val):  
        self.fileslistWidget.addItem(file_name)   
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "PDF decrypt/Encrypt utility"))
        self.BrowsepushButton.setText(_translate("Dialog", selectbutton))

    def BrowsepushButton_on_click(self):
        # print('BrowsepushButton button clicked')

        self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Choose the folder")
        if self.directory:  
            for file_name in os.listdir(self.directory):  
                self.fileslistWidget.addItem(file_name)  
            # update existing value in ini file with the self.directory
                config.set('DEFAULT', 'Path', self.directory)
            # save last selected folder back to config.ini
                with open('config.ini', 'w') as configfile:
                    config.write(configfile)

Мой ini-файл ( config.ini )

[DEFAULT]
path = /FM32YO/files

[LANGUAGE]
browsetooltip = Click to Select the folder
selectbutton = Select folder

Я ожидаю, что путь будет записан в файл config.ini .На самом деле у меня это есть, когда я запускаю свое приложение через python3

Однако мне нужно отдельное приложение.

Так что мои шаги

1) py2applet --make-setup main.py

""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['main.py']
DATA_FILES = ['']
OPTIONS = {}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

2) python3 setup.py py2app

И вот мы здесь.У меня есть файл приложения, готовый к запуску.Однако, как только я его запустил, возникла неизвестная ошибка терминала.

Мне удалось избежать ошибки только после включения config.ini в setup.py , чтона самом деле не хорошо

Так что мой setup.py теперь выглядит так:

""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['main.py']
DATA_FILES = ['config.ini']
OPTIONS = {}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

После этого приложение работает нормально.Но ...., поскольку config.ini включен в приложение, он больше не доступен для записи.

У кого-нибудь есть идеи, как решить проблему?

Спасибо.

ps Кстати, в windows (приложение, скомпилированное в exe-файл) все работает нормально.

1 Ответ

0 голосов
/ 09 июня 2019

Попробуйте запустить Platypus , чтобы преобразовать скрипт Python в исполняемый файл. Я использовал его, и он хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...