|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
main.py
- import sys
- import time
- import datetime
- import requests
- from PyQt5 import uic
- from PyQt5.QtWidgets import *
- from PyQt5.QtCore import *
- class Worker(QThread):
- # 这里返回 Date 类型,该如何写?
- finishSignal = pyqtSignal()
- def __init__(self, timeNow,timeMiaosha,parent=None):
- super(Worker, self).__init__(parent)
-
- def run(self):
- time.sleep(0.1)
- #获得北京时间
- try:
- url = 'htt_ps://beijing-time.org/' #这里我不能发布链接,请自行修改一些
- request_result = requests.get(url=url)
- if request_result.status_code == 200:
- headers = request_result.headers
- net_date = headers.get("date")
- gmt_time = time.strptime(net_date[5:25], "%d %b %Y %H:%M:%S")
- bj_timestamp = int(time.mktime(gmt_time) + 8 * 60 * 60)
- #return datetime.datetime.fromtimestamp(bj_timestamp)
- self.finishSignal.emit(datetime.datetime.fromtimestamp(bj_timestamp))
- except Exception as exc:
- #return datetime.datetime.now()
- self.finishSignal.emit(datetime.datetime.now())
- class MyWindow(QWidget):
- # 初始化
- def __init__(self):
- super().__init__()
- self.load_ui()
-
- def load_ui(self):
- #读取ui界面
- self.ui = uic.loadUi("main.ui")
- # 绑定北京和本地时间框
- # hh:mm:ss.zzz
- self.dateTimeBeijing = self.ui.dateTimeBeijing
- self.dateTimeBeijing.setDisplayFormat("yyyy-MM-dd HH:mm:ss.zzz")
- self.dateTimeCur = self.ui.dateTimeCur
- self.dateTimeCur.setDisplayFormat("yyyy-MM-dd HH:mm:ss.zzz")
- #设置1个定时器,用于更新本地时间
- timerNow = QTimer(self)
- timerNow.timeout.connect(self.timeNow)
- timerNow.start()
- # 这里出错
- self.thread = Worker()
- self.thread.sig.connect(self.timeBJ)
- self.thread.start()
- #显示当前时间
- def timeNow(self):
- self.cur_time = QDateTime.currentDateTime()
- self.dateTimeCur.setDateTime(self.cur_time)
- #显示当前的北京时间
- def timeBJ(self,msg):
- self.dateTimeBeijing.setDateTime(msg)
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- window = MyWindow()
- window.ui.show()
- sys.exit(app.exec())
复制代码
main.ui
- <?xml version="1.0" encoding="UTF-8"?>
- <ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>289</width>
- <height>108</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <family>Arial</family>
- </font>
- </property>
- <property name="windowTitle">
- <string>测试</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="2" column="0">
- <widget class="QLabel" name="labelCur">
- <property name="text">
- <string>本机时间</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QDateTimeEdit" name="dateTimeCur">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- <property name="buttonSymbols">
- <enum>QAbstractSpinBox::NoButtons</enum>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QDateTimeEdit" name="dateTimeBeijing">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- <property name="buttonSymbols">
- <enum>QAbstractSpinBox::NoButtons</enum>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="labelBeijing">
- <property name="text">
- <string>北京时间</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>dateTimeBeijing</tabstop>
- <tabstop>dateTimeCur</tabstop>
- </tabstops>
- <resources/>
- <connections/>
- </ui>
复制代码
请教,多线程传递datetime,却一直出错。该如何修改代码呢(信号和槽没有掌握哎)?
在这段代码中,错误可能源自两个主要原因:
1. pyqtSignal() 对象的声明没有明确参数类型。信号可以传递任何类型的数据,包括 datetime ,只需在 pyqtSignal() 中指定类型即可。
2. Worker 线程的初始化中没有接受任何参数,而在实例化 Worker 的时候并没有提供所需的参数。
所以,我们可以这样修改你的代码:
- # 在 Worker 类定义中添加 datetime 类型的信号
- class Worker(QThread):
- finishSignal = pyqtSignal(datetime)
- def __init__(self, parent=None):
- super(Worker, self).__init__(parent)
- def run(self):
- time.sleep(0.1)
- try:
- url = 'htt_ps://beijing-time.org/' #这里我不能发布链接,请自行修改一些
- request_result = requests.get(url=url)
- if request_result.status_code == 200:
- headers = request_result.headers
- net_date = headers.get("date")
- gmt_time = time.strptime(net_date[5:25], "%d %b %Y %H:%M:%S")
- bj_timestamp = int(time.mktime(gmt_time) + 8 * 60 * 60)
- self.finishSignal.emit(datetime.datetime.fromtimestamp(bj_timestamp))
- except Exception as exc:
- self.finishSignal.emit(datetime.datetime.now())
复制代码
在 MyWindow 类中,连接信号和槽:
- class MyWindow(QWidget):
- def __init__(self):
- super().__init__()
- self.load_ui()
- self.thread = Worker()
- self.thread.finishSignal.connect(self.timeBJ)
- self.thread.start()
- def timeBJ(self, time_bj):
- self.dateTimeBeijing.setDateTime(QDateTime(time_bj))
复制代码
修改后的代码首先确保了 Worker 类中的信号是 datetime 类型,并且在 MyWindow 类中正确地连接了 finishSignal 信号和 timeBJ 方法。 timeBJ 方法接受 datetime 类型的参数,将其转换为 QDateTime 类型并设置到 dateTimeBeijing 控件中。
请注意,你需要处理异常的情况,当请求北京时间失败时,应将问题报告给用户,而不是简单地用本地时间代替。此外,这个方法获取北京时间可能不完全准确,因为它依赖于服务器返回的 "Date" 头部信息,并假设服务器位于 GMT 时区。如果你需要准确的北京时间,可能需要使用一个提供这项服务的 API。
|
|