wxPython - 可以覆盖系统默认字体吗?
wxPython - Possible to overwrite System Default Font?
我正在为我的 GUI 使用 wxPython。在使用 "Segoe UI" 作为默认字体的 windows PC 上,一切看起来都不错。我的一位在中国工作的同事有不同的系统默认字体。我不知道它是怎么叫的,但它在我的 GUI 中弄乱了空间。
我试着修复了大部分,还有ListCtrls等使用中文字体。
所以我寻找一种方法来覆盖我的 wx 应用程序使用的默认字体,以防止我为每个小部件更改它。
我试过这样覆盖它:
self.SetFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,'Segoe UI'))
但这主要适用于面板,不适用于 ListCtrl。
我可以获得这样的默认字体:
import wx
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "", size=(600,300))
fnt = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
wx.SystemSettings.
print(fnt.GetFaceName())
app = wx.App()
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
但我无法以任何方式改变它。
更改面板的字体应该有效。您确定您的 listCtrl 是面板的子项吗?
定义字体:
self.font=wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, "Arial")
您可以为不同的场合设置不同的字体。例如,当你想让它变大或变粗等时。
然后您可以在您拥有的所有小部件上设置字体:
self.NameOfDatabase=wx.StaticText(self.somepanel,-1)
self.NameOfDatabase.SetLabel('Sometext')
self.NameOfDatabase.SetFont(self.font)
要更改 listctrl 小部件中的字体,您必须更改每个项目的字体。
SetItemFont(self, item, font)
https://wxpython.org/Phoenix/docs/html/wx.ListCtrl.html#wx.ListCtrl.SetItemFont
虽然可能不是最优的,但您可以单独设置 the/all ListCtrl
的字体,使用简单的 SetFont
.
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Font")
panel = wx.Panel(self, wx.ID_ANY)
font = wx.Font(18, wx.MODERN, wx.ITALIC, wx.NORMAL, faceName='Linux Libertine')
self.index = 0
self.text = "Timbuktoo"
self.list_ctrl = wx.ListCtrl(panel, size=(750,350),
style=wx.LC_REPORT
|wx.BORDER_SUNKEN
)
#panel.SetFont(font)
self.list_ctrl.SetFont(font)
self.list_ctrl.InsertColumn(0, 'Subject', width=100)
self.list_ctrl.InsertColumn(1, 'Due', width=150)
self.list_ctrl.InsertColumn(2, 'Location', width=300)
btn = wx.Button(panel, label="Add Line")
btn.Bind(wx.EVT_BUTTON, self.add_line)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
def add_line(self, event):
line = "Line %s" % self.index
self.list_ctrl.InsertItem(self.index, line)
self.list_ctrl.SetItem(self.index, 1, "22/05/2020")
self.list_ctrl.SetItem(self.index, 2, self.text)
self.index += 1
self.text = self.text+"1"
if __name__ == "__main__":
app = wx.App()
frame = MyForm()
frame.Show()
app.MainLoop()
我正在为我的 GUI 使用 wxPython。在使用 "Segoe UI" 作为默认字体的 windows PC 上,一切看起来都不错。我的一位在中国工作的同事有不同的系统默认字体。我不知道它是怎么叫的,但它在我的 GUI 中弄乱了空间。 我试着修复了大部分,还有ListCtrls等使用中文字体。
所以我寻找一种方法来覆盖我的 wx 应用程序使用的默认字体,以防止我为每个小部件更改它。
我试过这样覆盖它:
self.SetFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,'Segoe UI'))
但这主要适用于面板,不适用于 ListCtrl。
我可以获得这样的默认字体:
import wx
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "", size=(600,300))
fnt = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
wx.SystemSettings.
print(fnt.GetFaceName())
app = wx.App()
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
但我无法以任何方式改变它。
更改面板的字体应该有效。您确定您的 listCtrl 是面板的子项吗?
定义字体:
self.font=wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, "Arial")
您可以为不同的场合设置不同的字体。例如,当你想让它变大或变粗等时。
然后您可以在您拥有的所有小部件上设置字体:
self.NameOfDatabase=wx.StaticText(self.somepanel,-1)
self.NameOfDatabase.SetLabel('Sometext')
self.NameOfDatabase.SetFont(self.font)
要更改 listctrl 小部件中的字体,您必须更改每个项目的字体。
SetItemFont(self, item, font)
https://wxpython.org/Phoenix/docs/html/wx.ListCtrl.html#wx.ListCtrl.SetItemFont
虽然可能不是最优的,但您可以单独设置 the/all ListCtrl
的字体,使用简单的 SetFont
.
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Font")
panel = wx.Panel(self, wx.ID_ANY)
font = wx.Font(18, wx.MODERN, wx.ITALIC, wx.NORMAL, faceName='Linux Libertine')
self.index = 0
self.text = "Timbuktoo"
self.list_ctrl = wx.ListCtrl(panel, size=(750,350),
style=wx.LC_REPORT
|wx.BORDER_SUNKEN
)
#panel.SetFont(font)
self.list_ctrl.SetFont(font)
self.list_ctrl.InsertColumn(0, 'Subject', width=100)
self.list_ctrl.InsertColumn(1, 'Due', width=150)
self.list_ctrl.InsertColumn(2, 'Location', width=300)
btn = wx.Button(panel, label="Add Line")
btn.Bind(wx.EVT_BUTTON, self.add_line)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
def add_line(self, event):
line = "Line %s" % self.index
self.list_ctrl.InsertItem(self.index, line)
self.list_ctrl.SetItem(self.index, 1, "22/05/2020")
self.list_ctrl.SetItem(self.index, 2, self.text)
self.index += 1
self.text = self.text+"1"
if __name__ == "__main__":
app = wx.App()
frame = MyForm()
frame.Show()
app.MainLoop()