关于python:PyQt:QWidget幻灯片图像未在QMainWindow中正确显示

PyQt: QWidget slideshow images not showing up correctly in QMainWindow

我创建了两个类-从QtDesigner生成的QMainWindow和仅单独执行时完美运行的QWidget幻灯片。 我设法将小部件合并到MainWindow类中,并且当我单击"幻灯片"按钮时,它会执行良好的BUT,但图像不显示并出现此错误:

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

这可能是一个小错误,但我仍然是PyQt的新手,而且我已经尝试摆弄它近一天了,哈哈。 一如既往,任何帮助将不胜感激!

这是完整的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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_())

问题出在您在MainWindow.__init__中创建Slides实例的行中

1
self.slides_widget = Slides(self)

您将self(作为MainWindow的实例读取)传递到image_files变量而不是parent的位置。 查看您的Slides.__init__

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

parent变量具有默认值None,因此在实例创建过程中不会引发任何错误。 但是,稍后尝试将image_files视为列表时,会得到一个TypeError(请记住已放置image_files=self(MainWindow实例))。

只需使用:

1
self.slides_widget = Slides(image_files, self)

而是在您的MainWindow.__init__

祝好运 :)