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

WXPYPHON: тур по кнопками (часть 2 из 2)

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

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

В последней статье мы накрыли широкий спектр кнопок, которые поставляются со стандартным пакетом WxPython. Теперь мы собираемся посмотреть на целую кучу больше! Если вы еще не разобрались, WXPYPHON принимает «батареи Python» включают в себя философию очень серьезно! В этом посте мы посмотрим на следующие кнопки:

  • wx.radiobutton
  • wx.spinbutton
  • Кнопка Aqua (Age)
  • ГрадиентБУТТОН (AGW)
  • Кнопка в форме (возраст)

Давайте возьмемся!

wx.radiobutton – не меняй этот канал!

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

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Radio Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        radio1 = wx.RadioButton( panel, -1, " Radio1 ", style = wx.RB_GROUP )
        radio2 = wx.RadioButton( panel, -1, " Radio2 " )
        radio3 = wx.RadioButton( panel, -1, " Radio3 " )
        
        radio1.Bind(wx.EVT_RADIOBUTTON, self.onButton)
        radio2.Bind(wx.EVT_RADIOBUTTON, self.onButton)
        radio3.Bind(wx.EVT_RADIOBUTTON, self.onButton)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(radio1, 0, wx.ALL, 5)
        sizer.Add(radio2, 0, wx.ALL, 5)
        sizer.Add(radio3, 0, wx.ALL, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        btn = event.GetEventObject()
        label = btn.GetLabel()
        message = "You just selected %s" % label
        dlg = wx.MessageDialog(None, message, 'Message', 
                               wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Обратите внимание, что основное отличие этой кнопки и те, которые мы видели в Предыдущая статья это флаг стиля: RB_Group. Это приводит к тому, что все следующие радиопередачи являются частью одной группы. Если вы снова установите этот флаг, вы начнете новую группу с этой точки (см. Также Учебник ZETCODE ). Мы также связали каждую из кнопок в одном обработчике событий, которые отобразит MessageGedialog для пользователя, который говорит им, какие кнопки они выбрали. Надуманный? Вы делаете ставку! Но это хорошо для иллюстративных целей.

Давайте возьмем спину с wx.spinbutton

Спинбуттон на самом деле просто стрелки вверх-вниз справа от элемента управления текстом, которые вы видите на скриншоте выше. Большую часть времени SPINCKERL или виджет Floatspin, вероятно, будет лучше. Но вот пример в любом случае:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Spin Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        self.text = wx.TextCtrl(panel, value="1")
        self.spin = wx.SpinButton(panel, style=wx.SP_VERTICAL)
        self.spin.SetRange(1, 100)
        self.spin.SetValue(1)
        
        self.Bind(wx.EVT_SPIN, self.OnSpin, self.spin)
        
        vSizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.text, 0, wx.CENTER)
        sizer.Add(self.spin, 0, wx.CENTER)
        vSizer.Add(sizer, 1, wx.CENTER)
        panel.SetSizer(vSizer)

    def OnSpin(self, event):
        self.text.SetValue(str(event.GetPosition()))
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Код выше приведен почти дословно от демонстрации WXPYPHON. Обратите внимание, что вы можете установить ориентацию кнопок. В этом случае мы устанавливаем его вертикально ориентированным. Вы также можете установить его горизонтальным. Есть и другие стили, но, похоже, нет много документации, поэтому я не смог найти, что были для спинбеттона, и которые были для SplitterWindow. Ну что ж. Вернуться к коду выше. Как видите, вместо того, чтобы привязать к EVT_Button, как у нас в прошлом, мы вместо этого связываемся с evt_spin. По какой-то причине демонстрация WXPYPHON использует событие. GetPosition, чтобы получить позицию спиннера. Вы могли бы просто назвать «self.spin.getValue» и получите то же самое.

Освежаются с Aquabutton

Следующие три кнопки все поступают из продвинутых универсальных виджетов (AGW) библиотеки, которая включена в Wxpython и была создана Andrea Gavana. Мы начнем, глядя на его Aquabutton. Aquabutton является одним из простейших виджетов в библиотеке AGW. Давайте посмотрим, как мы создаем пару из них:

# aquaBtnDemo.py

import wx
import wx.lib.agw.aquabutton as AB

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "AquaButton Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        button = AB.AquaButton(panel, bitmap=bmp, label="Press Me")
        button.SetForegroundColour("black")
        button.Bind(wx.EVT_BUTTON, self.onButton)
        
        buttonTwo = AB.AquaButton(panel, label="PulseOnFocus")
        buttonTwo.SetForegroundColour("black")
        buttonTwo.SetPulseOnFocus(True)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(button, 0, wx.CENTER|wx.ALL, 5)
        sizer.Add(buttonTwo, 0, wx.CENTER|wx.ALL, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        message = "You pressed the button!"
        dlg = wx.MessageDialog(None, message, 'Message', 
                               wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Aquabutton поддерживает растровые изображения, поэтому в этом примере мы показывать две кнопки: один с растровым изображением и один без. Еще одна аккуратная особенность Aquabutton – это его способность импульс, когда он имеет фокус. Вы можете включить или выключить эту функцию. Вторая кнопка имеет функцию включена. Причина того, что набор переднего плана – потому, что на Windows 7 панель является яркой белой в цвете, и это затрудняет чтение текста на кнопке, если вы используете цвет шрифта по умолчанию. Вы также можете установить цвет фона аквабуттона и его навесного цвета.

ГрадиентБуттон

ГрадиентБуттон похож на Aquabutton в том, что они оба округлые углы и могут иметь необязательное растровое изображение на них. Градиент, хотя не поддерживает пульсируя. Однако, поскольку его название подразумевает, GradientButton позволяет вам установить свой градиент сверху вниз, а также топ-/нижние цвета при нажатии. Мы просто сделаем быстрый взгляд на то, как создавать экземпляр по одному, так как вся цветная настройка довольно неясно, и есть хорошие примеры этого в демонстрационной демонстрации WXPYPHON:

# gradientBtnDemo.py

import wx
import wx.lib.agw.gradientbutton as GB

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "GradientButton Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        gbBtn = GB.GradientButton(panel, bitmap=bmp, 
                                  label="Gradient with bitmap")
        gbBtnNoBmp = GB.GradientButton(panel, label="Press Me")
        gbBtnNoBmp.Bind(wx.EVT_BUTTON, self.onPressMe)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(gbBtn, 0, wx.CENTER|wx.ALL, 5)
        sizer.Add(gbBtnNoBmp, 0, wx.CENTER|wx.ALL, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onPressMe(self, event):
        """"""
        message = "Thank You!"
        dlg = wx.MessageDialog(None, message, 'Message', 
                               wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()
        
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Как видите, создание градиента будет довольно простым и простым. Не стесняйтесь, чтобы попробовать! Я подожду … сделано уже? Тогда давайте закончим с шапочкой!

Вступить в форму с шапочкой

ShapedButton, вероятно, является самой сложной кнопкой, на которой мы посмотрим в этой статье. Сложным, я имею в виду, полнофункциональный. Вы можете создать нормальную кнопку, кнопку растрога, странное смещение Bitmap + текстовая кнопка, кнопки переключения, и вы можете повернуть текст под любым углом. Если вы посмотрите на DXPYPHON DEMO, вы также увидите, как сделать кнопку в эллиптическую форму. Фарфорттон требует Библиотека визуализации Python Чтобы быть установленным, так что если у вас его нет, получите его сейчас! Когда вы будете готовы, мы посмотрим на код, используемый для создания скриншота выше:

# shapedBtnDemo.py

import wx
from wx.lib.agw.shapedbutton import SButton, SBitmapButton
from wx.lib.agw.shapedbutton import SBitmapToggleButton, SBitmapTextToggleButton

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "ShapedButton Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        size = (75,75)
        
        sBtn = SButton(panel, label="Press Me", size=size)
        sBtn.Bind(wx.EVT_BUTTON, self.onShapedBtn)
        
        bmpBtn = SBitmapButton(panel, wx.ID_ANY, bitmap=bmp)
        bmpBtn.Bind(wx.EVT_BUTTON, self.onBmpShapedBtn)
        
        bmpToggleBtn = SBitmapToggleButton(panel, wx.ID_ANY, bitmap=bmp)
        bmpToggleBtn.Bind(wx.EVT_BUTTON, self.onToggle)
        
        bmpToggleTxtBtn = SBitmapTextToggleButton(panel, wx.ID_ANY,
                                                  bitmap=bmp,
                                                  label="Toggle!",
                                                  size=(100,100))
        rotatedTxtBtn = SButton(panel, label="Rotated!", size=size)
        rotatedTxtBtn.SetAngleOfRotation(90)
        
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(sBtn, 0, wx.ALL, wx.CENTER, 5)
        sizer.Add(bmpBtn, 0, wx.ALL, wx.CENTER, 5)
        sizer.Add(bmpToggleBtn, 0, wx.ALL, wx.CENTER, 5)
        sizer.Add(bmpToggleTxtBtn, 0, wx.ALL, wx.CENTER, 5)
        sizer.Add(rotatedTxtBtn, 0, wx.ALL, wx.CENTER, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onBmpShapedBtn(self, event):
        """"""
        dlg = wx.ColourDialog(self)
        dlg.GetColourData().SetChooseFull(True)
        if dlg.ShowModal() == wx.ID_OK:
            print "'You selected: %s\n" % str(data.GetColour().Get())
        dlg.Destroy()
        
    #----------------------------------------------------------------------
    def onToggle(self, event):
        """"""
        if event.GetIsDown():
            wx.CallAfter(self.showDialog, "You Toggled Me!")
        else:
            wx.CallAfter(self.showDialog, "You untoggled me!")
        event.Skip()
        
    #----------------------------------------------------------------------
    def onShapedBtn(self, event):
        """"""
        self.showDialog("You Pressed the Normal ShapedButton!")
    
    #----------------------------------------------------------------------
    def showDialog(self, message):
        """
        Displays a custom message
        """
        dlg = wx.MessageDialog(None, message, 'Message', 
                               wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()
        
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

В вышеупомянутом коде вы можете увидеть, как создать обычную форму ShapedButton, пару кнопок переключения и один с некоторым текстом, которые были повернуты на 90 градусов. Повернуть указанный текст, используйте метод SetAnleofrotation и пропустите количество градусов, чтобы угол его. В настоящее время существует какая-то ошибка, связанная с захватом мыши/окна с помощью туговой версии ShapedButton. Если вы попытаетесь отобразить диалог в обработчике кнопок, вроде в методе Ontoggle выше, вы получите ошибку, если вы не упаковываете вызов в WX.callafter. Вы можете прочитать больше о проблеме на Список рассылки wxpython Отказ

Обертывание

Если вы прочитали это далеко, то теперь вы знаете что-то о почти всех кладовых виджетах кнопок в WxPython. Поздравляю! Я надеюсь, что вы нашли это полезно, и в будущем вы не принимаете виджет как должное.

Примечание. Код в этой статье был протестирован на следующем:

  • Windows XP, WxPython 2.8.11.0, Python 2.5
  • Windows 7, WxPython 2.8.10.1, Python 2.6

Скачать источник

  • tourOfButtons2.zip
  • tourofbuttons2.tar.