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

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

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

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

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

Общий виджет wx.button

Первая кнопка, которые большинство программистов WXPYPHON, скорее всего, будут использовать WX.Button. Он включает в себя сетевую кнопку управления на трех основных платформах и просто выглядит «правильно» на каждом из них. Вот действительно простой пример того, как мы будем использовать один:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        button = wx.Button(panel, id=wx.ID_ANY, label="Press Me")
        button.Bind(wx.EVT_BUTTON, self.onButton)
        # self.Bind(wx.EVT_BUTTON, self.onButton, button)
        
    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        print "Button pressed!"
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Все вышеперечисленное код создает простой вид с одной кнопкой. Кнопка связана с onbutton обработчик события. Обратите внимание, что есть еще один способ связывания, который прокомментирован. Робин Данн объясняет разницу между двумя способами связать событие на Вики Так что, если вы этого не понимаете, просмотрите это! Если вы не хотите получить полное объяснение, вот мой взять:

  • Self.bind будет связывать событие родителю (обычно WX.Frame) через кнопку. Это означает, что событие, возможно, придется плавать через несколько слоев событий, прежде чем он достигнет родителя. Если где угодно в этих слоях обработчиков, разработчик не вызывает Event.skip (), то событие останавливается.
  • Widget.bind Для всех намерений и целей связывает событие только к этому виджету. Если вы хотите, вы можете позвонить в Event.skip () здесь, чтобы пройти событие на панель и вверх, хотя я не могу придумать время, когда мне нужно сделать это с помощью кнопки.

Привязка нескольких виджетов к тому же обработчику

Довольно общая практика необходимо связать несколько виджетов только к одному обработчику, а затем дифференцироваться между вызывающими виджетами из Handler. Есть несколько способов получить необходимую информацию. Мы посмотрим на пару самых популярных способов на самом деле сам виджет:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        buttonOne = wx.Button(panel, id=wx.ID_ANY, label="One", name="one")
        buttonTwo = wx.Button(panel, id=wx.ID_ANY, label="Two", name="two")
        buttonThree = wx.Button(panel, id=wx.ID_ANY, label="Three", name="three")
        buttons = [buttonOne, buttonTwo, buttonThree]
        
        for button in buttons:
            self.buildButtons(button, sizer)
            
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def buildButtons(self, btn, sizer):
        """"""
        btn.Bind(wx.EVT_BUTTON, self.onButton)
        sizer.Add(btn, 0, wx.ALL, 5)
        
    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        button = event.GetEventObject()
        print "The button you pressed was labeled: " + button.GetLabel()
        print "The button's name is " + button.GetName()
        
        button_id = event.GetId()
        button_by_id = self.FindWindowById(button_id)
        print "The button you pressed was labeled: " + button_by_id.GetLabel()
        print "The button's name is " + button_by_id.GetName()
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Здесь у нас есть три кнопки, каждый из которых связан с onbutton обработчик события. Есть два способа получить объект кнопки:

  1. event.geteventobject ()
  2. self.findwindowbyid (button_id)

Первый получает виджет непосредственно в один падение. Второе требует от нас, чтобы получить идентификатор виджета, используя Event.Getid Отказ В любом случае, как только у вас есть кнопка, вы можете вызвать любой из его методов. В нашем примере мы получаем имя кнопки и текущую этикетку. Мы также можем изменить метку кнопки или другие атрибуты с помощью соответствующего метода установотера (I.E. SetLabel). Теперь давайте обратим наше внимание на некоторые другие кнопки, доступные нам.

Кнопки переключения и битовые кнопки

Вторая самая популярная кнопка, вероятно, является подразделением между кнопками Toggle и Bitmap кнопки. С WxPython у вас есть два варианта для обоих типов кнопок: используйте нативные версии (где это возможно) или используйте одну из общих версий (I.E. Кнопки, написанные в чистом Python, а не вздрогнули). Давайте посмотрим на все четыре:

import wx
import wx.lib.buttons as buttons
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        # create a normal toggle button
        button = wx.ToggleButton(panel, label="Press Me")
        button.Bind(wx.EVT_TOGGLEBUTTON, self.onToggle)
        
        # create a generic toggle button
        gen_toggle_button = buttons.GenToggleButton(panel, -1, "Generic Toggle")
        gen_toggle_button.Bind(wx.EVT_BUTTON, self.onGenericToggle)
        
        # create a normal bitmap button
        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        bmapBtn = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
                                  size=(bmp.GetWidth()+10, bmp.GetHeight()+10))
        
        # create a generic bitmap button
        genBmapBtn = buttons.GenBitmapButton(panel, bitmap=bmp)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(button, 0, wx.ALL, 5)
        sizer.Add(gen_toggle_button, 0, wx.ALL, 5)
        sizer.Add(bmapBtn, 0, wx.ALL, 5)
        sizer.Add(genBmapBtn, 0, wx.ALL, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onGenericToggle(self, eventq):
        """"""
        print "Generic toggle button was pressed!"
        
    #----------------------------------------------------------------------
    def onToggle(self, event):
        """
        Print a message when toggled
        """
        print "Button toggled!"
        
     
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Этот код довольно похож на то, что мы уже видели. Новая информация о том, как получить на общих кнопках. Нам нужно сделать специальный импорт, как это: импортировать wx.lib.buttons. Теперь у нас есть доступ к кучу общих кнопок, включая нормальную кнопку, тумблер, растровое изображение, растровое изображение с текстовыми и плоскими кнопками. Есть даже пара тематических кнопок, которые выглядят почти как родные кнопки!

Давайте принять к сведению пару особенности идиосинкразией в коде выше. Во-первых, есть странный размер, который мы делаем с виджетом wx.bitmapbutton. Мы делаем это таким образом, чтобы убедиться, что вокруг растрового изображения есть какое-то «белое» пространство. Это облегчает скажу, что виджет – кнопка. Общая версия, кажется, делает это автоматически. Другая странная вещь, которая заключается в том, что когда вы переключите кнопку WX.ToGGleButton и храните указатель мыши над кнопкой, он не смотрит в систему. Если вы увидите кнопку, то она делает (я заметил это на Windows XP … это может не быть проблемой на других платформах).

По словам Робин Данн (Создатель WXPYPHON), серия WXPYPHON 2.9 будет иметь обновленное управление WX.Button, которое может отображать растровое изображение вместе с его текстом. Теперь это что-то, чтобы с нетерпением ждать!

Планшет

PlateButton – еще один универсальный виджет. Он был создан компанией Cody Precord, автор Editra Отказ Есть тонны примеров его кнопки в демонстрации WXPYPHON. Мы посмотрим на пару:

import wx
import wx.lib.platebtn as platebtn
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Plate Button Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)

##        btn = platebtn.PlateButton(panel, label="Test", style=platebtn.PB_STYLE_DEFAULT)
        btn = platebtn.PlateButton(panel, label="Gradient", style=platebtn.PB_STYLE_GRADIENT)
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

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

import wx
import wx.lib.platebtn as platebtn
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Plate Button Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        
        menu = wx.Menu()
        for url in ['http://wxpython.org', 'http://slashdot.org',
                    'http://editra.org', 'http://xkcd.com']:
            menu.Append(wx.NewId(), url, "Open %s in your browser" % url)
                        
        btn = platebtn.PlateButton(panel, label="Menu", size=None, style=platebtn.PB_STYLE_DEFAULT)
        btn.SetMenu(menu)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 5)
        panel.SetSizer(sizer)
 
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

Этот образец в основном убран пример от демонстрации WXPYPHON. Идея здесь состоит в том, чтобы создать меню, а затем использовать метод «SetMenu» PlateButton, чтобы прикрепить его к кнопке.

Обертывание

В этой статье мы узнали о следующих кнопках: wx.button, wx.togglebutton, wx.bitmapbutton, пару общих кнопок и панелью. Во втором тайме мы посмотрим на пару более основных кнопок виджета и кнопки Andrea Gavana! Увидимся в следующий раз!

Примечание. Примеры в этой статье были протестированы на Windows XP, WxPython 2.8.10.1/2.8.11.0 и Python 2.5