如何更改wxPython工具栏的外观和感觉?

6 投票
2 回答
3197 浏览
提问于 2025-04-16 10:03

wxPython的工具栏看起来和当前操作系统的风格不太一样——它有一个类似于Windows Vista/7菜单栏的渐变效果,也就是银色的渐变。

有没有办法改变这个,让它和操作系统的风格更协调呢?

注意:在创建工具栏时,有一个样式标志可以设置,其中一个标志是wx.TB_FLAT,但这似乎对工具栏的显示没有影响。

我是在Windows 7上运行我的wxPython程序。

编辑:下面是我看到的截图。

alt text

编辑:看起来工具栏是根据当前主题绘制的,切换到Windows经典主题后,工具栏变得平坦,与窗口背景相匹配。

下面的代码展示了我到目前为止尝试过的内容。我创建了一个叫做OnPaint的方法,并将其绑定到工具栏的绘制事件。但这没有效果,工具栏还是像上面的图片那样显示。

我知道OnPaint中的代码是有效的,因为如果我将这个方法绑定到窗口的绘制事件,而不是工具栏的绘制事件,矩形就会被正确绘制出来。

import wx

ID_STAT = 1
ID_TOOL = 2

class CheckMenuItem(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(350, 250))

        menubar = wx.MenuBar()
        file = wx.Menu()
        view = wx.Menu()
        self.shst = view.Append(ID_STAT, 'Show statubar', 'Show Statusbar', kind=wx.ITEM_CHECK)
        self.shtl = view.Append(ID_TOOL, 'Show toolbar', 'Show Toolbar', kind=wx.ITEM_CHECK)
        view.Check(ID_STAT, True)
        view.Check(ID_TOOL, True)

        self.Bind(wx.EVT_MENU, self.ToggleStatusBar, id=ID_STAT)
        self.Bind(wx.EVT_MENU, self.ToggleToolBar, id=ID_TOOL)

        menubar.Append(file, '&File')
        menubar.Append(view, '&View')
        self.SetMenuBar(menubar)

        self.toolbar = self.CreateToolBar()
        self.toolbar.Realize()

        self.statusbar = self.CreateStatusBar()

        self.Bind(wx.EVT_PAINT, self.OnPaint, self.toolbar)

        self.Centre()
        self.Show(True)

    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        dc.SetBrush(wx.Brush('#c56c00'))
        dc.DrawRectangle(10, 15, 90, 60)

    def ToggleStatusBar(self, event):
        if self.shst.IsChecked():
            self.statusbar.Show()
        else:
            self.statusbar.Hide()

    def ToggleToolBar(self, event):
        if self.shtl.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()

app = wx.App()
CheckMenuItem(None, -1, 'Toolbar Test')
app.MainLoop()

2 个回答

0

wxPython的演示程序表现得一样吗?我记得在我的Windows 7电脑上它看起来没问题。可能是清单文件没有安装好。

6

看起来我遇到的问题其实解决起来很简单。与其尝试一些复杂的绘图逻辑,其实只需要调用工具栏的 SetBackgroundColour() 方法就可以了。

如果想保持系统的外观和感觉,可以使用 wx.SystemSettings 类中的颜色。

self.toolbar.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_MENUBAR))

enter image description here

撰写回答