Static/non-animated wxPython 中的进度条

Static/non-animated progress bar in wxPython

我有一个用 wxPython 编写的简单 GUI,我想显示一个静态 "progress bar" 来表示我连接的设备的电池电量。我试过使用 wx.Gauge,但不幸的是它有一个动画发光(至少在 Win10 中),你可以在这两个屏幕截图中看到:

如您所见,没有太多进展:

self.staticBar = wx.Gauge(self, range=10, size=(200,23), style=wx.GA_HORIZONTAL)
self.staticBar.SetValue(5)

我猜这个动画是Win10的一个特性UI,但是在wx中有什么办法可以关闭它吗?或者我应该使用不同的 class 吗?我试过寻找多色 ribbons/banners/etc(可能我只是不知道正确的术语是什么,这妨碍了我的搜索),我能找到的最接近的东西是 StaticBox,我与 StaticText 一起破解得到这个:

(最小工作示例):

import wx

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        subpanel = wx.Panel(self)

        self.staticBar = wx.StaticBox(self, wx.ID_ANY, label="", size=(200,35))
        self.staticBarFill = wx.StaticText(self.staticBar, wx.ID_ANY, label="", size=(100,19))
        self.staticBarFill.SetBackgroundColour("green")

        subSizer = wx.BoxSizer(wx.VERTICAL)
        subSizer.Add(self.staticBarFill, 0, wx.TOP,11)
        subpanel.SetSizer(subSizer)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.staticBar, 0, wx.ALL, 5)
        sizer.Add(subpanel, 0, wx.LEFT,0)

        self.SetSizer(sizer)

class OuterFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, size=(300,200))
        self.Center() # center gui on screen

        MainPanel(self)

if __name__ == "__main__":
    app = wx.App()
    frame = OuterFrame().Show()
    app.MainLoop()

除了我似乎无法更改 StaticText 的大小外,我实际上还可以接受。我可以在 StaticText 上调用 SetSize 并且它不会抛出错误,但它也不会执行任何操作(它也没有在文档中列为方法,所以它可能不是实施了吗?)。

所以基本上,wxPython 中是否有某种非动画 "progress bar"?如果没有,我怎样才能拼凑出类似于进度 bar/battery 水平指示器并且也可以是 updated/resized?

的东西

这里有几个选项:
请注意 StaticBox 没有出现在我的显示外观 Theme 上,请记住这一点。我已经使用背景颜色来应对它。

import wx
import wx.lib.agw.pygauge as PG
from random import randrange

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=None)
        self.level = 100
        panel = wx.Panel(self)
        panel.SetBackgroundColour("gray")
        self.battery_level = wx.Slider(panel, -1, value=self.level, minValue=0, maxValue=100, size=(200, 50), style=wx.SL_LABELS)
        self.battery_level.Enable(False)

        self.staticBar = wx.StaticBox(panel, wx.ID_ANY, label="Battery life", size=(200,35))
        self.staticBarFill = wx.StaticText(self.staticBar, wx.ID_ANY, label="", size=(195,30))
        self.staticBar.SetBackgroundColour("lightgreen")
        self.staticBarFill.SetForegroundColour("darkgreen")
        self.staticBarFill.SetLabel("|"*self.level)

        self.gBar = wx.Gauge(panel, wx.ID_ANY, size=(200,35))
        self.gBar.SetValue(self.level)

        self.gText = wx.TextCtrl(panel, wx.ID_ANY, value="|"*self.level, size=(self.level*2,30))
        self.gText.SetBackgroundColour("lightgreen")
        self.gText.SetForegroundColour("darkgreen")

        self.pg = PG.PyGauge(panel, -1, size=(200, 35), style=wx.GA_HORIZONTAL)
        self.pg.SetValue(self.level)
        self.pg.SetDrawValue(draw=True, drawPercent=True, font=None, colour=wx.BLACK, formatString="Battery life")
        self.pg.SetBackgroundColour(wx.WHITE)
        self.pg.SetBorderColor(wx.BLACK)
        print(dir(self.pg))

        self.button = wx.Button(panel, -1, "Adjust")
        self.button.Bind(wx.EVT_BUTTON, self.OnAdjust)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.battery_level, 0, wx.ALL,10)
        sizer.Add(self.staticBar, 0, wx.ALL,10)
        sizer.Add(self.gBar, 0, wx.ALL,10)
        sizer.Add(self.gText, 0, wx.ALL,10)
        sizer.Add(self.pg, 0, wx.ALL,10)
        sizer.Add(self.button, 0, wx.ALL,10)
        panel.SetSizer(sizer)
        self.Show()

    def OnAdjust(self, event):
        self.level = randrange(1,100)
        self.battery_level.SetValue(self.level)
        self.staticBarFill.SetSize(self.level*2, 35)
        self.gBar.SetValue(self.level)
        self.gText.SetSize(self.level*2, 35)
        self.pg.SetValue(self.level)
        if self.level > 25:
            self.pg.SetBarColour("green")
        else:
            self.pg.SetBarColour("red")
        self.pg.SetDrawValue(draw=True, drawPercent=True, font=None, colour=wx.BLACK, formatString="Battery life "+str(self.level)+"%")
        self.Refresh()

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame(None)
    app.MainLoop()

除了Rolf of Saxony的精彩回答外,您还可以查看:

https://wxpython.org/Phoenix/docs/html/wx.lib.agw.pygauge.PyGauge.html