Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython自定义进度条问题_Python_Python 2.7_Wxpython_Wxwidgets - Fatal编程技术网

wxPython自定义进度条问题

wxPython自定义进度条问题,python,python-2.7,wxpython,wxwidgets,Python,Python 2.7,Wxpython,Wxwidgets,首先,我是python新手,所以请不要因为代码混乱而对我评头论足:。我试图制作循环进度条,但遇到了一些问题,找不到原因。问题是,如果我将设置值100填满所有圆圈,则设置范围0、100或设置最大值100不起作用。第二个问题是我的进度条向后运行。有人能解释一下我做错了什么吗 以下是我迄今为止的情况: main.py文件 import wx from src.arc import TestArc class bandom(wx.Frame): def __init__(self, par

首先,我是python新手,所以请不要因为代码混乱而对我评头论足:。我试图制作循环进度条,但遇到了一些问题,找不到原因。问题是,如果我将设置值100填满所有圆圈,则设置范围0、100或设置最大值100不起作用。第二个问题是我的进度条向后运行。有人能解释一下我做错了什么吗

以下是我迄今为止的情况:

main.py文件

import wx
from src.arc import TestArc


class bandom(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(800, 600))

        self.gauge = TestArc(self)
        self.gauge.SetFocus()
        #self.gauge.setMinimun(0)
        #self.gauge.setMaximun(100)
        self.gauge.setRange(0, 100)
        self.gauge.setValue(10)

       # timer for testing progressbar
  #     self.timer = wx.Timer(self)
  #     self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
  #     self.timer.Start(100)

  #     self.val = 0

 # def OnTimer(self, evt):
 #     self.val += 1
 #     self.gauge.setValue(self.val)
 #
 #     if self.val >= 100:
 #         self.val = 0
 #     #print(self.val)


class MyApp(wx.App):
    def OnInit(self):
       frame = bandom(None, -1, 'Window title here')
       frame.Show(True)
       self.SetTopWindow(frame)
       return True

    def main():
       app = MyApp(0)
       app.MainLoop()

if __name__ == '__main__':
    main()
和arc.py文件

class TestArc(wx.Panel):

def __init__(self, *args, **kwargs):
    super(TestArc, self).__init__(*args, **kwargs)

    self.lineWidth = 0
    self.min = 0
    self.max = 100
    self._value = 0
    self.setText = '---'
    # self.font = someFont()
    self.position = wx.Rect()  # self.position.Set(x, y, width, height)
    self.startPoint = math.radians(0)
    self.endPoint = math.radians(0)

    self.Bind(wx.EVT_PAINT, self.OnPaint)

def setRange(self, min, max):
    self.min = min
    self.max = max

    if self.max < self.min:
        self.max, self.min = self.min, self.max

    if self._value < self.min:
        self._value = self.min
    elif self._value > self.max:
        self._value = self.max

    self.Refresh()

def setMinimun(self, min):
    self.setRange(min, self.max)

def setMaximun(self, max):
    self.setRange(self.min, max)

def setValue(self, val):
    if self._value != val:
        if val < self.min:
            self._value = self.min
        elif val > self.max:
            self._value = self.max
        else:
            self._value = val
        self.Refresh()


    self.Refresh()

def setLineWidth(self, lineWidth):
    self.lineWidth = lineWidth

def setPosition(self, x, y, width, height):
    self.position = wx.Rect(x, y, width, height)

def OnPaint(self, event=None):
    dc = wx.PaintDC(self)
    gc = self.MakeGC(dc)
    self.Draw(gc)

def MakeGC(self, dc):
    try:
        if False:
            gcr = wx.GraphicsRenderer.GetCairoRenderer
            gc = gcr() and gcr().CreateContext(dc)
            if gc is None:
                wx.MessageBox("Unable to create Cairo Context.", "Oops")
                gc = wx.GraphicsContext.Create(dc)
        else:
            gc = wx.GraphicsContext.Create(dc)

    except NotImplementedError:
        dc.DrawText("This build of wxPython does not support the wx.GraphicsContext "
                    "family of classes.",
                    25, 25)
        return None
    return gc

def Draw(self, gc):

    #middle progressbar line
    radStart = math.radians(90)
    radEnd = math.radians(0)
    path = gc.CreatePath()
    path.AddArc(80, 80, 50, radStart, radEnd, True)
    pen = wx.Pen('#000000', 4)
    pen.SetCap(wx.CAP_BUTT)
    gc.SetPen(pen)
    gc.SetBrush(wx.Brush('#000000', wx.TRANSPARENT))
    gc.DrawPath(path)

    #progress bar
    start = math.radians(90)
    #r = math.radians(270)
    arcStep = -270 / (self.max - self.min) * self._value
    end = math.radians(arcStep)
    path = gc.CreatePath()
    path.AddArc(80, 80, 50, start, end)
    pen = wx.Pen('#CC7F32', 15)
    pen.SetCap(wx.CAP_BUTT)
    gc.SetPen(pen)
    gc.SetBrush(wx.Brush('#000000', wx.TRANSPARENT))
    gc.DrawPath(path)

这有点可怕,因为你已经把所有的东西都偏移了90度,所以你必须对此做出解释。 这里什么都没有:

import wx
import math
class TestArc(wx.Panel):

    def __init__(self, *args, **kwargs):
        super(TestArc, self).__init__(*args, **kwargs)

        self.lineWidth = 0
        self.min = -90
        self.max = 360
        self._value = 0
        self.setText = '---'
        # self.font = someFont()
        self.position = wx.Rect()  # self.position.Set(x, y, width, height)
        self.startPoint = math.radians(0)
        self.endPoint = math.radians(0)
        self.Bind(wx.EVT_PAINT, self.OnPaint)

    def setRange(self, min, max):
        self.min = min
        self.max = max
        if self._value < self.min:
            self._value = self.min
        elif self._value > self.max:
            self._value = self.max
        self.Refresh()

    def setMinimun(self, min):
        self.setRange(min, self.max)

    def setMaximun(self, max):
        self.setRange(self.min, max)

    def setValue(self, val):
        if self._value != val:
            if val < self.min:
                self._value = self.min
            elif val > self.max:
                self._value = self.max
            else:
                self._value = val
        self.Refresh()

    def setLineWidth(self, lineWidth):
        self.lineWidth = lineWidth

    def setPosition(self, x, y, width, height):
        self.position = wx.Rect(x, y, width, height)

    def OnPaint(self, event=None):
        dc = wx.PaintDC(self)
        gc = self.MakeGC(dc)
        self.Draw(gc)

    def MakeGC(self, dc):
        try:
            if False:
                gcr = wx.GraphicsRenderer.GetCairoRenderer
                gc = gcr() and gcr().CreateContext(dc)
                if gc is None:
                    wx.MessageBox("Unable to create Cairo Context.", "Oops")
                    gc = wx.GraphicsContext.Create(dc)
            else:
                gc = wx.GraphicsContext.Create(dc)
        except NotImplementedError:
            dc.DrawText("This build of wxPython does not support the wx.GraphicsContext "
                        "family of classes.",
                        25, 25)
            return None
        return gc

    def Draw(self, gc):
        #middle progressbar line
        radStart = math.radians(90)
        radEnd = math.radians(0)
        path = gc.CreatePath()
        path.AddArc(80, 80, 50, radStart, radEnd, True)
        pen = wx.Pen('#000000', 4)
        pen.SetCap(wx.CAP_BUTT)
        gc.SetPen(pen)
        gc.SetBrush(wx.Brush('#000000', wx.TRANSPARENT))
        gc.DrawPath(path)

        #progress bar
        start = math.radians(90)
        #r = math.radians(270)
        arcStep = 270 / (self.max - self.min) * self._value
        end = math.radians(arcStep)
        path = gc.CreatePath()
        path.AddArc(80, 80, 50, start, end)
        pen = wx.Pen('#CC7F32', 15)
        pen.SetCap(wx.CAP_BUTT)
        gc.SetPen(pen)
        gc.SetBrush(wx.Brush('#000000', wx.TRANSPARENT))
        gc.DrawPath(path)

class bandom(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(800, 600))

        self.gauge = TestArc(self)
        self.gauge.SetFocus()
        self.gauge.setMinimun(90)
        self.gauge.setMaximun(360)
        self.gauge.setValue(90)

       # timer for testing progressbar
        self.val = 90
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(100)

    def OnTimer(self, evt):
       self.val += 2.7
       self.gauge.setValue(self.val)
       if self.val >= 360:
           self.val = 90

if __name__ == '__main__':
    app = wx.App()
    frame = bandom(None, -1, 'Window title here')
    frame.Show(True)
    app.MainLoop()
为了方便起见,我把它全部塞进了一个文件。 编辑: 将最大值更改为360并使用270计算圆弧中的步长的原因是,您已选择使用3/4圆作为仪表,并且正在使用弧度计算仪表的增量。你可以使用度数或弧度,但无论哪种方式,它的计算范围都是0到270度,弧度是0到3π/2。最初您说您需要一个介于0和100之间的刻度,最简单的安排方式是将仪表计数器增加/减少2.7,而不是1,即270点移动/100您所需的刻度。在0点而不是90点开始测量会更容易,但我假设您这样做是出于练习或美学原因。 您最后关于需要240个增量的评论与原始问题和其他评论相冲突,但可以通过将仪表计数器增加1.125 270/240而不是1或2.7来实现

编辑2:
在我的机器上运行此代码时,我不会闪烁。这可能取决于机器的速度,如果更改传递给wx.Timer的值(当前为100毫秒或每秒10次),可能会有所改善。请记住,此代码本质上假装使用计时器来显示任务的进度,实际上,您将根据实际过程的进度而不是计时器向仪表传递值。

谢谢,但仍然会倒退。您知道如何解决此问题吗?我不知道您指的是什么。使用指南针/时钟,我的代码从南6的底部开始,顺时针穿过西9,然后向北12,最后到达东3。我错了,这听起来不像是落后!非常感谢方向由arcStep的符号控制我将其设置为正270您将其设置为负。如果你把它改回来,你将不得不调整开始和结束的位置,我想!非常感谢。现在,我需要找到一种方法,使范围介于0和100之间: