wxPython中的静态/非动画进度条

问题描述 投票:1回答:2

我有一个用wxPython编写的简单GUI,我想显示一个静态的“进度条”以表示我所连接设备的电池电量。我曾尝试使用wx.Gauge,但不幸的是,它具有动画发光效果(至少在Win10中如此),如以下两个屏幕截图所示:

enter image description here enter image description here

如您所见,没有太多的事情发生:

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

我猜想该动画是Win10 UI的功能,但是有什么方法可以在wx中将其关闭吗?还是我应该使用其他课程?我曾尝试寻找多色的色带/横幅/等(很可能我只是不知道正确的术语是什么,这妨碍了我的搜索),而我能找到的最接近的东西是我一起砍掉的StaticBoxStaticText可以得到这个:

enter image description here

(最小示例):

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中是否存在某种非动画的“进度条”?如果没有,如何将类似于进度条/电池电量指示器并且还可以更新/调整大小的东西拼凑在一起?

wxpython progress-bar
2个回答
1
投票

以下是一些选择:请注意,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()

enter image description here


1
投票

除了萨克森州罗尔夫的非常好的回答,您还可以检查:

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

© www.soinside.com 2019 - 2024. All rights reserved.