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
我有一个用 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