2016-04-08 18 views
-1

Bu kodu neredeyse kod açısından istediğim yere sahibim. Bu betiğin her dakika yenilenmesini ve manuel olarak yenilenmesi için bir butonum olmasını istiyorum. Düğme zaten var ama istediği gibi çalışmıyor. Widget içerisindeki bilgileri yeniden çizmeyi veya yenilemeyi istiyorum.Python'da QtButton ve Qtimer

Düğme Kodu:

bottom2 = QtGui.QPushButton("Refresh") 
#bottom2.setFrameShape(QtGui.QFrame.StyledPanel) 
#bottom2.setWordWrap(True) 
bottom2.clicked.connect(InfoCenter) 

Zamanlayıcı Kodu:

timer = QtCore.QTimer() 
QtCore.QTimer.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("func()")) 
timer.start(6000) 

Tam Kod:

import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import Qt, QTimer 
from PyQt4.QtGui import QWidget, QApplication, QSplitter, QLabel, QVBoxLayout, QColor, QPixmap, QIcon 
import Adafruit_DHT 
import urllib2 
from wunderground import high_0, low_0, conditions_0 
from BeautifulSoup import BeautifulSoup 

sensor_args = { '11': Adafruit_DHT.DHT11, 
       '22': Adafruit_DHT.DHT22, 
       '2302': Adafruit_DHT.AM2302 } 

humidity, temperature = Adafruit_DHT.read_retry(11, 4) 


temp = 'Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity) 

soup = BeautifulSoup(urllib2.urlopen('http://partner.mlb.com/partnerxml/gen/news/rss/bos.xml').read()) 

title = soup.find('item').title 
desc = soup.find('item').description 
url = soup.find('item').guid 



temperature = temperature * 9/5.0 + 32 




class InfoCenter(QtGui.QWidget): 

    def __init__(self): 
     super(InfoCenter, self).__init__() 

     self.initUI() 

    def initUI(self):  

     hbox = QtGui.QHBoxLayout(self) 


     self.outsidetemp = QLabel("Todays High:{}\nTodays Low:{}\nConditions:{}".format(high_0,low_0,conditions_0),self) 
     self.outsidetemp.setFrameShape(QtGui.QFrame.StyledPanel) 


     self.insidetemp = QLabel('Temperature:{:0.1f}F\nHumidity:{:0.1f}%'.format(temperature,humidity),self) 
     self.insidetemp.setFrameShape(QtGui.QFrame.StyledPanel) 

     self.mlbnews = QLabel("Redsox News \nTitle: %s\nSummary: %s " % (title.text, desc.text), self) 
     self.mlbnews.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.mlbnews.setWordWrap(True) 

     self.button = QtGui.QPushButton("Refresh") 
     self.button.clicked.connect(InfoCenter) 

     splitter1 = QtGui.QSplitter(QtCore.Qt.Horizontal) 
     splitter1.addWidget(outsidetemp) 
     splitter1.addWidget(insidetemp) 

     splitter2 = QtGui.QSplitter(QtCore.Qt.Vertical) 
     splitter2.addWidget(splitter1) 
     splitter2.addWidget(mlbnews) 
     splitter2.addWidget(button) 


     hbox.addWidget(splitter2) 
     self.setLayout(hbox) 
     QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks')) 

     self.setGeometry(300, 300, 300, 200) 
     self.setWindowTitle('QtGui.QSplitter') 
     self.show() 

     #color widget code 
     palette = self.palette() 
     role = self.backgroundRole() 
     palette.setColor(role, QColor('black')) 
     self.setPalette(palette) 
     outsidetemp.setStyleSheet("QLabel {color:yellow}") 
     insidetemp.setStyleSheet("QLabel {color:yellow}") 
     mlbnews.setStyleSheet("QLabel {background-color: black; color:white}") 

@QtCore.pyqtSlot() 
def refreshLabels(self): 
    self.outsidetemp.setText('Temperature:{:0.1f}F\nHumidity:{:0.1f}%'.format(temperature,humidity),self) 

    timer = QtCore.QTimer() 
    self.timer.timeout.connect(self.refreshLabels)  
    timer.start(5000) 
    print 'done' 




def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = InfoCenter() 
    app.exec_()  


if __name__ == '__main__': 
    main() 

GÜNCELLEME KOD

+1

"Çalışmıyor" ile ne demek istiyorsun? Hiçbir şey olmuyor? Daha spesifik ol. –

+0

'funct()' yuvası, InfoCenter'dan eksik değil mi? Zamanlayıcı tetiklendiğinde ne çağrılacak? Ayrıca, yuvalarda 'button.clicked.connect (InfoCenter)' 'InfoCenter'ın başka bir örneğini oluşturamaz mı? Bu amaçlanmış mıydı? –

+0

Ayrıca, bir grup QFrames oluşturuyorsunuz ve hemen aynı ada sahip başka bir widget yaratıyorsunuz. Tüm bu QFrame'ler, herhangi bir düzende eklenmiyor. –

cevap

1

Öncelikle, widget'larınız başvurular saklamak gerekir (ihbar self)

self.outsidetemp = QLabel(...) 

Muhtemelen nesne ve depolamak değil, geçmelisin ortama bağlı olarak tüm widget'lar için yapmalı Bir widget'a yapılan bir python referansı, toplanan çöplere neden olabilir ve hatalar alabilirsiniz. Ayrıca

self.timer.timeout.connect(self.refreshLabels) 

Sonra etiketleri güncelleyecek bir işlev oluşturmak daha temiz yeni tarzı sinyal sözdizimini kullanabilirsiniz

, buna timeout sinyalini bağlayın.

@QtCore.pyqtSlot() 
def refreshLabels(self): 
    self.outsidetemp.setText("Todays High:{}\nTodays Low:{}\nConditions:{}".format(high_0,low_0,conditions_0)) 

Ayrıca, global değişkenleri kullanarak burada yapılması gereken en iyi yolun olmamasının zorunlu uyarısını da ekleyeceğim. Global değişkenleri nasıl güncelliyorsunuz? Bir QTimer kullanmak yerine, neden sadece global değişkenleri güncelleyen işlemin widget'ı güncellemesine gerek yok?

+0

Tamam, bunun için teşekkür ederim. Eklediğim bu QtCore.pyqtSlot() def refreshLabels (öz) @ : self.outsidetemp.setText ("Bugünün Yüksek: {} \ nTodays Düşük: {} \ nConditions: {}". Biçimi (high_0, low_0 , koşullar_0)) timer = QtCore.QTimer() QtCore.QTimer.connect (zamanlayıcı, QtCore.SIGNAL ("zaman aşımı()"), self, QtCore.pyqtSlot ("func()")) zamanlayıcı.başlangıç ​​(5000) print 'done' Bu amaçlanan şekilde çalışmıyor. –

+0

Eklediklerim cevabımda yazdıklarım değil. –

+0

Ayrıca "amaçlandığı gibi çalışmıyor" bize çok şey söylemiyor. Ne olmasını beklediğinizi ve gerçekte neler olduğunu açıklarsanız çok daha yararlıdır. –