在PyQt中在运行时自动更改Pixmap图像

时间:2014-11-10 19:52:10

标签: python pyqt qt-designer

我希望使用具有已定义延迟的while循环自动更改窗口中显示的像素图像,并使用存储在字符串列表中的图像的位置。  我尝试的所有可能性导致第一个图像被显示但在运行时没有改变。 只有在程序完成各种执行后才能反映任何更改。

from PyQt4 import QtCore, QtGui
import time
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 Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(598, 555)
        self.horizontalLayout = QtGui.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.start_pulse = QtGui.QPushButton(Form)
        self.start_pulse.setObjectName(_fromUtf8("start_pulse"))
        self.horizontalLayout.addWidget(self.start_pulse)
        self.label = QtGui.QLabel(Form)
        self.label.setAutoFillBackground(True)
        self.label.setText(_fromUtf8(""))
        self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
        self.label.setScaledContents(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)

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


    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.start_pulse.setText(_translate("Form", "start", None))
        self.start_pulse.clicked.connect(self.soumyajit)
    def soumyajit(self):
        j=0
        while(1):
            print("change")
            if j==0:
                self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI2.png")))
            if j==1:
                self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
            if j==2:
                self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI2.png")))
            if j==3:
                self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
            j=j+1
            #delay
            time.sleep(.5)
if __name__=='__main__':
        app=QtGui.QApplication(sys.argv)
        ex = Ui_Form()
        ex.show()
        sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:0)

您在GUI主题中运行循环,因此它会冻结您的所有应用。这是不好的方法。您应该使用QTimer代替。使用timeout()信号在特殊插槽内进行所有图像更改。 QTimer是异步的,因此不会冻结您的应用。

你也可以在循环内部调用processEvents(),但这不是一个好的解决方案,定时器比睡眠循环好。

答案 1 :(得分:0)

以下代码是我根据您的代码修改的,效果很好:

Changing Pixmap image automatically at runtime in PyQt的原始代码

WonJong Kim(wjkim@etri.re.kr)为解决问题进行了修改

import sys
import time
import numpy
from PyQt4 import QtCore, QtGui
import PyQt4.Qwt5 as Qwt

numPoints=1000
xs=numpy.arange(numPoints)
ys=numpy.sin(3.14159*xs*10/numPoints) #this is our data

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 Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
        self.index = 0

    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(500, 300)
        self.horizontalLayout = QtGui.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.start_pulse = QtGui.QPushButton(Form)
        self.start_pulse.setObjectName(_fromUtf8("start_pulse"))
        self.stop_pulse = QtGui.QPushButton(Form)
        self.stop_pulse.setObjectName(_fromUtf8("stop_pulse"))
        self.horizontalLayout.addWidget(self.start_pulse)
        self.horizontalLayout.addWidget(self.stop_pulse)
        self.label = QtGui.QLabel(Form)
        self.label.setAutoFillBackground(True)
        self.label.setText(_fromUtf8(""))
        self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
        self.label.setScaledContents(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)

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

    def refreshUi(self):
        if self.index%10==0:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/10.jpg")))
        if self.index%10==1:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/1.jpg")))
        if self.index%10==2:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/2.jpg")))
        if self.index%10==3:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/3.jpg")))
        if self.index%10==4:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/4.jpg")))
        if self.index%10==5:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/5.jpg")))
        if self.index%10==6:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/6.jpg")))
        if self.index%10==7:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/7.jpg")))
        if self.index%10==8:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/8.jpg")))
        if self.index%10==9:
            self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/9.jpg")))

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.start_pulse.setText(_translate("Form", "start", None))
        self.start_pulse.clicked.connect(self.start)
        self.stop_pulse.setText(_translate("Form", "stop", None))
        self.stop_pulse.clicked.connect(self.stop)

    def start(self):
        self.timer1.start(500.0) #set the interval (in ms)

    def stop(self):
        self.timer1.stop() #stop the timer

    def change_index(self):
        self.index += 1


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win_plot = Ui_Form()

    win_plot.index = 0
    win_plot.timer = QtCore.QTimer() #start a timer (to call replot events)
    win_plot.timer.start(100.0) #set the interval (in ms)
win_plot.connect(win_plot.timer, QtCore.SIGNAL('timeout()'), win_plot.refreshUi)

win_plot.timer1 = QtCore.QTimer() #start a timer (to call replot events)
win_plot.connect(win_plot.timer1, QtCore.SIGNAL('timeout()'),
    win_plot.change_index)

# show the main window
win_plot.show()
sys.exit(app.exec_())