Задумывались ли вы о том, как изменить свой шрифт в wxPython? Что ж, теперь ваш счастливый день, потому что это именно то, что будет рассказано в этом руководстве. Мы рассмотрим следующие три пункта:
- Встроенные шрифты wxPython
- Диалог шрифта
- Демо перечислитель шрифтов из демоверсии wxPython
Шрифты являются важной частью вашей программы и улучшают читабельность вашей программы. Это всегда хорошая идея, чтобы убедиться, что ваши шрифты имеют правильный размер и место. Да, это здравый смысл, но иногда здравого смысла не бывает в программировании. Хватит философствовать. Давайте перейдем к мясу статьи!
Встроенные шрифты
Возможно, вы этого еще не поняли, но 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()
Как вы можете видеть, wxPython позволяет вам применить экземпляр wx.Font к вашему виджету, используя метод SetFont виджета , который применяет шрифт. Большинство объектов wx.Font состоят из следующих элементов: размер, семейство шрифтов (т. Е. Швейцарский, римский, нормальный и т. Д.), Стиль шрифта (т. Е. Курсив или обычный) и вес шрифта (т. Е. Жирный или обычный). Вы можете смешивать и сочетать эти три характеристики, чтобы получить то, что вы хотите большую часть времени. Если вы хотите использовать шрифт, установленный в вашей системе, мы вернемся к этому в следующем разделе. Следует отметить, что класс wx.Font также принимает аргументы подчеркивания, лица и кодирования, но мы не будем рассматривать их в этой статье. Проверьте документацию для получения дополнительной информации.
Давайте на минутку посмотрим на код. Вы заметите, что у нас есть три словаря Python, которые мы будем использовать для управления внешним видом виджета StaticText. Эти словари содержат наиболее распространенные семейства, веса и стили соответственно. Мы перебираем каждое семейство, вес и стиль в тройном вложенном цикле, смешиваем и сопоставляем их, чтобы создать любой тип стандартного шрифта, который wx может использовать с этими наборами. Обратите внимание, что все, что мы делаем, это создаем экземпляр wx.Font и затем применяем его к StaticText, используя последний метод SetFont . Остальной код должен быть довольно простым для понимания. Довольно просто, нет?
Теперь мы собираемся узнать о диалоге шрифта.
Диалог шрифтов
В этом примере мы будем использовать демонстрационный код wxPython в отдельном скрипте. По сути, он показывает вам, как выбрать шрифт, извлечь различные фрагменты информации из выбора и применить настройки к выбранному вами виджету. Вот код:
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 и
OnSelectFont , но не бойтесь смотреть на все остальное. В __init__ есть и полезная часть
, где мы узнаем, как получить шрифт, примененный к StaticText, и изменить его вес. Подсказка: найдите раздел, в котором определен «self.ps».
В любом случае, мы собираемся работать в обратном направлении и начать с метода OnSelectFont . Зачем? Потому что это вызывает другой интересный метод! Прежде всего, нам нужно создать объект wx.FontData, который будет содержать информацию, относящуюся к шрифту, который мы выберем в нашем диалоге шрифтов позже. Затем мы устанавливаем текущий цвет и шрифт объекта в соответствии с настройками текущего шрифта. Затем мы создаем экземпляр wx.FontDialog и показываем диалог! Здесь мы извлекаем все данные шрифта, которые нам нужны, в данном случае, цвет и шрифт, а затем вызываем наш метод обновления.
В методе UpdateUI мы устанавливаем один из наших статических текстовых элементов управления на выбранный шрифт. Затем мы извлекаем различную информацию из выбранного в данный момент шрифта и отображаем эту информацию в соответствующих ярлыках. Как вы можете видеть, мы решили извлечь размер точки, семейство, стиль, вес, лицо и информацию о шрифте. Теперь мы можем перейти к нашей последней демонстрации!
FontEnumerator
Этот пример также взят из демонстрации wxPython. Вот что он говорит о виджете 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, вот что! Питон просто качается! Давайте разберем этот код и посмотрим, что происходит. Похоже, все, что нам нужно сделать, это создать экземпляр wx.FontEnumerator. Обратите внимание, что он не принимает никаких аргументов … по крайней мере, это не так, как в демоверсии, и в документации тоже не упоминается. Далее перечисляем имена шрифтов. Наконец, мы создаем список имен лиц, сортируем их и помещаем список в wx.ListBox .
Примечание: в оригинальной демонстрации автор использовал «список» в качестве имени переменной для следующей строки, но, поскольку это ключевое слово в Python (и в целом очень плохая форма), код в этом примере заменил «список» на « псписок».
Следующий интересный фрагмент кода происходит в методе OnSelect , который запускается всякий раз, когда пользователь выбирает элемент в списке. Как вы уже догадались, мы берем имя лица из ListBox и используем его для создания шрифта, который затем применяется к статическому текстовому виджету. Это позволяет нам увидеть, как выглядит шрифт.
Завершение
Теперь вы должны знать, как использовать стандартные шрифты wxPython, а также те, которые загружены на ваш компьютер. Теперь вы знаете, как извлечь много информации о конкретном шрифте, что может пригодиться при устранении неполадок, почему шрифт работает не так, как вы ожидаете. Помните, что вы можете применять эти шрифты не только к виджету StaticText. Фактически, большинство виджетов имеют метод SetFont, так что вы можете применить настройки шрифта к большей части вашего пользовательского интерфейса.
Дальнейшее чтение
- документация wx.FontDialog
- Документация по wx.FontEnumerator
- Диалоги wxPython
Исходный код
Источник: http://www.blog.pythonlibrary.org/2011/04/28/wxpython-learning-to-use-fonts/


