2017-04-20 185 views
1

我目前無法連續更新標籤,我試過了不同的方法,但是沒有任何反應或程序停止工作。我在下面附上我的代碼的一部分。我也希望有人能確切地解釋高清retranslateUi的目的(個體經營,主窗口):PyQt5:更新標籤?

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("Tom") 
     MainWindow.setWindowModality(QtCore.Qt.NonModal) 
     MainWindow.resize(800, 600) 
     MainWindow.setAutoFillBackground(False) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) 
     self.verticalLayout.setObjectName("verticalLayout") 
     self.Date = QtWidgets.QLabel(self.centralwidget) 
     font = QtGui.QFont() 
     font.setPointSize(18) 
     self.Date.setFont(font) 
     self.Date.setAlignment(QtCore.Qt.AlignCenter) 
     self.Date.setObjectName("Date") 
     self.verticalLayout.addWidget(self.Date) 
     self.Time = QtWidgets.QLabel(self.centralwidget) 
     self.Time.setAlignment(QtCore.Qt.AlignCenter) 
     self.Time.setObjectName("It is currently " + datetime.strptime(d, "%H:%M:%S").strftime(" %I:%M:%S %p")) 
     self.verticalLayout.addWidget(self.Time) 
     self.Weather = QtWidgets.QLabel(self.centralwidget) 
     self.Weather.setAlignment(QtCore.Qt.AlignCenter) 
     self.Weather.setWordWrap(False) 
     self.Weather.setObjectName("Weather") 
     self.verticalLayout.addWidget(self.Weather) 
     spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem) 
     spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem1) 
     spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem2) 
     spacerItem3 = QtWidgets.QSpacerItem(771, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem3) 
     spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem4) 
     spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem5) 
     MainWindow.setCentralWidget(self.centralwidget) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 


    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("Tom", "Tom")) 
     self.Date.setText(_translate("Tom", "Today is " + week_day +" the " + (ordinal(day)) + " of " + (month))) 
     self.Time.setText(_translate("Tom", "It is currently " + datetime.strptime(d, "%H:%M:%S").strftime(" %I:%M:%S %p"))) 
     self.Weather.setText(_translate("Tom", "New York City " + str(ctemp) + "\xb0F " + string.capwords(status))) 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

我想獲取當前的時間來不斷更新標籤和呼叫天氣API發生大約每5分鐘。任何幫助是極大的讚賞!

+0

你試圖使用QTimer?如果您提供所有必需的進口工作示例,我會盡力幫助您。 – Luchko

回答

3

的更新週期要實現的代碼,我們將做到以下幾點:

  1. 要更新我們使用一個計時器的時間。
  2. 要獲取天氣數據,我們使用pyowm庫。
  3. 獲取天氣的任務可以阻止GUI的主線程,因此我們將創建一個線程。
  4. 在線程中,我們將創建一個信號來存儲天氣信息並通過updateTemp插槽將其連接到主線程。

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent=parent) 
     self.setupUi(self) 
     timerTime = QtCore.QTimer(self) 
     timerTime.timeout.connect(self.updateDate) 
     timerTime.start(1000) 
     self.pyowm = PyownThread(self) 
     self.pyowm.tempSignal.connect(self.updateTemp) 
     self.pyowm.start() 

    def updateDate(self): 
     date = QtCore.QDateTime.currentDateTime() 
     self.Date.setText("Today is " + date.toString("ddd MMMM d yyyy")) 
     self.Time.setText("It is currently " + date.toString("hh:mm:ss ap")) 

    def updateTemp(self, temp): 
     self.Weather.setText("New York City temperature:" + str(temp['temp']) + " \u00B0C") 

主題:

class PyownThread(QtCore.QThread): 
    tempSignal = QtCore.pyqtSignal(dict) 
    def __init__(self, parent=None): 
     super(PyownThread, self).__init__(parent=parent) 
     self.owm = pyowm.OWM('1589dbcc0e9608e5b70f0ede23e757c8') 


    def run(self): 
     while True: 
      observation = self.owm.weather_at_place('New York,us') 
      w = observation.get_weather() 
      ctemp = w.get_temperature('celsius') 
      self.tempSignal.emit(ctemp) 
      self.sleep(5*60) 

關於這個問題:可以解釋高清retranslateUi的確切目的(個體經營,主窗口)?

這可以翻譯成多種語言,例如,可以爲說英語,西班牙語,德語等的聽衆使用相同的代碼。出於您的目的,這是沒有必要的。

完整代碼:

from PyQt5 import QtWidgets, QtGui, QtCore 
import pyowm 


class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("Tom") 
     MainWindow.setWindowModality(QtCore.Qt.NonModal) 
     MainWindow.resize(800, 600) 
     MainWindow.setAutoFillBackground(False) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) 
     self.verticalLayout.setObjectName("verticalLayout") 
     self.Date = QtWidgets.QLabel(self.centralwidget) 
     font = QtGui.QFont() 
     font.setPointSize(18) 
     self.Date.setFont(font) 
     self.Date.setAlignment(QtCore.Qt.AlignCenter) 
     self.Date.setObjectName("Date") 
     self.verticalLayout.addWidget(self.Date) 
     self.Time = QtWidgets.QLabel(self.centralwidget) 

     self.verticalLayout.addWidget(self.Time) 
     self.Weather = QtWidgets.QLabel(self.centralwidget) 
     self.Weather.setAlignment(QtCore.Qt.AlignCenter) 
     self.Weather.setWordWrap(False) 
     self.Weather.setObjectName("Weather") 
     self.verticalLayout.addWidget(self.Weather) 
     spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem) 
     spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem1) 
     spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem2) 
     spacerItem3 = QtWidgets.QSpacerItem(771, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem3) 
     spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem4) 
     spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 
     self.verticalLayout.addItem(spacerItem5) 
     MainWindow.setCentralWidget(self.centralwidget) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 


    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("Tom", "Tom")) 
     self.Date.setText(_translate("Tom", "Today is ")) 
     self.Time.setText(_translate("Tom", "It is currently ")) 
     self.Weather.setText(_translate("Tom", "New York City")) 


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent=parent) 
     self.setupUi(self) 
     timerTime = QtCore.QTimer(self) 
     timerTime.timeout.connect(self.updateDate) 
     timerTime.start(1000) 
     self.pyowm = PyownThread(self) 
     self.pyowm.tempSignal.connect(self.updateTemp) 
     self.pyowm.start() 

    def updateDate(self): 
     date = QtCore.QDateTime.currentDateTime() 
     self.Date.setText("Today is " + date.toString("ddd MMMM d yyyy")) 
     self.Time.setText("It is currently " + date.toString("hh:mm:ss ap")) 

    def updateTemp(self, temp): 
     self.Weather.setText("New York City temperature:" + str(temp['temp']) + " \u00B0C") 


class PyownThread(QtCore.QThread): 
    tempSignal = QtCore.pyqtSignal(dict) 
    def __init__(self, parent=None): 
     super(PyownThread, self).__init__(parent=parent) 
     self.owm = pyowm.OWM('1589dbcc0e9608e5b70f0ede23e757c8') 

    def run(self): 
     while True: 
      observation = self.owm.weather_at_place('New York,us') 
      w = observation.get_weather() 
      ctemp = w.get_temperature('celsius') 
      self.tempSignal.emit(ctemp) 
      QtCore.QThread.sleep(5*60) 



if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    w = MainWindow() 
    w.show() 
    sys.exit(app.exec_()) 

enter image description here

+0

非常感謝你,這真的幫助我瞭解計時器如何工作來更新一切! –

1

這是一個應該幫助你的小實例。 QTimer用於定期呼叫update_labelTime功能。

import sys 
from PyQt5.QtCore import QTimer, QTime 
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel 

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

     self.labelTime = QLabel() 
     self.update_labelTime() 
     self.setCentralWidget(self.labelTime) 

     self.timer = QTimer() 
     self.timer.timeout.connect(self.update_labelTime) 
     self.timer.start(1000) # repeat self.update_labelTime every 1 sec 

    def update_labelTime(self): 

     time_str = "Current time: {0}".format(QTime.currentTime().toString()) 
     self.labelTime.setText(time_str) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = MyApp() 
    window.show() 
    sys.exit(app.exec_()) 

P.S.不要忘記改變timer.start通話