Я наткнулся на интересный вопрос на StackOverflow несколько лет назад. Его автор спрашивал, как он может динамично писать программу, используя wxPython. Другими словами, он хотел получить возможность использовать встроенный в wxPython функционал reload(). Если мы хотим попробовать сделать это, нам нужно написать небольшой фронт-енд интерфейс, в который мы и импортируем код, который мы хотим редактировать интерактивно.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Создание перезагружающегося приложения
Создание перезагружающегося приложения – простой и прямолинейный процесс. Всё, что нам нужно это приложение, которое запрограммировано на динамическую перезагрузку. Python сделает всё остальное. Давайте взглянем на код перезагружающегося приложения, а затем взглянем на простое приложение, которое мы будем редактировать и перезагружать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# main.py import testApp import wx class ReloaderPanel(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) self.testFrame = None showAppBtn = wx.Button(self, label="Show App") showAppBtn.Bind(wx.EVT_BUTTON, self.onShowApp) reloadBtn = wx.Button(self, label="Reload") reloadBtn.Bind(wx.EVT_BUTTON, self.onReload) mainSizer = wx.BoxSizer(wx.VERTICAL) mainSizer.Add(showAppBtn, 0, wx.ALL|wx.CENTER, 5) mainSizer.Add(reloadBtn, 0, wx.ALL|wx.CENTER, 5) self.SetSizer(mainSizer) def onReload(self, event): """ Перезагрузить код! """ if self.testFrame: self.testFrame.Close() try: reload(testApp) except NameError: # reload doesn't exist in Python 3. # Use importlib.reload in Python 3.4+ # or imp.reload in Python 3.0 - 3.3 import importlib importlib.reload(testApp) self.showApp() else: self.testFrame = None def onShowApp(self, event): """ Вызвать метод showApp() """ self.showApp() def showApp(self): """ Отобразить приложение, которое мы будем динамически редактировать """ self.testFrame = testApp.TestFrame() class ReloaderFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Reloader") panel = ReloaderPanel(self) self.Show() if __name__ == "__main__": app = wx.App(False) frame = ReloaderFrame() app.MainLoop() |
Здесь мы импортируем модуль, который мы будем редактировать в то время, когда скрипт уже запущен. В данном случае, модуль называется testApp (а сам файл назван testApp.py). Затем мы добавляем пару кнопок: одну для отображения фрейма testApp, другую для перезагрузки кода testApp и повторного его отображения, но уже со внесёнными изменениями. Соглашусь, нам скорее всего стоило бы добавить хэндлинг исключений на случай, если в коде будет сделана опечатка, но я решил не делать этого, чтобы вы поупражнялись самостоятельно.
Теперь же нам нужно создать файл testApp.py.
Создание динамического приложения
Теперь нам нужно создать супер-простое приложение, которое мы сможем обновить и перезагружать, используя наше приложение для перезагрузки. Вот небольшой фрагмент кода, который невероятно прост:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# testApp.py import wx class TestPanel(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) btn = wx.Button(self, label='Test') class TestFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Test program") panel = TestPanel(self) self.Show() if __name__ == "__main__": app = wx.App(False) frame = TestFrame() app.MainLoop() |
Теперь, всё что вам нужно – это отредактировать второй файл и перезагрузить его с помощью первого файла, чтобы увидеть изменения. Я советую добавить кнопку в класс TestPanel, которая бы сохраняла предыдущую версию, а затем уже нажимать на кнопку «Перезагрузка» в другом скрипте, чтобы увидеть изменения.
Итоги
Создание простого приложения для перезагрузки может помочь вам избежать повторений в вашем кода, а также, но это весьма спорно, сэкономит вам массу времени, которое вы бы потратили на постоянное сохранение кода и повторный запуск своего приложения.
Как бы то ни было, это довольно забавный способ изучения как wxPython, так и принципа работы Python в целом. Кроме этого, поиск новых забавных способов реализации своих идей – неотъемлемая часть разработки программного обеспечения. Я думаю, что вы должны получить удовольствие в процессе кодинга.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»