2017-05-20 6 views
0

우선 파이썬에 익숙하지 않으므로 코드에서 엉망이라고 판단 해주십시오 :). 순환 진행 표시 줄을 만들려고했지만 몇 가지 문제가 발생하여 원인을 찾을 수 없습니다. 문제는 입니다. setValue (100)이 모든 원을 채우는 경우 setRange (0, 100) 또는 setMmaximum (100)이 작동하지 않습니다. 그리고 두 번째 문제는 진행률 막대가 거꾸로 달리는 것입니다. 누군가 내가 뭘 잘못했는지 설명해 주실 수 있습니까? 내가 지금까지 무엇을 여기wxPython 커스텀 progressBar 문제

enter image description here

:

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) 

답변

1

당신이 가지고 있기 때문에 조금 소름 끼치는입니다 모든 것을 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 사이의 눈금이 필요하다고 말하면 가장 쉽게 이동할 수있는 방법은 게이지 계수기를 이동하는 데 1/270 (즉, 필요한 눈금)을 사용하지 않고 2.7로 증분/감소하는 것입니다. 90 점이 아닌 0 점에서 게이지를 시작하는 것이 더 쉬울 것이지만 나는 이것을 운동이나 미적 이유로 생각하고 있다고 가정합니다.
실행 : 원래의 질문과 다른 의견 만 240 개 단위, 충돌을 필요에 대한
귀하의 마지막 코멘트는 오히려 1 또는 2.7

편집이보다 1.125 (240분의 270)에 의해 게이지 카운터를 증가함으로써 달성 될 수있다 이 코드는 내 컴퓨터에서 "깜박임"을 얻지 못합니다. 그것은 당신의 기계의 속도까지 내려갈 수 있고 당신이 wx.Timer, 현재 100 밀리 초 또는 10 초에 전달하는 값을 변경하면 향상 될 수 있습니다. 본질적으로이 코드는 타이머를 사용하여 작업 진행 상황을 보여주는 것으로 가장하며, 실제로는 타이머를 기반으로하지 않고 계측기로 값을 전달하지만 실제 프로세스의 진행 상황을 보게됩니다.

+0

고맙지 만 여전히 거꾸로 돌아갑니다. 어떻게 해결할 수 있습니까? –

+0

나는 당신이 말하는 것을 모른다. 나침반/시계를 사용하여 코드는 남쪽 (6)에서 시작하여 시계 방향으로 서쪽 (9), 북쪽 (12) 및 끝에서 동쪽 (3)으로 이동합니다. 그건 "뒤로"소리가 나지 않아 –

+0

죄송합니다. 고맙습니다. –