Рубрики
Без рубрики

Как распространить приложение WXPYPHON

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Допустим, вы закончите замечательное приложение GUI, используя wxpython. Как вы поделитесь этим с миром? Это всегда дилемма, когда вы закончите удивительную программу. К счастью, есть несколько способов поделиться своим кодом. Если вы хотите поделиться своим кодом с другими разработчиками, чем GitHub или аналогичный сайт, безусловно, хороший способ сделать. Я не буду покрывать использование Git или Mercurial здесь. Вместо этого вы узнаете, как превратить ваше заявление в исполняемый файл.

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

Существует много инструментов, которые вы можете использовать для создания исполняемого файла:

Вы будете использовать Pyinstaller В этом руководстве. Основная выгода для использования Pyinstaller заключается в том, что он может генерировать исполняемые файлы для Windows, Mac и Linux. Обратите внимание, что это делает не Поддержка кросс-компиляции. Что означает, что вы не можете запустить Pyinstaller на Linux, чтобы создать исполняемый файл Windows. Вместо этого Pyinstaller будет создать только исполняемый файл для ОС, на которой он работает. Другими словами, если вы запустите Pyinstaller в Windows, он создаст только исполняемый файл Windows.

Установка Pyinstaller.

Установка пакета Pyinstaller приятный и простой. Все, что вам нужно, это пип.

Вот как вы бы установили Pyinstaller в вашу систему Python:

pip install pyinstaller

Вы также можете установить Pyinstaller в виртуальную среду Python с помощью Python’s Венв модуль или Виртуальский упаковка.

Генерация исполняемого исполнения

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

Вот неработающий пример:

pyinstaller path/to/main/script.py

Если приложение Pyinstaller не найдено, вам, возможно, придется указать полный путь к нему. По умолчанию Pyinstaller устанавливает в папку Python’s ** Scripts **, которая будет в вашей системной папке Python или в вашей виртуальной среде.

Давайте возьмем одну из простых приложений из моего предстоящего книга и превратить его в исполняемый. Например, вы можете использовать image_viewer_slideShow.py Из главы 3:

# image_viewer_slideshow.py

import glob
import os
import wx

class ImagePanel(wx.Panel):

    def __init__(self, parent):
        super().__init__(parent)
        self.max_size = 240
        self.photos = []
        self.current_photo = 0
        self.total_photos = 0
        self.layout()
        
        self.slideshow_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_next, self.slideshow_timer)
        
    def layout(self):
        """
        Layout the widgets on the panel
        """
    
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
    
        img = wx.Image(self.max_size, self.max_size)
        self.image_ctrl = wx.StaticBitmap(self, wx.ID_ANY, 
                                             wx.Bitmap(img))
        self.main_sizer.Add(self.image_ctrl, 0, wx.ALL|wx.CENTER, 5)
        self.image_label = wx.StaticText(self, label="")
        self.main_sizer.Add(self.image_label, 0, wx.ALL|wx.CENTER, 5)
    
        btn_data = [("Previous", btn_sizer, self.on_previous),
                    ("Slide Show", btn_sizer, self.on_slideshow),
                    ("Next", btn_sizer, self.on_next)]
        for data in btn_data:
            label, sizer, handler = data
            self.btn_builder(label, sizer, handler)
    
        self.main_sizer.Add(btn_sizer, 0, wx.CENTER)
        self.SetSizer(self.main_sizer)
        
    def btn_builder(self, label, sizer, handler):
        """
        Builds a button, binds it to an event handler and adds it to a sizer
        """
        btn = wx.Button(self, label=label)
        btn.Bind(wx.EVT_BUTTON, handler)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        
    def on_next(self, event):
        """
        Loads the next picture in the directory
        """
        if not self.photos:
            return
        
        if self.current_photo == self.total_photos - 1:
            self.current_photo = 0
        else:
            self.current_photo += 1
        self.update_photo(self.photos[self.current_photo])
    
    def on_previous(self, event):
        """
        Displays the previous picture in the directory
        """
        if not self.photos:
            return
        
        if self.current_photo == 0:
            self.current_photo = self.total_photos - 1
        else:
            self.current_photo -= 1
        self.update_photo(self.photos[self.current_photo])
    
    def on_slideshow(self, event):
        """
        Starts and stops the slideshow
        """
        btn = event.GetEventObject()
        label = btn.GetLabel()
        if label == "Slide Show":
            self.slideshow_timer.Start(3000)
            btn.SetLabel("Stop")
        else:
            self.slideshow_timer.Stop()
            btn.SetLabel("Slide Show")
            
    def update_photo(self, image):
        """
        Update the currently shown photo
        """
        img = wx.Image(image, wx.BITMAP_TYPE_ANY)
        # scale the image, preserving the aspect ratio
        W = img.GetWidth()
        H = img.GetHeight()
        if W > H:
            NewW = self.max_size
            NewH = self.max_size * H / W
        else:
            NewH = self.max_size
            NewW = self.max_size * W / H
        img = img.Scale(NewW, NewH)
    
        self.image_ctrl.SetBitmap(wx.Bitmap(img))
        self.Refresh()
        
    def reset(self):
        img = wx.Image(self.max_size,
                       self.max_size)
        bmp = wx.Bitmap(img)
        self.image_ctrl.SetBitmap(bmp)
        self.current_photo = 0
        self.photos = []
        

class MainFrame(wx.Frame):

    def __init__(self):
        super().__init__(None, title='Image Viewer',
                                        size=(400, 400))
        self.panel = ImagePanel(self)
        self.create_toolbar()
        self.Show()
        
    def create_toolbar(self):
        """
        Create a toolbar
        """
        self.toolbar = self.CreateToolBar()
        self.toolbar.SetToolBitmapSize((16,16))
        
        open_ico = wx.ArtProvider.GetBitmap(
            wx.ART_FILE_OPEN, wx.ART_TOOLBAR, (16,16))
        openTool = self.toolbar.AddTool(
            wx.ID_ANY, "Open", open_ico, "Open an Image Directory")
        self.Bind(wx.EVT_MENU, self.on_open_directory, openTool)
    
        self.toolbar.Realize()
        
    def on_open_directory(self, event):
        """
        Open a directory dialog
        """
        with wx.DirDialog(self, "Choose a directory",
                          style=wx.DD_DEFAULT_STYLE) as dlg:
         
            if dlg.ShowModal() == wx.ID_OK:
                self.folderPath = dlg.GetPath()
                
                photos = glob.glob(os.path.join(self.folderPath, '*.jpg'))
                self.panel.photos = photos
                if photos:
                    self.panel.update_photo(photos[0])
                    self.panel.total_photos = len(photos)
                else:
                    self.panel.reset()


if __name__ == '__main__':
    app = wx.App(redirect=False)
    frame = MainFrame()
    app.MainLoop()

Если вы хотите превратить его в исполняемый файл, вы бы выполнили следующее:

pyinstaller image_viewer_slideshow.py

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

Когда вы запускаете эту команду, вы должны увидеть что-то вроде этого в вашем терминале:

Pyinstaller создаст два папки в той же папке, что и скрипт, который вы преобразуете, называется ** Dist ** и ** Build **. Папка ** DIST **, где вы найдете свой исполняемый файл, если Pyinstaller успешно завершится. Там будет много других файлов в папке **, помимо вашего исполняемого файла. Это файлы, которые необходимы для выполнения вашего исполняемого файла.

Теперь давайте попробуем запустить ваш недавно созданный исполняемый файл. Когда я запустил мою копию, я заметил, что клемма/консоль появилась за моим приложением.

Это нормально, поскольку поведение по умолчанию Pyinstaller является создание вашего приложения, как если бы это было приложение командной строки, а не графический интерфейс.

Вам нужно будет добавить -Наконзол Флаг, чтобы удалить консоль:

pyinstaller image_viewer_slideshow.py --noconsole

Теперь, когда вы запускаете результат, вы больше не должны видеть окно консоли, появляющееся за вашим приложением.

Он может быть сложен для распределения множества файлов, поэтому имеет другую команду, которую вы можете использовать, чтобы объединить все в один исполняемый файл. Эта команда `-onefile`. Кроме того, большая часть команд, которые вы используете с Pyinstaller, имеют более короткие псевдонимы. Например, есть более короткий псевдоним для `-Noconsole`, который вы также можете использовать под названием: -w Отказ Обратите внимание на одиночную тире в `-w`.

Итак, давайте возьмем эту информацию и попросите Pyinstaller создать один файл исполняемый файл без консоли:

распад папка.

Спецификация файла

Pyinstaller имеет концепцию файлов спецификации. Они видны как Setup.py Сценарий, который вы используете с Python’s Идуты Отказ Эти спецификации файлы говорят Pyinstaller, как создать исполняемый файл. Pyinstaller автоматически генерирует один для вас с тем же именем, что и пропущенный в скрипте, но с помощью .spec расширение. Так что если вы пройдете в image_viewer_slideShow.py тогда вы должны увидеть image_viewer_slideshow.spec Файл после запуска Pyinstaller. Этот файл SPEC будет создан в том же месте, что и ваш файл приложения.

Вот содержимое файла SPEC, который был создан из последнего запуска Pyinstaller выше:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['image_viewer.py'],
             pathex=['C:\\Users\\mdriscoll\\Documents\\test'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='image_viewer',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

Пока Pyinstaller отлично работал с примером визуала изображения, вы можете обнаружить, что он не будет работать из коробки, если у вас были другие зависимости, такие как Numpy или Pandas. Если вы столкнулись с проблемами с Pyinstaller, он имеет очень многословные журналы, которые вы можете использовать, чтобы помочь вам выяснить проблему. Одно хорошее расположение – файл «Build/Cli/Warn-Cli.txt». Вы также можете захотеть перестроить команду «-W», чтобы вы могли видеть, что напечатано на STDOUT в окне консоли.

Существуют также варианты изменения уровня журнала во время здания, которые могут помочь вам раскрывать проблемы.

Если ни одна из этих работ, попробуйте Google или пойти в Pyinstaller Страница поддержки И получить помощь там.

Создание исполняемых файлов для Mac

Хотя те же команды должны работать на Mac OSX, так как он делает в Windows, я обнаружил, что мне нужно было запускать следующую команду для создания рабочего исполняемого файла:

pyinstaller image_viewer_slideshow.py --windowed

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

Другой популярный вариант для генерации приложений на Mac – это пакет Python, называемый py2app Отказ

Создание исполняемых файлов для Linux

Для Linux обычно рекомендуется создать исполняемый файл со старой версией GLIBC, потому что новые версии Glibc являются обратно совместимыми. Строив со старой версией Linux, вы обычно можете нацелить более широкий сорт версий Linux. Но ваш пробег может варьироваться.

После того, как файлы будут сгенерированы, вы можете просто смоделировать их в Gzed Tarball (.tax.gz). Вы можете даже использовать приложение архивирования, которое вы создали в этой книге, чтобы сделать это для вас, если вы хотите.

Альтернатива будет изучать, как создать файл .deb или связанный файл, который может установить большинство версий Linux.

Узнать больше о Pyinstaller

Эта статья не предназначена для глубокого руководства по Pyinstaller. Это, вероятно, изменится намного быстрее, чем WxPython, поэтому рекомендуется прочитать Документация вместо этого Pyinstaller. Это всегда будет самым современным местом для получения необходимой вами информации на проекте.

Как насчет установщиков?

Пользователи Windows знают, что большую часть времени у вас есть приложение установщика, которое вы можете запустить, чтобы установить приложение на свой компьютер и поставить некоторые ярлыки здесь и там. Есть несколько полезных бесплатных программ, которые вы можете использовать для создания установщика Windows, а также некоторые платные

Вот два приложения для бесплатных программ, которые я вижу, упомянул больше всего:

Я использовал Inno Setup для создания установщика Windows в течение нескольких случаев. Это легко использовать и требует всего лишь небольшое чтение его документации, чтобы она работала. Я не использовал NSIS раньше, но я подозреваю, что это довольно легко в использовании.

Давайте использовать Inno Setup в качестве примера и посмотрите, как с ней создать установщик.

Создание установщика с Inno Setup

Inno Setup – это приятное приложение Freeware, которое вы можете использовать для создания профессиональных программ установщика. Работает на большинстве версий Windows. Я лично использовал его уже несколько лет. В то время как Inno Setup не является открытым исходным кодом, это все еще действительно хорошая программа. Вам нужно будет скачать и установить его оттуда Сайт Отказ

После установки вы можете использовать этот инструмент для создания установщика для исполняемого файла, который вы создали ранее в этой главе.

Чтобы начать, просто запустите Inno Setup, и вы должны увидеть следующее:

В то время как Inno настроен по умолчанию, чтобы открыть существующий файл, то, что вы хотите сделать, это выбрать второй вариант сверху: «Создайте новый файл сценария с помощью мастера сценариев». Затем нажмите ** ОК **.

Теперь вы должны увидеть первую страницу мастера сценариев Setup Inno. Просто нажмите ** Далее ** здесь, так как больше ничего не сможем сделать.

Теперь вы должны увидеть что-то вроде этого:

Это то, где вы вводите имени своих приложений, ее информацию о версии, имя издателя и веб-сайт приложения. Я предварительно заполнил его некоторыми примерами, но вы можете ввести все, что вы хотите здесь.

Идти вперед и нажмите Следующий И вы должны увидеть страницу 3:

Эта страница Wizard – это то, где вы можете установить каталог установки приложения. В Windows большинство приложений устанавливаются на ** программные файлы **, что также здесь по умолчанию. Это также, где вы устанавливаете имя папки для вашего приложения. Это имя папки, которая появится в программных файлах. Кроме того, вы можете проверить флажок внизу, что указывает, что ваше приложение не нуждается в папке вообще.

Пойдем на следующую страницу:

Вот где вы выберете основной исполняемый файл. В этом случае вы хотите выбрать исполняемый файл, который вы создали с Pyinstaller. Если вы не создали исполняемый файл, используя -Onefile Флаг, тогда вы можете добавить другие файлы, используя Добавить файл (ы) … кнопка. Если ваше приложение требует каких-либо других специальных файлов, таких как файл базы данных SQLite или изображения, это также где вы хотите их добавить.

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

Давай продолжим:

Это Ярлыки приложений Страница, и это позволяет вам управлять тем, какие ярлыки созданы для вашего приложения, и куда они должны идти. Варианты довольно объясняют. Я обычно просто использую значения по умолчанию, но вы можете изменить их, однако, что вы видите подходящие.

Давайте узнаем, что на странице документации:

Страница документации Из волшебника вы можете добавить файл лицензии вашего приложения. Например, если вы выкладываете приложение с открытым исходным кодом, вы можете добавить GPL или MIT или любой необходимый вами файл лицензии. Если это было коммерческое приложение, именно здесь вы добавили файл лицензионного соглашения конечного пользователя (EULA).

Посмотрим, что дальше:

Здесь вы можете настроить какие языки настройки должны быть включены. Inno Setup поддерживает довольно много языков, с английским языком в качестве выбора по умолчанию.

Теперь давайте узнаем, какие настройки компилятора:

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

Следующая страница предназначена для препроцессора:

Препроцессор в первую очередь для ловли опечатки в файле скрипта Inno Setup. Он в основном добавляет некоторые полезные варианты в совокупности времени для вашего скрипта установки Inno.

Проверьте Документация Для получения полной информации.

Нажмите Следующий И вы должны увидеть последнюю страницу мастера:

Нажмите Готово И Inno Setup будет генерировать файл сценария Script Setup (.iss). Когда он закончен, он спросит вас, хотите ли вы компилировать файл.

Продолжай и примите этот диалог, и вы должны увидеть следующее:

Это редактор скрипта Inno Setup с вашим недавно сгенерированным скриптом, предварительно загруженным в него. Верхняя половина – это сценарий, который был сгенерирован и нижняя половина показывает выход компилятора. На этом скриншоте он показывает, что файл установки был успешно сгенерирован, но он также отображает предупреждение, которое вы можете переименовать файл установки.

На данный момент у вас должен быть исполняемый файл рабочего установщика, который установит вашу программу и любые файлы, это зависит от правильных местоположений. Он также создает ярлыки в меню «Пуск» Windows, а в любых других местах вы указали в мастере.

Сам файл сценария может быть отредактирован. Это просто текстовый файл, а синтаксис хорошо документирован на веб-сайте Inno Setup.

Подписание кода

Windows и Mac OSX предпочитают, что приложения подписаны корпорацией или разработчиком. В противном случае вы увидите предупреждение о том, что вы используете unsigned of Code или программное обеспечение. Причина, по которой эти вопросы заключаются в том, что он защищает ваше заявление от модификации кого-то другого. Вы можете подумать о подписании кода как своего рода встроенный хеш MD5 в вашем приложении. Подписанное приложение можно проследить обратно к тому, кто подписал его, что делает его более достойным доверием.

Если вы хотите подписать код на Mac OSX, вы можете использовать Xcode.

Windows имеет несколько вариантов подписания их кода. Вот URL для получения вашего приложения сертифицировано для окон

Вы также можете приобрести сертификат от различных компаний, специализирующихся на подписании кода, например DigiCert Отказ

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

Обертывание

Теперь вы узнали, как генерировать исполняемые файлы с помощью Pyinstaller на Windows, Mac и Linux. Команда для создания исполняемого исполняемого файла совпадает с всеми платформами. Пока вы не можете создать исполняемый файл Windows, запустив Pyinstaller на Linux, он все еще очень полезен для создания исполняемого файла для целевой операционной системы.

Вы также узнали, как использовать Inno Setup для создания установщика для Windows. Теперь вы можете использовать эти навыки для создания исполняемых файлов для ваших собственных приложений или для некоторых других приложений, которые вы создали в этой книге!

Дальнейшее чтение

  • Учебник BBFREEZE – Построить двоичные серии!
  • Упаковка wxpymail для распределения