2017-04-21 11 views
1

QtDesigner에서 생성 된 QMainWindow와 단독 실행시 완벽하게 작동하는 QWidget Slideshow라는 두 클래스를 만들었습니다. 나는 MainWindow를 클래스 내부의 위젯을 통합 관리하고 그것을 잘 실행하지만 슬라이드 쇼 버튼을 클릭하면 이미지가 표시 및이 오류를 포기하지 않습니다PyQt : QMainWindow에 QWidget 슬라이드 쇼 이미지가 올바르게 표시되지 않습니다.

line 61, in timerEvent 
    if self.step >= len(self.image_files): 
TypeError: object of type 'MainWindow' has no len() 

그것은 아마 사소한 실수를하지만 난 여전히 해요 PyQt에 익숙하지 않은 나는 이미 거의 하루 동안 그것을 놀래켜 보려고 노력했다. 언제나처럼 어떤 도움을 주시면 감사하겠습니다!

from PyQt4 import QtCore, QtGui 
import sys 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 


class MainWindow(QtGui.QMainWindow): 
       #(self, parent=None) <- original code 
    def __init__(self, image_files, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 

     #Initialized Widget here 
     self.slides_widget = Slides(self) 
     self.setCentralWidget(self.slides_widget) 

    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(1012, 532) 

     self.tabWidget = QtGui.QTabWidget(Form) 
     self.tabWidget.setGeometry(QtCore.QRect(470, 130, 451, 301)) 
     self.tabWidget.setObjectName(_fromUtf8("tabWidget")) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 



class Slides(QtGui.QWidget): 
    def __init__(self, image_files, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     self.image_files = image_files 
     self.label = QtGui.QLabel("", self) 
     self.label.setGeometry(50, 150, 450, 350) 

     #button 
     self.button = QtGui.QPushButton(". . .", self) 
     self.button.setGeometry(200, 100, 140, 30) 
     self.button.clicked.connect(self.timerEvent) 
     self.timer = QtCore.QBasicTimer() 
     self.step = 0 
     self.delay = 3000 #ms 
     sTitle = "DIT Erasmus Page : {} seconds" 
     self.setWindowTitle(sTitle.format(self.delay/1000.0)) 


    def timerEvent(self, e=None): 
     if self.step >= len(self.image_files): 
      self.timer.start(self.delay, self) 
      self.step = 0 
      return 
     self.timer.start(self.delay, self) 
     file = self.image_files[self.step] 
     image = QPixmap(file) 
     self.label.setPixmap(image) 
     self.setWindowTitle("{} --> {}".format(str(self.step), file)) 
     self.step += 1 

image_files = ["slide1.jpg", "slide2.jpg", "slide3.jpg", "slide4.jpg"] 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    Form = MainWindow(image_files) 
    ui = MainWindow(image_files) 
    Form.show() 
    sys.exit(app.exec_()) 

답변

3

이 문제는 당신이 MainWindow.__init__

self.slides_widget = Slides(self) 

당신은 self을 통과 당신의 Slides 인스턴스를 만들 줄에 (MainWindow의 인스턴스로 읽기)에 : 여기

는 전체 코드입니다 parent 대신에 image_files 변수의 위치. 당신의 Slides.__init__

class Slides(QtGui.QWidget): 
    def __init__(self, image_files, parent=None): 

parent 변수가 너무 인스턴스 작성 중에 오류가 트리거되지 않습니다 기본값 None을 가지고 참조하십시오. 그러나 image_files을 목록으로 처리하려고하면 나중에 TypeError이 표시됩니다 (image_files=self (MainWindow 인스턴스)를 넣었음을 기억하십시오).

그냥 사용

self.slides_widget = Slides(image_files, self) 

하는 대신 MainWindow.__init__

행운을 빕니다에 :)

+1

이 나를 위해 속임수를 썼는지! 많은 thankssssss! – madLad