2016-04-08 11 views
-1

私はこのコードをコードのどこに置いても大丈夫です。私は毎分このスクリプトを更新して、手動で更新するためのボタンを持っていると思っています。ボタンはすでにそこにありますが、必要に応じて機能しないようです。ウィジェット内の情報を再描画または更新する必要があります。QtButtonとQtimerをPythonで使用する

ボタンのコード:

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

タイマーコード:

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

全コード:

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

更新されたコード

+1

「働いていない」とはどういう意味ですか?何も起こりません?具体的に。 –

+0

'InfoCenter'には' funct() 'スロットがありませんか?タイマーがトリガーするときには何が呼び出されますか?また、スロット上で、 'button.clicked.connect(InfoCenter)'は 'InfoCenter'の別のインスタンスを作成しませんか?これは意図されたものですか? –

+0

また、たくさんの 'QFrames'を作成して、まったく同じ名前の別のウィジェットをすぐに作成しています。これらの「QFrames」はすべてのレイアウトに追加されていません。 –

答えて

1

まず第一に、あなたはあなたのウィジェットへの参照を格納する必要があります(予告self

self.outsidetemp = QLabel(...) 

おそらく、オブジェクト、あなたは格納しないで実行している環境に応じて、すべてのあなたのウィジェットのためにこれを行う必要がありますウィジェットへのPython参照がガベージコレクションになる可能性があり、エラーが発生する可能性があります。

またその後、ラベルを更新することにtimeout信号を接続する機能を作成

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

ずっときれいである新しいスタイルの信号の構文を使用することができます。

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

グローバル変数を使用することは、おそらくこれを実行する最善の方法ではないという義務的な警告を追加します。どのようにグローバル変数を更新していますか? QTimerを使う代わりに、グローバル変数を更新しているプロセスがウィジェットを更新するだけではどうですか?

+0

ありがとうございました。これを追加しました。 @ QtCore.pyqtSlot() def refreshLabels(self): self.outsidetemp.setText( "今日の最高:{} \ n今日の最低:{} \ n条件:{}"。書式(high_0、low_0 、条件_0)) timer = QtCore.QTimer( )QtCore.QTimer.connect(timer、QtCore.SIGNAL( "timeout()")、self、QtCore.pyqtSlot( "func()")) タイマー。開始(5000) 印刷 '完了' これは意図したとおりに動作しません。 –

+0

あなたが追加したのは私の答えに書いたものではありません。 –

+0

また、「意図したとおりに動作しない」とは、あまり教えてくれません。起こると予想されること、そして実際に起こっていることを記述すると、はるかに役立ちます。 –