【问题标题】:Static/non-animated progress bar in wxPythonwxPython中的静态/非动画进度条
【发布时间】:2020-06-08 21:32:14
【问题描述】:

我有一个用 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中有没有办法关闭它呢?还是我应该使用不同的课程?我试过寻找彩色丝带/横幅/等(可能我只是不知道正确的术语是什么,这妨碍了我的搜索),我能找到的最接近的东西是我一起破解的StaticBoxStaticText 得到这个:

(最小的工作示例):

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

【问题讨论】:

    标签: wxpython progress-bar


    【解决方案1】:

    除了 Rolf of Saxony 的非常好的回答,您还可以查看:

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

    【讨论】:

    • 这正是我想要的。似乎这个答案(也由 Rolf 提供)也很相关:stackoverflow.com/a/48006181
    • 接受我的道歉,事后包括我在 2017 年给出的解决方案,正如上面 asdf 所述。 ;) 投赞成票作为回报
    【解决方案2】:

    这里有几个选项:
    请注意,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()
    

    【讨论】:

    • 遗憾的是,这些选项不能很好地与 windows ui 配合使用。但是,它确实给了我一些不同的想法来尝试展示
    • @asdf 有趣的是,我忘记了自己之前的答案。我知道还有另一种选择,只是想不出。我添加它只是为了表格。
    • 我确实觉得这很有趣。看来你是这里的 wxPython MVP
    • @asdf 看来你忘了Mr Robin Dunn 和@VZ (Vadz)
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多