[英]PyQt5: Updating Label?
I'm currently having trouble updating labels continuously, I have tried my different ways but either nothing happens or the program stops working. 我目前无法连续更新标签,我尝试了不同的方法但是没有任何反应或程序停止工作。 I have attached below part of my code.
我附上了部分代码。 Also I was hoping someone could explain exactly the purpose of def retranslateUi(self, MainWindow):
我也希望有人能够解释def retranslateUi(self,MainWindow)的目的:
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_())
I want the label that gets the current time to keep updating and the call to weather api to happen about every 5 min. 我希望获得当前时间的标签能够不断更新,并且每隔5分钟就会调用天气api。 Any help is greatly appreciated!
任何帮助是极大的赞赏!
To implement the code we will do the following: 要实现代码,我们将执行以下操作:
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")
Thread: 线:
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)
About the question: could explain exactly the purpose of def retranslateUi(self, MainWindow)? 关于这个问题: 可以准确解释def retranslateUi(self,MainWindow)的目的吗?
This serves to make translatable into several languages, for example the same code could be used for an audience that speaks English, Spanish, German, etc. For your purposes it is not necessary. 这可以翻译成多种语言,例如,相同的代码可以用于说英语,西班牙语,德语等的听众。对于您的目的,没有必要。
Complete code: 完整代码:
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_())
Here is a small working example that should help you. 这是一个应该帮助你的小工作示例。
QTimer
is used for periodical calling the update_labelTime
function. 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_())
PS Don't forget to change the updating period in timer.start
call PS不要忘记在
timer.start
调用中更改更新周期
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.