2016-06-09 4 views
0

QMainWindow에서 gif를 변경할 수 없다는 문제가 있습니다. json 파일에서 문자열을 읽고 있는데, json 파일이 매번 바뀌고 있습니다. 예를 들어 json 파일의 문자열이 aaa 인 경우 bbbbbb.gif으로 재생하려면 QMainWindowaaa.gif을 재생하고 싶습니다. 이미 2 개의 gif가 있지만 문제는 json 파일의 문자열이 변경되면 gif가 변경되지 않는다는 것입니다. 코드는 길지 않습니다. 한번보세요. PyQt5가 gif를 변경하지 않습니다

from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, 
          QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, 
          QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, 
          QTextEdit,QDialog,QFrame,QProgressBar 
          ) 
from PyQt5 import QtCore, QtWidgets, QtGui 
from PyQt5.QtGui import QIcon,QFont,QPixmap,QPalette 
from PyQt5.QtCore import QCoreApplication, Qt,QBasicTimer, QTimer,QPoint 
import PyQt5.QtWidgets,PyQt5.QtCore 
import time,random,subprocess,sys,json 

class cssden(QMainWindow): 
    def __init__(self): 
     super().__init__() 


     self.mwidget = QMainWindow(self) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 

     self.setFixedSize(1400,923) 
     self.center 

     #timer 
     self.timer = QTimer(self) 
     self.timer.timeout.connect(self.timer_) 
     self.timer.start(0) 

     #gif           
     self.moviee = QLabel(self)     
     self.movie = QtGui.QMovie("aaa.gif") 
     self.moviee.setMovie(self.movie) 
     self.moviee.setGeometry(5,-80,380,250) 
     self.movie.start() 

     self.show() 
    def timer_(self): 
     with open ("mode.json") as tt: 
      self.mode = json.load(tt) 
     print (self.mode) 
     if self.mode == "bbb": 
      self.movie = QtGui.QMovie("bbb.gif") 
      #self.moviee.setGeometry(400,200,380,250) # 
     else:           #----] I tried this but not working 
      self.movie = QtGui.QMovie("aaa.gif")  # 

    #center of the screen 
    def center(self): 
     qr = self.frameGeometry() 
     cp = QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

app = QApplication(sys.argv) 
app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 1px solid black}") 

ex = cssden() 
sys.exit(app.exec_()) 

는 또한 (self.movie.start하는 self.moviee에서) 전체 QMovie 객체 aswell를 다시 정의하는 시도했지만 작동하지 않았다. GIF가 변경되거나 재생되지 않습니다. 또한 좌표를 if self.mode == "bbb" 다음에 설정하면 마지막 GIF가 새로운 GIF를 차단하고있는 것을 볼 수 있습니다. 실제로 새로운 gif를 재생하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

당신은 당신이 변수 self.movie에 다른 개체를 넣어 때문에, 라벨에 영화를 설정하고 각 할당 후 self.movie를 다시 시작해야이 새 영화 객체는 라벨도 시작도 아니다. – Enaid

+0

내가 말했던 것처럼, QMovie 객체 전체를 다시 정의했다. 작동하지 않았다. – GLHF

+0

QTimer의 시간 초과는 0입니다. 즉, 파일이 항상 변경되는 동안 timer_는 한 번만 호출됩니다. 타임 아웃을 변경해보십시오. – Enaid

답변

1

주요 문제는 타이머입니다. timer.start (0)를 사용하면 타이머 호출에 대한 GUI 업데이트가 건너 뛰었으므로 시간이 없기 때문에 gif가 변경되었지만 호출간에 재생되지 않았습니다. 여전히 일을 할 수있을만큼 빠른하면서 문제를 해결할 수 500 (= 0.5 초)와 같은 값으로 시간 제한을 설정 (또한, 아래에 의견을 참조)

timer.start(10) 

다음 코드는 나를 위해 작동합니다. 테스트를 위해 json 파일을 변경하는 또 다른 타이머를 추가했지만 다른 곳에서 변경해야하기 때문에 필요하지 않습니다.

from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, 
           QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, 
           QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, 
           QTextEdit,QDialog,QFrame,QProgressBar 
           ) 
    from PyQt5 import QtCore, QtWidgets, QtGui 
    from PyQt5.QtGui import QIcon,QFont,QPixmap,QPalette 
    from PyQt5.QtCore import QCoreApplication, Qt,QBasicTimer, QTimer,QPoint 
    import PyQt5.QtWidgets,PyQt5.QtCore 

    import time,random,subprocess,sys,json 

    class cssden(QMainWindow): 
     def __init__(self): 
      super(cssden, self).__init__() 


      self.mwidget = QMainWindow(self) 
      self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 

      self.setFixedSize(1400,923) 

      self.center() 

      #timer 
      self.timer = QTimer(self) 
      self.timer.timeout.connect(self.timer_) 
      self.timer.start(1000)      # changed timer timeout to 1s 

      self.timer2 = QTimer(self)     # I added 
      self.timer2.timeout.connect(self.timer2_) # this, but 
      self.timer2.start(500)      # you can remove it 

      #gif 
      self.moviee = QLabel(self) 
      self.movie = QtGui.QMovie("aaa.gif") 
      self.moviee.setMovie(self.movie) 
      self.moviee.setGeometry(5,-80,380,250) 
      self.movie.start() 
      self.show() 

     def timer2_(self):    # You can 
      tt = open("mode.json", 'w') # remove 
      i = random.randint(0,1)  # that too 
      if i == 1:     # 
       json.dump('aaa', tt)  # 
      elif i == 0:     # 
       json.dump('bbb', tt)  # 
      tt.close()     # 


     def timer_(self): 
      tt = open("mode.json", 'r') 
      self.mode = json.load(tt) 
      tt.close() 
      print (self.mode) 
      if self.mode == "bbb": 
       self.movie = QtGui.QMovie("bbb.gif") 
       self.moviee.setMovie(self.movie)  # I added 
       self.movie.start()     # those lines 
      else:           
       self.movie = QtGui.QMovie("aaa.gif") 
       self.moviee.setMovie(self.movie)  # and here 
       self.movie.start()     # too 

     #center of the screen 
     def center(self): 
      qr = self.frameGeometry() 
      cp = QDesktopWidget().availableGeometry().center() 
      qr.moveCenter(cp) 
      self.move(qr.topLeft()) 

    app = QApplication(sys.argv) 
    app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 1px solid black}") 

    ex = cssden() 
    sys.exit(app.exec_()) 
+0

죄송합니다. 토론에서 알림을 보지 못했습니다. 나는 돌아왔다! – Enaid

+1

방문객을 위해 타이머를 낮게 설정하면 gif가 더 빨리 실행됩니다. 따라서 약 400-500ms가 적당합니다. 낮은 gif를 설정하면 정말 빠르게 재생됩니다. 설정하면 GIF가 더 느리게 재생됩니다. – GLHF