2016-12-16 1 views
1

호 그리기 및 문제는 다른 py 파일 및 지금까지 아무런 기능이없는 양식을 그릴 수 있습니다. (주 py 파일의 그리기 기능이 괜찮 으면). 다른 py 파일을 가져 왔지만 아무 것도 발생하지 않습니다. main.pypyqt4 다른 py 파일의 호 그리기

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cPrg import cPrg 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    super(mainWindow, self).__init__() 

    self.otherFile = cPrg() 

    self.initUI() 



def initUI(self): 

    #self.exitBtn = QtGui.QPushButton('Exit', self) 
    #self.exitBtn.setGeometry(100,100,60,40) 
    #self.exitBtn.clicked.connect(self.close_app) 

    self.label = QtGui.QLabel(self) 
    self.label.setText(self.otherFile.textas) 
    self.label.setGeometry(100,140, 60, 40) 

    self.otherFile.setGeometry(20,20, 20,20) 
    self.otherFile.startA = 270 
    self.otherFile.endA = -270 


    #self.showFullScreen() 
    self.setGeometry(100, 100, 800, 480) 
    self.setWindowTitle('Window Title') 

    self.show() 

def close_app(self): 
    sys.exit() 



def main(): 
    app = QtGui.QApplication(sys.argv) 
    gui = mainWindow() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

및 anotherfile.py

from PyQt4 import QtGui, QtCore, Qt 
from PyQt4.Qt import QPen 

class cPrg(QtGui.QWidget): 

def __init__(self): 

    super(cPrg, self).__init__() 

    self.startA = 0 
    self.endA = 0 
    self.textas = 'bandom' 

def paintEvent(self, e): 
    painter = QtGui.QPainter(self) 
    painter.setRenderHint(painter.Antialiasing) 
    rect = e.rect 

    r = QtCore.QRect(200,200,20,20)       #<-- create rectangle 
    size = r.size()           #<-- get rectangle size 
    r.setSize(size*10)           #<-- set size 
    startAngle = self.startA*16        #<-- set start angle to draw arc 
    endAngle = self.endA*16         #<-- set end arc angle 

    painter.setPen(QPen(QtGui.QColor('#000000')))    #<-- arc color 
    #painter.setBrush(QtCore.Qt.HorPattern) 
    painter.drawArc(r, startAngle, endAngle)     #<-- draw arc 


    painter.end() 
    super(cPrg,self).paintEvent(e) 

내가 잘못하고 무엇을 어떻게 변경할 수 있습니다 선폭 : 여기 코드는? 당신에게

편집 감사합니다 내가 메인 평 파일에 대한 모든 그림은, 여기에 코드입니다 :이 내 간단한 원형 진행률 표시 줄이

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cprg import cPrg 
from src.cprogress import GaugeWidget 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    self.otherFile = cPrg() 
    self.gauge = GaugeWidget() 

    self.i = 0 
    self.lineWidth = 3 
    self._value = 0 
    self.completed = 0 

    super(mainWindow, self).__init__() 

    self.initUI() 

def initUI(self): 

    self.setValue(.5) 

    #self.showFullScreen() 
    self.setGeometry(100, 100, 800, 480) 
    self.setWindowTitle('Window Title') 

    self.show() 

def close_app(self): 
    sys.exit() 

def setValue(self, val): 
    val = float(min(max(val, 0), 1)) 
    self._value = -270 * val 
    self.update() 

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

def paintEvent(self, e): 

    painter = QtGui.QPainter(self) 
    painter.setRenderHint(painter.Antialiasing) 
    rect = e.rect 

    outerRadius = min(self.width(),self.height()) 
    #arc line 
    r = QtCore.QRect(20,20,outerRadius-10,outerRadius-10)       #<-- create rectangle 
    size = r.size()           #<-- get rectangle size 
    r.setSize(size*.4)           #<-- set size 
    startAngle = 270*16        #<-- set start angle to draw arc 
    endAngle = -270*16         #<-- set end arc angle 

    painter.setPen(QPen(QtGui.QColor('#000000'), self.lineWidth))    #<-- arc color 
    #painter.setBrush(QtCore.Qt.HorPattern) 
    painter.drawArc(r, startAngle, endAngle)     #<-- draw arc 

    #arc prg 
    painter.save() 
    painter.setPen(QPen(QtGui.QColor('#ffffff'), 20)) 
    painter.drawArc(r, startAngle, self._value*16) 
    painter.restore() 

    painter.end() 
    super(mainWindow,self).paintEvent(e) 

def main(): 
app = QtGui.QApplication(sys.argv) 
gui = mainWindow() 
sys.exit(app.exec_()) 

if __name__ == '__main__': 
main() 

있다, 지금 문제는 내가 setValue에, setlineWidth 및 paintEvent를 배치 할 수있는 방법입니다 함수를 별도의 py 파일로 만든 다음이 함수를 사용하여이 파일과 클래스를 가져 와서 호출하면됩니까? 시도 :

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cprg import cPrg    #<import progressbar 
from src.cprogress import GaugeWidget 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    self.otherFile = cPrg()   #< imported progress bar 
    self.gauge = GaugeWidget() 

    self.i = 0 
    self.lineWidth = 3 
    self._value = 0 
    self.completed = 0 

    super(mainWindow, self).__init__() 

    self.initUI() 

def initUI(self): 

    self.otherFile.setGeometry(10,10,100,100) #<<<< progress bar size 
    self.otherFile.setValue(0.5)    #< progress bar value 

이 작동하지 않습니다.

+0

는 당신이 얻을 기대, 당신을 논리가 매우 잘못되었습니다. – eyllanesc

+0

@eyllanesc 나는 cPrg.py 파일과 main.py 파일에서 cPrg를 호출하고 크기를 setGeometry로 그냥 그려야한다. –

+0

@eyllanesc 왜 ​​로직이 잘못 되었습니까? 예를 들어 - 별도의 파일에 순환 진행률 표시 줄이 있고 주 파일에서이 진행률 표시 줄을 호출하고 작동하고 있습니다 (paintEvent는 진행률 표시 줄 py 파일에 있음). 나는 파이썬과 pyqt에 익숙하다는 것을 알고 있으므로이 경우에 잘못된 로직에 대해 더 알고 싶다. 고마워요 –

답변

1

QPen(color, line_width)으로 라인 너비를 변경하면 update()은 paintEvent로 다시 그립니다.

이 함께 시도 : 당신이 원형 진행 막대를 원하는 경우

from PyQt4 import QtGui, QtCore 


class cPrg: 
    def __init__(self): 
     self.linewidth = 0 

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

    def drawArc(self, painter): 
     painter.setRenderHint(painter.Antialiasing) 
     r = QtCore.QRect(200,200,20,20)       #<-- create rectangle 
     size = r.size()           #<-- get rectangle size 
     r.setSize(size*10)           #<-- set size 
     startAngle = self.startA*16        #<-- set start angle to draw arc 
     endAngle = self.endA*16         #<-- set end arc angle 
     painter.setPen(QtGui.QPen(QtGui.QColor('#000000'), self.linewidth))    #<-- arc color 
     painter.drawArc(r, startAngle, endAngle)     #<-- draw arc 


class mainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(mainWindow, self).__init__() 
     self.otherFile = cPrg() 
     self.initUI() 
     self.i = 0 

    def initUI(self): 
     self.label = QtGui.QLabel(self) 
     self.label.setText(self.otherFile.textas) 
     self.label.setGeometry(100,140, 60, 40) 
     self.otherFile.startA = 270 
     self.otherFile.endA = -270 
     self.setGeometry(100, 100, 800, 480) 
     self.setWindowTitle('Window Title') 
     timer = QtCore.QTimer(self) 
     timer.timeout.connect(self.changeLineWidth) 
     timer.start(1000) 

    def changeLineWidth(self): 
     self.otherFile.setLineWidth(self.i) 
     self.i += 1 
     self.i %= 60 
     self.update() 

    def paintEvent(self, e): 
     painter = QtGui.QPainter(self) 
     self.otherFile.drawArc(painter) 


if __name__ == '__main__': 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    w = mainWindow() 
    w.show() 
    sys.exit(app.exec_()) 

, 당신이 우선해야 QProgressbar :

from math import ceil 

from PyQt4 import QtGui, Qt, QtCore 
import sys 


class cPrg(QtGui.QProgressBar): 

    def __init__(self, parent=None): 
     super(cPrg, self).__init__(parent) 
     self.linewidth = 1 

    def factor(self, value): 
     a = 360/(self.maximum() - self.minimum()) 
     b = -a/(self.maximum() - self.minimum()) 
     return a*value + b 

    def setLineWidth(self, linewidth): 
     self.linewidth = linewidth 
     self.update() 

    def paintEvent(self, event): 

     painter = QtGui.QPainter(self) 
     painter.setRenderHint(painter.Antialiasing) 
     r = self.rect() 
     val = ceil(self.factor(self.value())) 
     nr = QtCore.QRect(r.topLeft() + QtCore.QPoint(self.linewidth, self.linewidth), 
        QtCore.QSize(r.width()-2*self.linewidth, r.height()-2*self.linewidth)) 
     painter.setPen(QtGui.QPen(QtGui.QColor('#000000'), self.linewidth)) 
     painter.drawArc(nr, 0*16, val*16) 


class mainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(mainWindow, self).__init__() 
     self.otherFile = cPrg(self) 
     self.otherFile.setMinimum(0) 
     self.otherFile.setMaximum(360) 
     self.otherFile.setValue(90) 
     self.initUI() 

     timerLW = QtCore.QTimer(self) 
     timerLW.timeout.connect(self.changeLW) 
     timerLW.start(100) 

     timerVal = QtCore.QTimer(self) 
     timerVal.timeout.connect(self.updateValue) 
     timerVal.start(100) 

    def initUI(self): 
     self.label = QtGui.QLabel(self) 
     self.label.setText("test") 
     self.label.setGeometry(200, 200, 60, 40) 

     self.otherFile.setGeometry(0, 0, 200, 200) 
     self.setGeometry(0, 0, 800, 480) 
     self.setWindowTitle('Window Title') 

    def changeLW(self): 
     lw = (self.otherFile.linewidth + 1) % 20 
     self.otherFile.setLineWidth(lw) 

    def updateValue(self): 
     self.otherFile.setValue(self.otherFile.value() + 1) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    gui = mainWindow() 
    gui.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

enter image description here enter image description here

+0

이 답변을 주셔서 감사합니다,이 가능하지만,이 알 그림은 cPrg.py 파일과 main.py 파일에서 그냥 다시 그리기없이 cPrg를 호출처럼 만들 수 있습니까? –

+0

감사합니다! 순환 진행 막대 예제를 찾기 시작했을 때 어디 있었습니까? :) 이제 내 자아에 의해 그것을 배우고 싶다. 그리고 나의 아크는 마치 진도 막대처럼 setGeometry에 의해 크기를 만들지 않는 것처럼 보인다. 아무튼 감사 해요! –

+0

그런데 왜 내가 진행률 표시 줄 크기를 설정할 수 있는지 말해 줄 수 있습니까? setGeometry? –