2016-06-09 3 views
0

У меня проблема, что я не могу изменить gifs на QMainWindow. Я читаю строку из json-файла, что json-файл меняется каждый раз. Например, если строка из json-файла равна aaa, я хочу сыграть aaa.gif на QMainWindow, если строка bbb Я хочу играть bbb.gif. У меня уже есть 2 gif, но проблема в том, что при изменении строки в json-файле gif нет. Коды не долго, просто взгляните;PyQt5 не изменяет gifs

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_()) 

Я также попытался повторно определить весь QMovie объект Aswell (от self.moviee до self.movie.start), но не работает. 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 между вызовами таймера, и поэтому gifs менялись, но не играли между вызовами, потому что не было времени. Установка тайм-аута при значении, как 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-500 мс хорошо, если вы установите более низкий уровень gif, играете очень быстро, если вы установите более gif, играйте медленнее. – GLHF

Смежные вопросы