2017-04-20 190 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通话