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

WxPython: учиться использовать шрифты

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

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

Вы когда-нибудь задумывались о том, как изменить свой шрифт в Wxpython? Ну, теперь ваш счастливый день, потому что это именно то, что этот учебник собирается покрыть. Мы рассмотрим следующие три предмета:

  • Встроенные шрифты Wxpython
  • Диалог шрифта
  • Демонстрационное демонстратор шрифта от демонстрации WXPYPHON

Шрифты являются важной частью вашей программы и расширяют читабельность вашей программы. Всегда хорошая идея, чтобы убедиться, что ваши шрифты являются правильным размером и местом. Да, это здравый смысл, но иногда здравый смысл не происходит в программировании. Достаточно философю. Давайте доберемся до мяса статьи!

Встроенные шрифты

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

import random
import wx
import wx.lib.scrolledpanel as scrolled

########################################################################
class MyForm(wx.Frame):
    
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Font Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        panel = scrolled.ScrolledPanel(self)
        panel.SetAutoLayout(1)
        panel.SetupScrolling()
        
        fontSizer = wx.BoxSizer(wx.VERTICAL)
        families = {"FONTFAMILY_DECORATIVE":wx.FONTFAMILY_DECORATIVE, # A decorative font
                    "FONTFAMILY_DEFAULT":wx.FONTFAMILY_DEFAULT,
                    "FONTFAMILY_MODERN":wx.FONTFAMILY_MODERN,     # Usually a fixed pitch font
                    "FONTFAMILY_ROMAN":wx.FONTFAMILY_ROMAN,      # A formal, serif font
                    "FONTFAMILY_SCRIPT":wx.FONTFAMILY_SCRIPT,     # A handwriting font
                    "FONTFAMILY_SWISS":wx.FONTFAMILY_SWISS,      # A sans-serif font
                    "FONTFAMILY_TELETYPE":wx.FONTFAMILY_TELETYPE    # A teletype font
                    }
        weights = {"FONTWEIGHT_BOLD":wx.FONTWEIGHT_BOLD,
                   "FONTWEIGHT_LIGHT":wx.FONTWEIGHT_LIGHT,
                   "FONTWEIGHT_NORMAL":wx.FONTWEIGHT_NORMAL
                   }
        
        styles = {"FONTSTYLE_ITALIC":wx.FONTSTYLE_ITALIC,
                  "FONTSTYLE_NORMAL":wx.FONTSTYLE_NORMAL,
                  "FONTSTYLE_SLANT":wx.FONTSTYLE_SLANT
                  }
        sizes = [8, 10, 12, 14]
        for family in families.keys():
            for weight in weights.keys():
                for style in styles.keys():
                    label = "%s    %s    %s" % (family, weight, style)
                    size = random.choice(sizes)
                    font = wx.Font(size, families[family], styles[style], 
                                   weights[weight])
                    txt = wx.StaticText(panel, label=label)
                    txt.SetFont(font)
                    fontSizer.Add(txt, 0, wx.ALL, 5)
        panel.SetSizer(fontSizer)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(panel, 1, wx.EXPAND)
        self.SetSizer(sizer)
        
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

Как вы можете увидите, WXPYPHON давайте применим wx.font Пример к вашему виджету с помощью виджета SetFont Метод, который применяет шрифт. Большинство объектов WX.FONT состоит из следующего: размер, семейство шрифтов (I.E. Swiss, Roman, Normal, Etc), стиль шрифта (I.E. ITalic или Normal), и вес шрифта (I.E. Bold или Normal). Вы можете смешивать и сопоставить эти три характеристики, чтобы получить то, что вы хотите большую часть времени. Если вы хотите использовать шрифт, который установлен в вашей системе, ну, мы доберемся до этого в следующем разделе. Следует отметить, что класс WX.FONT также принимает подчеркивание, лицо и кодирование аргументов, но мы не будем охватывать тех в этой статье. Проверьте документацию для получения дополнительной информации.

Давайте найдя немного и посмотрим на код, хотя. Вы заметите, что у нас есть три словари Python, которые мы будем использовать для управления внешним видом виджета Statictext. Эти словари удерживают наиболее распространенные семьи, веса и стили соответственно. Мы зацикливаемся на каждой семье, веса и стиле в тройной вложенную петлю и смешивайте и сопоставляем их, чтобы создать каждый тип стандартного шрифта WX, который можно сделать с этими наборами. Обратите внимание, что все, что мы делаем, это создать экземпляр WX.FONT, а затем применить его к Statictext с использованием последнего SetFont метод. Остальная часть кода должна быть довольно легко следовать. Довольно просто, нет?

Теперь мы узнаем о диалоге шрифта.

Диалог шрифта

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

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()

Этот код довольно прост, но давайте все равно, чтобы сломать его в любом случае. Мы больше всего заинтересованы в Updateui и Onslectfont Методы, но не бойтесь смотреть на остальные. Там аккуратная часть в __init__ Кроме того, где мы узнаем, как получить шрифт, который применяется к статистуюду и изменить его вес. Подсказка: ищите раздел, где определяется «SelfSS».

Во всяком случае, мы собираемся работать назад и начать в Onslectfont метод. Почему? Потому что это называет другой интересный метод! Во-первых, нам нужно создать wx.fontdata Объект, который будет иметь информацию, связанную с шрифтом, который выбираем в нашем диалоге шрифта позже. Затем мы устанавливаем текущий цвет объекта и шрифт в настройки текущего шрифта. Далее мы создаем wx.fontdialog экземпляр и показать диалог! Здесь мы вытаскиваем все необходимые нам данные шрифта, в этом случае, цвет и шрифт, а затем мы называем наш метод обновления.

В Updateui Метод, мы устанавливаем один из наших статических текстовых элементов управления выбранным шрифтом. Затем мы извлекаем различные биты информации из именно выбранного в настоящее время шрифта и отображение этой информации в соответствующих метках. Как видите, мы решили извлечь размер точки, семья, стиль, вес, лицо и родную информацию о шрифте. Теперь мы можем перейти к нашей последней демонстрации!

FonteneMerator.

Этот пример также взят из демонстрации WXPYPHON. Вот что нужно сказать о виджете wx.fontenumerator:

WXFontenumerator перечисляет все имеющиеся доступные шрифты в системе, либо только с заданными атрибутами – либо только фиксированной шириной (подходит для использования в таких программах, как эмуляторы терминалов и тому подобное), либо шрифты, доступные в данной кодировке.

На моем компьютере Windows XP, кажется, все доступные шрифты в системе. Вот код для вашего прочтения:

# fontEnumDemo.py

import wx

########################################################################
class TestPanel(wx.Panel):
    
    #----------------------------------------------------------------------
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        e = wx.FontEnumerator()
        e.EnumerateFacenames()
        elist= e.GetFacenames()

        elist.sort()

        s1 = wx.StaticText(self, -1, "Face names:")

        self.lb1 = wx.ListBox(self, -1, wx.DefaultPosition, (200, 250),
                             elist, wx.LB_SINGLE)

        self.Bind(wx.EVT_LISTBOX, self.OnSelect, id=self.lb1.GetId())

        self.txt = wx.StaticText(self, -1, "Sample text...", (285, 50))

        row = wx.BoxSizer(wx.HORIZONTAL)
        row.Add(s1, 0, wx.ALL, 5)
        row.Add(self.lb1, 0, wx.ALL, 5)
        row.Add(self.txt, 0, wx.ALL|wx.ADJUST_MINSIZE, 5)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(row, 0, wx.ALL, 30)
        self.SetSizer(sizer)
        self.Layout()

        self.lb1.SetSelection(0)
        self.OnSelect(None)
        wx.FutureCall(300, self.SetTextSize)

    #----------------------------------------------------------------------
    def SetTextSize(self):
        self.txt.SetSize(self.txt.GetBestSize())

    #----------------------------------------------------------------------
    def OnSelect(self, evt):
        face = self.lb1.GetStringSelection()
        font = wx.Font(28, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, face)
        self.txt.SetLabel(face)
        self.txt.SetFont(font)
        if wx.Platform == "__WXMAC__": self.Refresh()
        
########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None,
                          title="wx.FontEnumerator Tutorial",
                          size=(800,600))
        panel = TestPanel(self)
        
        
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Хорошо, этот код тоже легко. Что здесь происходит, вы спрашиваете? Ну, мы имеем дело с Python, вот что! Python просто скалы! Давайте сломаем этот код вниз и посмотрим, что происходит. Похоже, все, что нам нужно сделать, это создать экземпляр wx.fontenumerator. Обратите внимание, что он не принимает никаких аргументов … по крайней мере, он не в демо, и документация не упоминается либо. Далее мы перечисляем имена лиц шрифта. Наконец, мы создаем список имени лица, сортируйте их и поставьте список в wx.listbox Отказ

ПРИМЕЧАНИЕ. В оригинальном демонстрационном режиме «Список» использовал «Список» в качестве имени переменной для следующей строки, но поскольку это ключевое слово в Python (и очень плохое форма в целом), код в этом примере заменил «список» с помощью » Эласт “.

Следующий интересный кусок кода происходит в Onselect Способ, который уволен всякий раз, когда пользователь выбирает элемент в поле списка. Как вы уже догадались, мы снимаем имя лица из списка и используем его для создания шрифта, который затем применяется к статическому текстовому виджету. Это позволяет нам увидеть, как выглядит шрифт.

Обертывание

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

Дальнейшее чтение

Исходный код

  • fonts.zip
  • fonts.tar.tar.tar.