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