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

Диалоги Wxpython (часть 1 из 2)

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

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

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

  • wx.busyinfo.
  • wx.colourdialog.
  • Диалог Cube Color (Age)
  • wx.dirdialog и multidirdialog (AGW)
  • wx.filedialog.
  • wx.fontdialog.
  • wx.messagedialog.

Это много диалогов, но все еще восемь в демонстрации WXPYPHON. Мы посмотрим на те в следующий раз. На данный момент давайте посмотрим на этот список!

wx.busyinfo – позволить пользователю знать, что вы заняты

Диалог insianfo не известен. По какой-то причине он даже не имеет демонстрации в демонстрационной заявке WXPYPHON. Так что для вашего удовольствия просмотра мы создадим один сейчас.

import time
import wx

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "BusyDialog Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        
        busyBtn = wx.Button(panel, label="Show Busy Dialog")
        busyBtn.Bind(wx.EVT_BUTTON, self.onBusy)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(busyBtn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onBusy(self, event):
        self.Hide()
        msg = "Please wait while we process your request..."
        busyDlg = wx.BusyInfo(msg)
        time.sleep(5)
        busyDlg = None
        self.Show()
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

К счастью, Busyinfo Диалог также является одним из самых простых диалогов для создания. Все, что вам нужно сделать, это создать его со строкой. Вместо того, чтобы уничтожить его, общий метод закрытия этого диалога – просто установить экземпляр None. Это самый странный, но это работает просто хорошо. Вы также можете уничтожить его, если это нужно, но мне никогда не нужно было не видеть пример того, что кто-либо другой делает это.

Выбирая цвета с wx.colourdialog и cubecolourdialog

Вы получаете два диалога Color Chooser с вашим распределением WXPYPHON. Первый, на котором мы посмотрим, это родной диалог, WX.Colourdialog. Вот скриншот того, что wx.colourdialog Похоже на Windows XP:

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

import wx
import wx.lib.agw.cubecolourdialog as CCD

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "File and Folder Dialogs Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        self.colourData = None
        
        colorDlgBtn = wx.Button(panel, label="Open ColorDialog")
        colorDlgBtn.Bind(wx.EVT_BUTTON, self.onColorDlg)
        colorCubeBtn = wx.Button(panel, label="Open ColorCubeDialog")
        colorCubeBtn.Bind(wx.EVT_BUTTON, self.onCubeColorDialog)
        
        # put the buttons in a sizer
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(colorDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(colorCubeBtn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onColorDlg(self, event):
        """
        This is mostly from the wxPython Demo!
        """
        dlg = wx.ColourDialog(self)
        
        # Ensure the full colour dialog is displayed, 
        # not the abbreviated version.
        dlg.GetColourData().SetChooseFull(True)

        if dlg.ShowModal() == wx.ID_OK:
            data = dlg.GetColourData()
            print 'You selected: %s\n' % str(data.GetColour().Get())
            
        dlg.Destroy()
        
    #----------------------------------------------------------------------
    def onCubeColorDialog(self, event):
        """
        This is mostly from the wxPython Demo!
        """
        self.colourData.SetColour(self.GetBackgroundColour())
        
        dlg = CCD.CubeColourDialog(self, self.colourData)
        
        if dlg.ShowModal() == wx.ID_OK:

            # If the user selected OK, then the dialog's wx.ColourData will
            # contain valid information. Fetch the data ...
            self.colourData = dlg.GetColourData()
            h, s, v, a = dlg.GetHSVAColour()

            # ... then do something with it. The actual colour data will be
            # returned as a three-tuple (r, g, b) in this particular case.
            colour = self.colourData.GetColour()
            self.SetBackgroundColour(self.colourData.GetColour())
            self.Refresh()
            
        dlg.Destroy()
        
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Как видите, WX.COLOURDialog очень легко создать (см. Метод oncolordlg ). Все, что вам нужно сделать, это позвонить в диалог. Demo Pwython Demo также включал в себя строку, которая показала, как отобразить полноцветную версию диалога, поэтому мы включили эту строку (и комментарии) в этом примере: dlg.getcolourdata (). SetChoofull (true). Наконец, мы называем диалоговое окно ShowModal Способ показать диалог. Чтобы получить выбор цвета пользователя, мы следуем двухэтапном процессе. Сначала мы возьмем все цветные данные, используя data.getcolourdata () Отказ Затем, чтобы получить определенный цвет, мы называем наш объект данных GetClour (). Get () методы.

Теперь давайте посмотрим, что Cubecolourdialog Похоже на Windows XP:

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

Cubecolourdialog написан в чистом питоне, а не виджет C ++, который был завернут Swig Отказ Это облегчает редактирование Cubecolourdialog для редактирования и улучшения. Давайте посмотрим на код из метода oncubeColordialog, который мы использовали выше:

def onCubeColorDialog(self, event):
    """
    This is mostly from the wxPython Demo!
    """
    
    self.colourData.SetColour(self.GetBackgroundColour())
    
    dlg = CCD.CubeColourDialog(self, self.colourData)
    
    if dlg.ShowModal() == wx.ID_OK:

        # If the user selected OK, then the dialog's wx.ColourData will
        # contain valid information. Fetch the data ...
        self.colourData = dlg.GetColourData()
        h, s, v, a = dlg.GetHSVAColour()

        # ... then do something with it. The actual colour data will be
        # returned as a three-tuple (r, g, b) in this particular case.
        colour = self.colourData.GetColour()
        self.SetBackgroundColour(self.colourData.GetColour())
        self.Refresh()
        
    dlg.Destroy()

Во-первых, мы устанавливаем переменную Colourdata на цвет фона родительского виджета. Я не совсем уверен, почему мы это делаем, но я предполагаю, что это потому, что мы хотим, чтобы диалог соответствовал цвету родителей. Далее создайте экземпляр диалога и показать его. Если пользователь нажимает кнопку ОК, мы получаем цвет, который они выбрали. Обратите внимание, что мы можем получить оттенок, насыщенность, яркость, альфа-компоненты цвета, выбранные, вызова диалогового окна Gethsvacolour метод. Мы на самом деле не используем эту информацию в этом примере, но это может быть удобно в вашем приложении. Чтобы на самом деле получить выбранный цвет, мы просто используем метод Imptly названного GetClour () из нашего обновленного экземпляра Colourdata. Наконец, мы устанавливаем фон нашего приложения на вновь выбранный цвет. Аккуратный, а?

Также есть еще один чистый выбор цвета Python, называемый Pycolourchooser Отказ Однако это не автономный диалог, поэтому мы не будем прикрывать его здесь.

Открывающие файлы и папки с wx.filedialog, wx.dirdialog и multidirdialog (AGW)

Открывающие файлы и папки с wxpython это ветер! Он включает в себя обертки для нативных диалогов, а также включает в себя реализацию чистого Python для выбора нескольких папок (I.E. каталоги) одновременно. Давайте сначала посмотрим на код образца, а затем мы перейдем к конкретным для каждого диалога.

import os
import wx
import wx.lib.agw.multidirdialog as MDD

wildcard = "Python source (*.py)|*.py|" \
            "All files (*.*)|*.*"

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "File and Folder Dialogs Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        self.currentDirectory = os.getcwd()
        
        # create the buttons and bindings
        openFileDlgBtn = wx.Button(panel, label="Show OPEN FileDialog")
        openFileDlgBtn.Bind(wx.EVT_BUTTON, self.onOpenFile)
        
        saveFileDlgBtn = wx.Button(panel, label="Show SAVE FileDialog")
        saveFileDlgBtn.Bind(wx.EVT_BUTTON, self.onSaveFile)
        
        dirDlgBtn = wx.Button(panel, label="Show DirDialog")
        dirDlgBtn.Bind(wx.EVT_BUTTON, self.onDir)
        
        multiDirDlgBtn = wx.Button(panel, label="Show MultiDirDialog")
        multiDirDlgBtn.Bind(wx.EVT_BUTTON, self.onMultiDir)
        
        # put the buttons in a sizer
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(openFileDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(saveFileDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(dirDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(multiDirDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onDir(self, event):
        """
        Show the DirDialog and print the user's choice to stdout
        """
        dlg = wx.DirDialog(self, "Choose a directory:",
                           style=wx.DD_DEFAULT_STYLE
                           #| wx.DD_DIR_MUST_EXIST
                           #| wx.DD_CHANGE_DIR
                           )
        if dlg.ShowModal() == wx.ID_OK:
            print "You chose %s" % dlg.GetPath()
        dlg.Destroy()
    
    #----------------------------------------------------------------------
    def onMultiDir(self, event):
        """
        Create and show the MultiDirDialog
        """
        dlg = MDD.MultiDirDialog(self, title="Choose a directory:",
                                 defaultPath=self.currentDirectory,
                                 agwStyle=0)
        if dlg.ShowModal() == wx.ID_OK:
            paths = dlg.GetPaths()
            print "You chose the following file(s):"
            for path in paths:
                print path
        dlg.Destroy()
        
    #----------------------------------------------------------------------
    def onOpenFile(self, event):
        """
        Create and show the Open FileDialog
        """
        dlg = wx.FileDialog(
            self, message="Choose a file",
            defaultDir=self.currentDirectory, 
            defaultFile="",
            wildcard=wildcard,
            style=wx.FD_OPEN | wx.FD_MULTIPLE | wx.FD_CHANGE_DIR
            )
        if dlg.ShowModal() == wx.ID_OK:
            paths = dlg.GetPaths()
            print "You chose the following file(s):"
            for path in paths:
                print path
        dlg.Destroy()
        
    #----------------------------------------------------------------------
    def onSaveFile(self, event):
        """
        Create and show the Save FileDialog
        """
        dlg = wx.FileDialog(
            self, message="Save file as ...", 
            defaultDir=self.currentDirectory, 
            defaultFile="", wildcard=wildcard, style=wx.FD_SAVE
            )
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            print "You chose the following filename: %s" % path
        dlg.Destroy()
        
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Диалоги открытия и сохранения файлов

wx.filedialog Имеет две версии: открытый и версию сохранения файла. Открытая версия выше, а версия сохранения ниже:

Давайте посмотрим на код для каждого из них:

def onOpenFile(self, event):
    """
    Create and show the Open FileDialog
    """
    dlg = wx.FileDialog(
        self, message="Choose a file",
        defaultDir=self.currentDirectory, 
        defaultFile="",
        wildcard=wildcard,
        style=wx.FD_OPEN | wx.FD_MULTIPLE | wx.FD_CHANGE_DIR
        )
    if dlg.ShowModal() == wx.ID_OK:
        paths = dlg.GetPaths()
        print "You chose the following file(s):"
        for path in paths:
            print path
    dlg.Destroy()

#----------------------------------------------------------------------
def onSaveFile(self, event):
    """
    Create and show the Save FileDialog
    """
    dlg = wx.FileDialog(
        self, message="Save file as ...", 
        defaultDir=self.currentDirectory, 
        defaultFile="", wildcard=wildcard, style=wx.FD_SAVE
        )
    if dlg.ShowModal() == wx.ID_OK:
        path = dlg.GetPath()
        print "You chose the following filename: %s" % path
    dlg.Destroy()

Onopenfile Метод показывает, как создать открытую версию. Вы можете установить заголовок диалогового окна, какой каталог откроется диалоговое окно, какие файлы он покажет, выбран файл по умолчанию, независимо от того, можете ли вы выбрать несколько файлов (флаг WX.Multiple), а также могут ли вы изменить каталоги ( через флаг Change_dir). В этом примере мы используем метод GetPaths диалогов для захвата одного или нескольких путей, выбранных нашим пользователем, а затем мы распечатаем эти выборы для STDOUT.

Версия сохранения диалога почти такая же. Единственное отличие состоит в том, что мы изменили стиль в WX.Save.

wx.dirdialog.

Дирдиалог Еще проще интунтировать, чем диалоги файла! Вот простой код:

#----------------------------------------------------------------------
def onDir(self, event):
    """
    Show the DirDialog and print the user's choice to stdout
    """
    dlg = wx.DirDialog(self, "Choose a directory:",
                       style=wx.DD_DEFAULT_STYLE
                       #| wx.DD_DIR_MUST_EXIST
                       #| wx.DD_CHANGE_DIR
                       )
    if dlg.ShowModal() == wx.ID_OK:
        print "You chose %s" % dlg.GetPath()
    dlg.Destroy()

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

Multi Dirdialog (возраст)

Multidirdialog от Библиотека AGW это чистая реализация Python WX.Dirdialog, но с большим количеством особенностей. Это позволяет пользователю выбрать несколько каталогов одновременно. Вот простой пример того, как его использовать:

def onMultiDir(self, event):
    """
    Create and show the MultiDirDialog
    """
    dlg = MDD.MultiDirDialog(self, title="Choose a directory:",
                             defaultPath=self.currentDirectory,
                             agwStyle=0)
    if dlg.ShowModal() == wx.ID_OK:
        paths = dlg.GetPaths()
        print "You chose the following file(s):"
        for path in paths:
            print path
    dlg.Destroy()

Хотя этот код не показывает его, вы также можете установить, хотите ли вы позволить пользователю создавать новый каталог. Кроме того, и специальный флаг Agwstyle, в этом диалоговом окне не сильно отличается. Тем не менее, это удобно иметь, так как он написан в Python, и вы можете улучшить его намного проще, чем вы можете версию WX.Dirdialog.

wx.fontdialog.

Fontdialog Дает пользователю возможность выбрать шрифт. Для этого примера мы будем использовать слегка модифицированную версию кода из самого WXPYPHON DEMO:

import wx
from wx.lib import stattext

#---------------------------------------------------------------------------

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        
        btn = wx.Button(self, -1, "Select Font")
        self.Bind(wx.EVT_BUTTON, self.OnSelectFont, btn)

        self.sampleText = stattext.GenStaticText(self, -1, "Sample Text")
        self.sampleText.SetBackgroundColour(wx.WHITE)

        self.curFont = self.sampleText.GetFont()
        self.curClr = wx.BLACK

        fgs = wx.FlexGridSizer(cols=2, vgap=5, hgap=5)
        fgs.AddGrowableCol(1)
        fgs.AddGrowableRow(0)

        fgs.Add(btn)
        fgs.Add(self.sampleText, 0, wx.ADJUST_MINSIZE|wx.GROW)

        fgs.Add((15,15)); fgs.Add((15,15))   # an empty row

        fgs.Add(wx.StaticText(self, -1, "PointSize:"))
        self.ps = wx.StaticText(self, -1, "")
        font = self.ps.GetFont()
        font.SetWeight(wx.BOLD)
        self.ps.SetFont(font)
        fgs.Add(self.ps, 0, wx.ADJUST_MINSIZE)

        fgs.Add(wx.StaticText(self, -1, "Family:"))
        self.family = wx.StaticText(self, -1, "")
        self.family.SetFont(font)
        fgs.Add(self.family, 0, wx.ADJUST_MINSIZE)

        fgs.Add(wx.StaticText(self, -1, "Style:"))
        self.style = wx.StaticText(self, -1, "")
        self.style.SetFont(font)
        fgs.Add(self.style, 0, wx.ADJUST_MINSIZE)

        fgs.Add(wx.StaticText(self, -1, "Weight:"))
        self.weight = wx.StaticText(self, -1, "")
        self.weight.SetFont(font)
        fgs.Add(self.weight, 0, wx.ADJUST_MINSIZE)

        fgs.Add(wx.StaticText(self, -1, "Face:"))
        self.face = wx.StaticText(self, -1, "")
        self.face.SetFont(font)
        fgs.Add(self.face, 0, wx.ADJUST_MINSIZE)

        fgs.Add((15,15)); fgs.Add((15,15))   # an empty row

        fgs.Add(wx.StaticText(self, -1, "wx.NativeFontInfo:"))
        self.nfi = wx.StaticText(self, -1, "")
        self.nfi.SetFont(font)
        fgs.Add(self.nfi, 0, wx.ADJUST_MINSIZE)

        # give it some border space
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(fgs, 0, wx.GROW|wx.ADJUST_MINSIZE|wx.ALL, 25)

        self.SetSizer(sizer)
        self.UpdateUI()


    def UpdateUI(self):
        self.sampleText.SetFont(self.curFont)
        self.sampleText.SetForegroundColour(self.curClr)
        self.ps.SetLabel(str(self.curFont.GetPointSize()))
        self.family.SetLabel(self.curFont.GetFamilyString())
        self.style.SetLabel(self.curFont.GetStyleString())
        self.weight.SetLabel(self.curFont.GetWeightString())
        self.face.SetLabel(self.curFont.GetFaceName())
        self.nfi.SetLabel(self.curFont.GetNativeFontInfo().ToString())
        self.Layout()


    def OnSelectFont(self, evt):
        data = wx.FontData()
        data.EnableEffects(True)
        data.SetColour(self.curClr)         # set colour
        data.SetInitialFont(self.curFont)

        dlg = wx.FontDialog(self, data)
        
        if dlg.ShowModal() == wx.ID_OK:
            data = dlg.GetFontData()
            font = data.GetChosenFont()
            colour = data.GetColour()

            self.curFont = font
            self.curClr = colour
            self.UpdateUI()

        # Don't destroy the dialog until you get everything you need from the
        # dialog!
        dlg.Destroy()


########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "wx.FontDialog Tutorial")
        panel = TestPanel(self)
        
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

В этом примере мы создаем и показать диалог в Onslectfont метод. По причинам, по которым я не полностью понимаю, мы создаем объект данных шрифта прямо с BAT и установите для него различные атрибуты. Затем, если пользователь выбирает шрифт и ударяет кнопку OK, мы выбросите эти настройки и создаем новые на основе выбора пользователя. Извлекаем шрифт и цветные данные из выбранного пользователем шрифта и установите атрибуты классов. Далее мы называем Updateui метод. Это обновит наш GenStatictext, чтобы показать выбранный шрифт. Не стесняйтесь смотреть на то, что это достигнуто в Updateui метод.

wx.messagedialog.

wx.messagedialog используется, чтобы дать пользователю какое-то сообщение или задать простой вопрос. Вот несколько примеров скриншотов:

Теперь давайте посмотрим на то, как мы можем создать эти диалоги!

# http://www.wxpython.org/docs/api/wx.MessageDialog-class.html

import wx

########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "MessageDialog Tutorial")
        self.panel = wx.Panel(self, wx.ID_ANY)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        buttons = [("Exclamation", self.onExclamation),
                   ("Information", self.onInfo),
                   ("Question", self.onQuestion)
                   ]
        for label, handler in buttons:
            self.createAndLayoutButtons(label, handler, sizer)
        self.panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def createAndLayoutButtons(self, label, handler, sizer):
        """"""
        button = wx.Button(self.panel, label=label)
        button.Bind(wx.EVT_BUTTON, handler)
        sizer.Add(button, 0, wx.ALL|wx.CENTER, 5)
        
    #----------------------------------------------------------------------
    def onExclamation(self, event):
        """"""
        msg = "You have an encountered an unknown error. Would you like to continue?"
        self.showMessageDlg(msg, "ERROR",
                            wx.YES_NO|wx.YES_DEFAULT|wx.ICON_EXCLAMATION)
    
    #----------------------------------------------------------------------
    def onInfo(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        self.showMessageDlg("This is for informational purposes only!",
                            "Information", wx.OK|wx.ICON_INFORMATION)
        
    #----------------------------------------------------------------------
    def onQuestion(self, event):
        """"""
        self.showMessageDlg("Why did you push me?", "Question",
                            wx.OK|wx.CANCEL|wx.ICON_QUESTION)
    
    #----------------------------------------------------------------------
    def showMessageDlg(self, msg, title, style):
        """"""
        dlg = wx.MessageDialog(parent=None, message=msg, 
                               caption=title, style=style)
        dlg.ShowModal()
        dlg.Destroy()
 
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

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

  • wx.yes_no дает диалог a Да и нет кнопки
  • wx.ok дает нам просто кнопку ОК
  • wx.ok | wx.cancel создает как кнопку OK, так и кнопку отмены
  • wx.icon_exclamation ставит желтый значок треугольника в нашем диалоге
  • wx.icon_information создает круглый синий значок
  • wx.icon_question дает нам значок вопросительного знака

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

Обертывание

Мы покрывали много земли в этой статье. Теперь вы знаете, как создать около половины предоставленных стандартных диалогов, которые включены в Wxpython. Мы посмотрим на другую половину во второй части этой статьи. Тем временем я надеюсь, что вы нашли это просвещение. Не стесняйтесь задавать вопросы в комментариях!

Примечание. Этот код был протестирован на следующем:

  • Windows XP Professional, WxPython 2.8.10.1/2.8.11.0, Python 2.5
  • Windows 7 Home Edition, WxPython 2.8.10.1, Python 2.6

Если вы хотите увидеть вторую часть этой статьи, нажмите здесь

Дополнительное чтение

Загрузки

  • dialogs_part_one.zip
  • dialogs_part_one.tar.