我有一个用wxPython编写的简单GUI,我想显示一个静态的“进度条”以表示我所连接设备的电池电量。我曾尝试使用wx.Gauge
,但不幸的是,它具有动画发光效果(至少在Win10中如此),如以下两个屏幕截图所示:
如您所见,没有太多的事情发生:
self.staticBar = wx.Gauge(self, range=10, size=(200,23), style=wx.GA_HORIZONTAL)
self.staticBar.SetValue(5)
我猜想该动画是Win10 UI的功能,但是有什么方法可以在wx中将其关闭吗?还是我应该使用其他课程?我曾尝试寻找多色的色带/横幅/等(很可能我只是不知道正确的术语是什么,这妨碍了我的搜索),而我能找到的最接近的东西是我一起砍掉的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
的大小。我可以在SetSize
上调用StaticText
,并且它不会引发错误,但是它也不执行任何操作(在文档中也未将其列为方法,因此可能未实现?)。
因此,基本上,wxPython中是否存在某种非动画的“进度条”?如果没有,如何将类似于进度条/电池电量指示器并且还可以更新/调整大小的东西拼凑在一起?
以下是一些选择:请注意,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()
除了萨克森州罗尔夫的非常好的回答,您还可以检查:
https://wxpython.org/Phoenix/docs/html/wx.lib.agw.pygauge.PyGauge.html