raiseTemmie.py

import random
import sys
import time

from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QWidget, QLabel, QApplication

class Example(QWidget):
    size=100
    imgNum=0
    imgQuantity=2

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setStyleSheet("background-color:transparent;")
        self.setGeometry(100, 100, 100, 100)
        self.setWindowFlags(Qt.SplashScreen | Qt.WindowStaysOnTopHint)
        self.label=QLabel(self)
        self.pixmaps=[QPixmap('left.png'),QPixmap('right.png'),QPixmap('stand.png')]
        for x in range(len(self.pixmaps)):
            self.pixmaps[x]=self.pixmaps[x].scaled(self.size,self.size,Qt.KeepAspectRatio)
        self.label.setPixmap(self.pixmaps[2])
        self.resize(self.pixmaps[2].width(),self.pixmaps[2].height())
        self.show()

    def moving(self):
        distance=random.randint(10,40)
        direct =[random.randint(-1,2),random.randint(-1,2)]
        for x in range(0,distance):
            self.changeFoot()
            self.move(self.x()+5*direct[0],self.y()+5*direct[1])
            time.sleep(0.05)
        # self.changeTimer.stop()


    def changeFoot(self):
        if self.imgNum<self.imgQuantity-1:
            self.imgNum+=1
        else :
            self.imgNum=0
        self.label.setPixmap(self.pixmaps[self.imgNum])

    def mousePressEvent(self, QMouseEvent):
        self.label.setPixmap(self.pixmaps[2])
        self.changeTimer.stop()

    changeTimer=QTimer()
    def keyPressEvent(self, QKeyEvent):
        if QKeyEvent.key() == Qt.Key_Escape:
            sys.exit()
        if QKeyEvent.key() == Qt.Key_G:
            self.moving()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

मैंने सोचा था कि यह कोड पिक्समैप को स्विच करेगा और इसे एक साथ स्थानांतरित करेगा लेकिन यह अच्छी तरह से काम नहीं करता है। समाप्त होने के बाद टाइमर शुरू होता है। समस्या क्या है?

def keyPressEvent(self, QKeyEvent):
    if QKeyEvent.key() == Qt.Key_Escape:
        sys.exit()
    if QKeyEvent.key() == Qt.Key_G:
        self.moving()

अगर मैं 'जी' दबाता हूं, तो यह चेंजटाइमर शुरू करता है और चलती है ()

1
JangTry 19 जून 2017, 06:39

1 उत्तर

सबसे बढ़िया उत्तर

डेटा को अपडेट करने के लिए qApp.processEvents() का उपयोग करना एक संभावित समाधान है, यह अनुशंसा की जाती है जब कार्यों को आपके मामले की तरह कम समय की आवश्यकता होती है, क्योंकि लूप का अधिकतम समय 0.05sec*40=2sec है।

def moving(self):
    distance=random.randint(10,40)
    direct =[random.randint(-1,2),random.randint(-1,2)]
    for x in range(0,distance):
        self.changeFoot()
        self.move(self.x()+5*direct[0],self.y()+5*direct[1])
        time.sleep(0.05)
        qApp.processEvents()

यदि समय बढ़ता है तो समाधान विफल हो सकता है, दूसरा समाधान टाइमर को लागू करना और कार्यों को सही ढंग से अलग करना है जैसा कि मैं नीचे दिखाता हूं:

class Example(QWidget):
    size=100
    imgNum=0
    imgQuantity=2

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setStyleSheet("background-color:transparent;")
        self.setGeometry(100, 100, 100, 100)
        self.setWindowFlags(Qt.SplashScreen | Qt.WindowStaysOnTopHint)
        self.label=QLabel(self)
        self.pixmaps=[QPixmap('left.png'),QPixmap('right.png'),QPixmap('stand.png')]
        for x in range(len(self.pixmaps)):
            self.pixmaps[x]=self.pixmaps[x].scaled(self.size,self.size,Qt.KeepAspectRatio)
        self.label.setPixmap(self.pixmaps[2])
        self.resize(self.pixmaps[2].width(),self.pixmaps[2].height())

        self.changeTimer=QTimer(self)
        self.changeTimer.timeout.connect(self.onTimeout)
        self.show()

    def moving(self):
        self.distance= random.randint(10,40)
        self.direct = QPoint(random.randint(-1,2), random.randint(-1,2))
        self.changeTimer.start(50)

    def onTimeout(self):
        if self.distance == 0:
            self.changeTimer.stop()
        else:
            self.changeFoot()
            self.move(self.pos() +  self.direct)
        self.distance -= 1   

    def changeFoot(self):
        if self.imgNum<self.imgQuantity-1:
            self.imgNum+=1
        else :
            self.imgNum=0
        self.label.setPixmap(self.pixmaps[self.imgNum])

    def mousePressEvent(self, QMouseEvent):
        self.label.setPixmap(self.pixmaps[2])
        self.changeTimer.stop()

    def keyPressEvent(self, QKeyEvent):
        if QKeyEvent.key() == Qt.Key_Escape:
            self.close()
        if QKeyEvent.key() == Qt.Key_G:
            self.moving()

नोट: sys.exit() के बजाय self.close() का उपयोग करने की सलाह दी जाती है क्योंकि पहले कार्यक्रम को संसाधनों को मुक्त करने और ठीक से बंद करने के लिए समय देता है।

0
eyllanesc 19 जून 2017, 07:10