Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Первые шаги в wxPython [Урок №2]

http://python-3.ru/uploads/wxpython-first-programm-example.jpg

В этой части обучения wxPython мы постараемся создать простейшие примеры.

Простой пример

Начать следует с самого простого примера. Нашим первым скриптом будет простое отображение небольшого окна. Мы проанализируем каждую линию нашего простейшего скрипта.

#!/usr/bin/python
import wx
 
app = wx.App()
 
frame = wx.Frame(None, -1, 'simple.py')
frame.Show()
 
app.MainLoop()

Это наш первый пример на wxPython.

#!/usr/bin/python

Первая линия начинается с шебанга (последовательность символов «#» и «!»), после которого следует путь к интерпретатору.

import wx

Следующая линия позволяет импортировать базовые модули wxPython. Среди них: ядро, элементы управления, графический интерфейс, окна и прочее. Технически, wx – это пространство имен. Все функции и объекты базовых модулей начинаются с префикса wx.

Следующая линия нашего кода создает объект приложения.

app = wx.App()

Каждая программа на wxPython должна иметь один объект приложения.

frame = wx.Frame(None, -1, 'simple.py')
frame.Show()

В этом участке мы создаем объект wx.Frame. Виджет wx.Frame является важным виджетом контейнера. Немного позже мы разберем этот виджет детальнее. Сам виджет wx.Frame является родительским для остальных виджетов. У него нет родительского виджета. Если мы укажем «none» для родительского параметра, то увидим, что у нашего виджета нет родительских виджетов. Таким образом wx.Frame является наивысшим виджетом в иерархии.

После того как мы создали виджет wx.Frame, нам необходимо воспользоваться методом Show(), чтбы отобразить его на экране.

app.MainLoop()

Последняя линия запускает основной цикл. Он является бесконечным. Основной цикл отлавливает и отправляет все события, которые происходят во время жизни приложения.

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

Результат нашего простого кода

Рис. 1. Результат нашего простого кода.

Wx.Frame

Виджет wx.Frame – один из наиболее важных в wxPython. Это виджет-контейнер. Это означает, что он может содержать внутри другие виджеты. На самом деле он может содержать любое окно, которое не является фреймом или диалогом. Виджет wx.Frame состоит из заголовка, граней и центральной части контейнера. Заголовок и грани являются опциональными. Их можно убрать, используя разные флаги.

Wx.Frame имеет следующий конструктор:

wx.Frame(wx.Window parent, int id=-1, string title='', wx.Point pos = wx.DefaultPosition, 
wx.Size size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, string name = "frame")

Конструктор имеет семь параметров. У первого параметра нет значения по умолчанию. Остальные семь параметров такое значение имеют. При этом первые три параметра – обязательные, а последние четыре – опциональные.

wx.DEFAULT_FRAME_STYLE представляет собой набор флагов по умолчанию. wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN. Комбинируя разные стили, мы можем изменять стилистику виджета wx.Frame. Ниже представлен наглядный пример изменения стилей.

#!/usr/bin/python
 
# nominimizebox.py
 
import wx
 
app = wx.App()
window = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER 
    | wx.SYSTEM_MENU | wx.CAPTION |     wx.CLOSE_BOX)
window.Show(True)
 
app.MainLoop()

Нашим намерением было отображение окна без функции сворачивания. Поэтому мы не указали данный флаг в параметре style.

Окно без элемента сворачивания

Рис. 2. Окно без элемента сворачивания.

Размер и позиция

Мы можем самостоятельно указать размер нашего приложения двумя разными способами. В первую очередь у нас есть параметр размера в конструкторе виджета. Также, мы можем воспользоваться методом SetSize().

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
# size.py
 
import wx
 
class Example(wx.Frame):
   
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
            size=(250, 200))
             
        self.Show()
 
 
if __name__ == '__main__':
  
    app = wx.App()
    Example(None, title='Size')
    app.MainLoop()

В этом примере размер приложения будет составлять 250х200 пикселей.

def __init__(self, parent, title):
    super(Example, self).__init__(parent, title=title, 
        size=(250, 200))

В конструкторе мы указали ширину виджета wx.Frame в 250 пикселей. Высоту виджета – в 200 пикселей.

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

Некоторые из них выполняют оптимизацию, в результате которой окна не перекрываются. В то же время программист может сам позиционировать окно. В конструкторе виджета wx.Frame нам уже попадался параметр pos. Если устанавливать значения, отличные от указанных по умолчанию, мы сможем управлять позицией размещения окна.

Существует несколько методов, с помощью которых можно сделать это.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
# move.py
 
import wx
 
class Example(wx.Frame):
  
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
            size=(300, 200))
            
        self.Move((800, 250))
        self.Show()
 
 
if __name__ == '__main__':
  
    app = wx.App()
    Example(None, title='Move')
    app.MainLoop()

Также существуют ситуации, когда нам может потребоваться отображение окна с максимальными размерами. В этом случае окно размещается в позиции (0, 0) и занимает весь экран. В данном случае wxPython вычисляет внутренние координаты экрана. Для отображения окна wx.Frame с максимальными размерами используется метод Maximize().

Центрирование на экране

Если мы захотим центрировать наше приложение на экране, у wxPython найдется для этого удобный метод. Используя метод Centre() наше окно будет размещено в центре экрана. Нет необходимости высчитывать ширину и высоту экрана для определения позиции окна. Нужно лишь воспользоваться данным методом.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
# center.py
 
import wx
 
class Example(wx.Frame):
  
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
            size=(300, 200))
            
        self.Centre()
        self.Show()
 
 
if __name__ == '__main__':
   
    app = wx.App()
    Example(None, title='Center')
    app.MainLoop()

В этом примере мы центрировали небольшое окно на нашем экране.

self.Centre()

Это метод, который центрирует окно на экране.

В этом разделе мы изучили наиболее простые примеры работы wxPython.