当前位置: 首页 > news >正文

PyQt6实例_消息工具_使用与完整代码分享

目录

使用

每日消息

全局查询

更新数据库

代码

数据库表创建

代码-数据库相关操作

代码-界面与操作逻辑

视频


使用

工具有三个面板:每日消息、全局查询、更新数据库

“每日消息”和“全局查询”,数据源:同花顺7x24小时快讯

“更新数据库”,更新的数据源除“同花顺7x24小时快讯”,还有一些其他的数据源,这些数据没有并入每日消息和全局查询里,在本工具中只做了更新功能。本文会分享完整代码,大家要把多数据源合并到一起查询的,可自行更改。

每日消息

1 选择某个日期,下面列表中将显示该日期的快讯

2 数据库所包含快讯的时间区间

3 可以选择条件,筛选内容

4 左侧列表单机某行,会在右侧显现该信息内容 

全局查询

1 全局查询,查询范围不局限在某日,而是根据条件在整个数据库中查询。未避免返回数据量太大,程序要求必须有查询条件。 

2 左侧列表单机某行,会在右侧显现该信息内容 

更新数据库

点击更新按钮,会更新相应的数据表 

代码

数据库表创建

本文使用的数据库为PostgreSQL

t_ths7x24msg 存储 同花顺7x24小时快讯

create table t_ths7x24msg(
time_obj timestamp,
id varchar,
seq varchar,
title varchar,
digest text,
url varchar,
tag varchar,
ctime varchar,
rtime varchar,
source varchar,
picUrl varchar,
short text,
stock varchar[],
field varchar[],
tagInfo varchar[],
nature varchar,
import varchar,
time_str varchar
)

t_thsfinancemsg 存储同花顺财经资讯 

 create table t_thsfinancemsg(
belong_type varchar,
hash_code varchar,
time_obj timestamp,
timestamp_str varchar,
title varchar,
url varchar,
time_str varchar
)

代码-数据库相关操作

import psycopg2def connect_db():try:conn = psycopg2.connect(database='db_stock',user='postgres',password='',host='127.0.0.1',port=5432)except Exception as e:print(f'connection failed。{e}')else:return connpass

连接数据库

def query_duration_timestamp():sql_str = '''select min(time_obj),max(time_obj) from t_ths7x24msg;'''conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchone()cur.close()conn.close()return resdef query_max_timestamp():sql_str = '''select max(time_obj) from t_ths7x24msg;'''conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchone()cur.close()conn.close()return respass
def query_date_by_duration(left,right):sql_str = f'''select id,time_str,title,short,digest,url,stock,field,tagInfo from t_ths7x24msg where time_obj>=\'{left}\' and time_obj<=\'{right}\';'''conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchall()cur.close()conn.close()return respassdef query_filters_in_all():sql_str = '''select stock,field,tagInfo from t_ths7x24msg;'''conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchall()cur.close()conn.close()return respassdef query_data_by_query(where_str):sql_str = f'''select id,time_str,title,short,digest,url,stock,field,tagInfo from t_ths7x24msg where {where_str};'''conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchall()cur.close()conn.close()return respassdef query_max_timestamp_in_one_belongtype(belong_type:str):sql_str = f"""select max(time_obj) from t_thsfinancemsg where belong_type=\'{belong_type}\';"""conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchone()cur.close()conn.close()return resdef query_hashcode_in_maxtimestamp(time_str:str,belong_type:str):sql_str = f"""select hash_code from t_thsfinancemsg where belong_type=\'{belong_type}\' and time_obj>=\'{time_str}\';"""conn = connect_db()cur = conn.cursor()cur.execute(sql_str)res = cur.fetchall()cur.close()conn.close()return res

代码-界面与操作逻辑

class NewsWidget(QWidget):ONEDAY_TAB = '每日消息'QUERY_TAB = '全局查询'UPDATE_TAB = '更新数据库'def __init__(self):super().__init__()self.setWindowTitle('消息工具')self.setMinimumSize(QSize(1200,800))self.tab_index_dict = {}self.tabs = QTabWidget()self.tabs.tabBarClicked.connect(self.tabs_tabBarClicked)# tab1 startwidget_tab1 = QWidget()self.label_title = QLabel('XXXX-XX-XX', alignment=Qt.AlignmentFlag.AlignHCenter)self.label_title.setStyleSheet("font-size:28px;color:#CC2EFA;")label00 = QLabel('切换日期')self.dateedit = QDateEdit()self.dateedit.setDisplayFormat('yyyy-MM-dd')self.dateedit.userDateChanged.connect(self.dateedit_userDateChanged)self.label_duration = QLabel('从 开始 到 结束')self.label_duration.setMinimumWidth(300)label01 = QLabel('股票',alignment=Qt.AlignmentFlag.AlignRight)self.combo_stock = QComboBox()label02 = QLabel('概念',alignment=Qt.AlignmentFlag.AlignRight)self.combo_field = QComboBox()label03 = QLabel('标记',alignment=Qt.AlignmentFlag.AlignRight)self.combo_tag = QComboBox()btn1_query = QPushButton('查询',clicked=self.btn1_query_clicked)btn1_reset = QPushButton('重置',clicked=self.btn1_reset_clicked)layout03 = QHBoxLayout()layout03.addStretch(1)layout03.addWidget(btn1_query)layout03.addWidget(btn1_reset)layout03.addStretch(1)layout00 = QHBoxLayout()layout00.addWidget(label01)layout00.addWidget(self.combo_stock)layout00.addWidget(label02)layout00.addWidget(self.combo_field)layout00.addWidget(label03)layout00.addWidget(self.combo_tag)groupbox = QGroupBox('筛选')groupbox.setLayout(layout00)layout01 = QHBoxLayout()layout01.addStretch(1)layout01.addWidget(label00)layout01.addWidget(self.dateedit)layout01.addWidget(self.label_duration)layout01.addStretch(1)layout02 = QVBoxLayout()layout02.addWidget(self.label_title)layout02.addLayout(layout01)layout02.addWidget(groupbox)layout02.addLayout(layout03)widget_tab1.setLayout(layout02)tab_index = self.tabs.addTab(widget_tab1,self.ONEDAY_TAB)self.tab_index_dict[tab_index] = self.ONEDAY_TAB# tab1 end# tab2 startwidget_tab2 = QWidget()label11 = QLabel('股票',alignment=Qt.AlignmentFlag.AlignRight)self.combo2_stock = QComboBox()label12 = QLabel('概念',alignment=Qt.AlignmentFlag.AlignRight)self.combo2_field = QComboBox()label13 = QLabel('标记',alignment=Qt.AlignmentFlag.AlignRight)self.combo2_tag = QComboBox()label14 = QLabel('模糊查询')self.lineedit2_query = QLineEdit()self.btn2_query = QPushButton('查询',clicked=self.btn2_query_clicked)layout11 = QHBoxLayout()layout11.addWidget(label11)layout11.addWidget(self.combo2_stock)layout11.addWidget(label12)layout11.addWidget(self.combo2_field)layout11.addWidget(label13)layout11.addWidget(self.combo2_tag)layout12 = QHBoxLayout()layout12.addWidget(label14)layout12.addWidget(self.lineedit2_query)layout13 = QHBoxLayout()layout13.addStretch(1)layout13.addWidget(self.btn2_query)layout13.addStretch(1)layout14 = QVBoxLayout()layout14.addLayout(layout11)layout14.addLayout(layout12)layout14.addLayout(layout13)widget_tab2.setLayout(layout14)tab_index = self.tabs.addTab(widget_tab2,self.QUERY_TAB)self.tab_index_dict[tab_index] = self.QUERY_TAB# tab2 end# tab3 startwidget_tab3 = QWidget()label30 = QLabel('同花顺7x24小时:')self.btn3_update = QPushButton('更新-同花顺7x24小时',clicked=lambda :self.btn3_update_clicked('ths7x24',self.btn3_update))layout22 = QGridLayout()layout22.addWidget(label30, 0, 0, 1,1)layout22.addWidget(self.btn3_update, 0, 1, 1,1)label31 = QLabel('同花顺-滚动期货:')self.btn3_update_gdqh = QPushButton('更新-滚动期货',clicked=lambda :self.btn3_update_clicked('ths_gdqh',self.btn3_update_gdqh))layout23 = QGridLayout()layout23.addWidget(label31, 0, 0, 1,1)layout23.addWidget(self.btn3_update_gdqh, 0, 1, 1,1)label32 = QLabel('同花顺-期市要闻')self.btn3_update_qsyw = QPushButton('更新-期市要闻',clicked=lambda :self.btn3_update_clicked('ths_qsyw',self.btn3_update_qsyw))layout22.addWidget(label32, 1, 0, 1,1)layout22.addWidget(self.btn3_update_qsyw, 1, 1, 1,1)label33 = QLabel('同花顺-商品期货')self.btn3_update_spqh = QPushButton('更新-商品期货', clicked=lambda: self.btn3_update_clicked('ths_spqh',self.btn3_update_spqh))layout23.addWidget(label33, 1, 0, 1,1)layout23.addWidget(self.btn3_update_spqh, 1, 1, 1,1)label34 = QLabel('同花顺-现货市场')self.btn3_update_xhsc = QPushButton('更新-现货市场', clicked=lambda: self.btn3_update_clicked('ths_xhsc',self.btn3_update_xhsc))layout22.addWidget(label34, 2, 0, 1,1)layout22.addWidget(self.btn3_update_xhsc, 2, 1,1, 1)label35 = QLabel('同花顺-财经要闻')self.btn3_update_cjyw = QPushButton('更新-财经要闻', clicked=lambda: self.btn3_update_clicked('ths_cjyw',self.btn3_update_cjyw))layout23.addWidget(label35, 2, 0, 1,1)layout23.addWidget(self.btn3_update_cjyw, 2, 1, 1,1)label36 = QLabel('同花顺-宏观经济')self.btn3_update_hgjj = QPushButton('更新-宏观经济', clicked=lambda: self.btn3_update_clicked('ths_hgjj',self.btn3_update_hgjj))layout22.addWidget(label36, 3, 0, 1,1)layout22.addWidget(self.btn3_update_hgjj, 3, 1, 1,1)label37 = QLabel('同花顺-产经新闻')self.btn3_update_cjxw = QPushButton('更新-产经新闻', clicked=lambda: self.btn3_update_clicked('ths_cjxw',self.btn3_update_cjxw))layout23.addWidget(label37, 3, 0, 1,1)layout23.addWidget(self.btn3_update_cjxw, 3, 1, 1,1)label38 = QLabel('同花顺-国际财经')self.btn3_update_gjcj = QPushButton('更新-国际财经', clicked=lambda: self.btn3_update_clicked('ths_gjcj',self.btn3_update_gjcj))layout22.addWidget(label38, 4, 0, 1,1)layout22.addWidget(self.btn3_update_gjcj, 4, 1,1, 1)label39 = QLabel('同花顺-金融市场')self.btn3_update_jrsc = QPushButton('更新-金融市场', clicked=lambda: self.btn3_update_clicked('ths_jrsc',self.btn3_update_jrsc))layout23.addWidget(label39, 4, 0,1, 1)layout23.addWidget(self.btn3_update_jrsc, 4, 1,1, 1)label40 = QLabel('同花顺-公司新闻')self.btn3_update_gsxw = QPushButton('更新-公司新闻', clicked=lambda: self.btn3_update_clicked('ths_gsxw',self.btn3_update_gsxw))layout22.addWidget(label40, 5, 0,1, 1)layout22.addWidget(self.btn3_update_gsxw, 5, 1,1, 1)label41 = QLabel('同花顺-区域经济')self.btn3_update_qyjj = QPushButton('更新-区域经济', clicked=lambda: self.btn3_update_clicked('ths_qyjj',self.btn3_update_qyjj))layout23.addWidget(label41, 5, 0,1, 1)layout23.addWidget(self.btn3_update_qyjj, 5, 1,1, 1)label42 = QLabel('同花顺-财经评论')self.btn3_update_cjpl = QPushButton('更新-财经评论', clicked=lambda: self.btn3_update_clicked('ths_cjpl',self.btn3_update_cjpl))layout22.addWidget(label42, 6, 0,1, 1)layout22.addWidget(self.btn3_update_cjpl, 6, 1,1, 1)label43 = QLabel('同花顺-财经人物')self.btn3_update_cjrw = QPushButton('更新-财经人物', clicked=lambda: self.btn3_update_clicked('ths_cjrw',self.btn3_update_cjrw))layout23.addWidget(label43, 6, 0,1, 1)layout23.addWidget(self.btn3_update_cjrw, 6, 1,1, 1)self.textedit3_log = QTextEdit()layout21 = QHBoxLayout()layout21.addLayout(layout22)layout21.addLayout(layout23)layout21.addWidget(self.textedit3_log)widget_tab3.setLayout(layout21)tab_index = self.tabs.addTab(widget_tab3,self.UPDATE_TAB)self.tab_index_dict[tab_index] = self.UPDATE_TAB# tab3 endself.label_num = QLabel('几条')self.table = QTableWidget()self.table.setColumnCount(7)self.table.setHorizontalHeaderLabels(['id','时间','title','short','stock','field','tag'])self.table.setWordWrap(True)self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)self.table.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)self.table.itemClicked.connect(self.table_itemClicked)label000 = QLabel('标题',alignment=Qt.AlignmentFlag.AlignRight)self.lineedit000_title = QLineEdit()label001 = QLabel('内容',alignment=Qt.AlignmentFlag.AlignRight)self.textedit000_content = QTextEdit()label002 = QLabel('原文链接',alignment=Qt.AlignmentFlag.AlignRight)self.lineedit002_url = QLineEdit()layout000 = QVBoxLayout()layout000.addWidget(self.label_num)layout000.addWidget(self.table)layout001 = QFormLayout()layout001.addRow(label000,self.lineedit000_title)layout001.addRow(label001,self.textedit000_content)layout001.addRow(label002,self.lineedit002_url)layout002 = QHBoxLayout()layout002.addLayout(layout000,3)layout002.addLayout(layout001,1)layout = QVBoxLayout()layout.addWidget(self.tabs,1)layout.addSpacing(10)layout.addLayout(layout002,3)self.setLayout(layout)self.open_init()passdef open_init(self):self.whole_df: pd.DataFrame = pd.DataFrame()self.whole_current_df: pd.DataFrame = pd.DataFrame()self.whole_ing_dialog = Noneself.please_select_str: str = '---请选择---'passdef tabs_tabBarClicked(self,tab_i:int):tab_name = self.tab_index_dict[tab_i]self.reset_below_content()self.open_tab_init(tab_name)passdef fill_table(self):if not self.whole_current_df.empty:df = self.whole_current_df.copy()df['o_date'] = pd.to_datetime(df['time_str'])df.sort_values(by='o_date',ascending=False,inplace=True)self.table.setRowCount(len(df))self.label_num.setText(f"共 {len(df)} 条")data_list = df.loc[:,['id','time_str','title','short','stock','field','tagInfo']].valuesfor r,rv in enumerate(data_list):for c,v in enumerate(rv):item = QTableWidgetItem(str(v))item.setTextAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)self.table.setItem(r,c,item)passself.table.resizeColumnToContents(2)passelse:self.table.setRowCount(0)passdef btn2_query_clicked(self):stock = self.combo2_stock.currentText()field = self.combo2_field.currentText()tag = self.combo2_tag.currentText()query_str = self.lineedit2_query.text()where_list = []if stock!=self.please_select_str:where_list.append(f' \'{stock}\'=any(stock) ')if field!=self.please_select_str:where_list.append(f' \'{field}\'=any(field) ')if tag!=self.please_select_str:where_list.append(f' \'{tag}\'=any(tagInfo) ')if len(query_str)>0:where_list.append(f' title=\'%{query_str}%\' ')passif where_list:where_str = ' and '.join(where_list)res = postgresql_utils.query_data_by_query(where_str)stock_list, field_list, tagInfo_list = self.res_trans_df(res)self.fill_table()passelse:QMessageBox.information(self,'提示','筛选条件不能为空',QMessageBox.StandardButton.Ok)passdef btn3_update_clicked(self,tar_msg:str,a0:QPushButton):self.progress = QProgressDialog('正在更新...', None, 0, 0, self)# self.progress.setWindowFlags(self.progress.windowFlags() & ~Qt.WindowType.WindowCloseButtonHint)self.progress.setWindowModality(Qt.WindowModality.WindowModal)# self.progress.setWindowModality(Qt.WindowModality.NonModal)self.progress.show()self.insert_textedit3_log(f'{a0.text()} 开始更新...')if tar_msg == 'ths7x24':res = postgresql_utils.query_max_timestamp()timestamp = int(res[0].timestamp())# print(timestamp)header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'}sql_str = '''insert into t_ths7x24msg (time_obj,id,seq,title,digest,url,tag,ctime,rtime,source,picUrl,short,stock,field,tagInfo,nature,import,time_str) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''res_data_list = []is_break = Falsefor i in range(1, 100):if is_break:breakurl = f'https://news.10jqka.com.cn/tapp/news/push/stock/?page={i}&tag=&track=website&pagesize=400'response = requests.get(url, headers=header)if response.status_code == 200:json_obj = json.loads(response.text)one_list = json_obj['data']['list']# print('one_list ',len(one_list))for one in one_list:ctime = one['ctime']if int(ctime)<timestamp:is_break = Truebreaktime_str = datetime.fromtimestamp(int(ctime)).strftime('%Y-%m-%d %H:%M:%S')stock = []for s in one['stock']:stock.append(s['name'])field = []for f in one['field']:field.append(f['name'])tagInfo = []for t in one['tagInfo']:tagInfo.append(t['name'])res_data_list.append((time_str,one['id'],one['seq'],one['title'],one['digest'],one['url'],one['tag'],one['ctime'],one['rtime'],one['source'],one['picUrl'],one['short'],stock,field,tagInfo,one['nature'],one['import'],time_str))passpasselse:print(f'requests失败,{response.status_code}')# print(i)passconn = postgresql_utils.connect_db()cur = conn.cursor()# print('res_data_list ',len(res_data_list))try:cur.executemany(sql_str, res_data_list)conn.commit()except:traceback.print_exc()conn.rollback()finally:cur.close()conn.close()elif tar_msg == 'ths_gdqh':# 滚动期货  https://goodsfu.10jqka.com.cn/qhgd_list/index_1.shtmlurl = 'https://goodsfu.10jqka.com.cn/qhgd_list/'belong_type = '滚动期货'self.get_data_from_html(url,belong_type)passelif tar_msg == 'ths_qsyw':# 期市要闻url = 'http://goodsfu.10jqka.com.cn/futuresnews_list/'belong_type = '期市要闻'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_spqh':# 商品期货url = 'http://goodsfu.10jqka.com.cn/spqh_list/'belong_type = '商品期货'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_xhsc':# 现货市场url = 'http://goodsfu.10jqka.com.cn/xhsc_list/'belong_type = '现货市场'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_cjyw':# 财经要闻url = 'https://news.10jqka.com.cn/today_list/'belong_type = '财经要闻'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_hgjj':# 宏观经济url = 'http://news.10jqka.com.cn/cjzx_list/'belong_type = '宏观经济'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_cjxw':# 产经新闻url = 'http://news.10jqka.com.cn/cjkx_list/'belong_type = '产经新闻'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_gjcj':# 国际财经url = 'http://news.10jqka.com.cn/guojicj_list/'belong_type = '国际财经'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_jrsc':# 金融市场url = 'http://news.10jqka.com.cn/jrsc_list/'belong_type = '金融市场'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_gsxw':# 公司新闻url = 'http://news.10jqka.com.cn/fssgsxw_list/'belong_type = '公司新闻'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_qyjj':# 区域经济url = 'http://news.10jqka.com.cn/region_list/'belong_type = '区域经济'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_cjpl':# 财经评论url = 'http://news.10jqka.com.cn/fortune_list/'belong_type = '财经评论'self.get_data_from_html(url, belong_type)passelif tar_msg == 'ths_cjrw':# 财经人物url = 'http://news.10jqka.com.cn/cjrw_list/'belong_type = '财经人物'self.get_data_from_html(url, belong_type)passelse:QMessageBox.information(self,'提示',f"{tar_msg} 无更新业务",QMessageBox.StandardButton.Ok)returnself.progress.cancel()self.insert_textedit3_log(f'{a0.text()} 更新到当前最新')QMessageBox.information(self,'提示',f'{a0.text()} 更新到当前最新',QMessageBox.StandardButton.Ok)passdef btn1_query_clicked(self):self.lineedit000_title.clear()self.textedit000_content.clear()self.lineedit002_url.clear()stock = self.combo_stock.currentText()field = self.combo_field.currentText()tag = self.combo_tag.currentText()df = self.whole_df.copy()df = df.loc[(df['stock'].str.contains(stock) if stock!=self.please_select_str else True) & (df['field'].str.contains(field) if field!=self.please_select_str else True) & (df['tagInfo'].str.contains(tag) if tag!=self.please_select_str else True)]self.whole_current_df = df.copy()self.fill_table()passdef btn1_reset_clicked(self):self.combo_stock.setCurrentText(self.please_select_str)self.combo_field.setCurrentText(self.please_select_str)self.combo_tag.setCurrentText(self.please_select_str)self.lineedit000_title.clear()self.textedit000_content.clear()self.lineedit002_url.clear()self.whole_current_df = self.whole_df.copy()self.fill_table()passdef table_itemClicked(self,cur_item):cur_row = cur_item.row()id = self.table.item(cur_row, 0).text()df = self.whole_current_df.copy()df = df.loc[df['id'] == id]if df.empty:QMessageBox.information(self,'提示','数据不存在',QMessageBox.StandardButton.Ok)else:self.lineedit000_title.setText(df.iloc[0]['title'])self.textedit000_content.setText(df.iloc[0]['digest'])self.lineedit002_url.setText(df.iloc[0]['url'])passpassdef dateedit_userDateChanged(self,a0:QDate):date_str = a0.toString('yyyy-MM-dd')self.label_title.setText(date_str)self.fill_data_tab1()passdef fill_data_tab1(self):self.combo_stock.clear()self.combo_field.clear()self.combo_tag.clear()date_str = self.dateedit.dateTime().toString('yyyy-MM-dd')self.progress = QProgressDialog(f'正在查询{date_str}的数据...', None, 0, 0, self)self.progress.setWindowFlags(self.progress.windowFlags() & ~Qt.WindowType.WindowCloseButtonHint)self.progress.setWindowModality(Qt.WindowModality.WindowModal)# self.progress.setWindowModality(Qt.WindowModality.NonModal)self.progress.show()left = f'{date_str} 00:00:00'right = f'{date_str} 23:59:59'# id,time_str,title,short,digest,url,stock,field,tagInfores = postgresql_utils.query_date_by_duration(left, right)stock_list,field_list,tagInfo_list = self.res_trans_df(res)stock_list = list(set(stock_list))field_list = list(set(field_list))tagInfo_list = list(set(tagInfo_list))self.combo_stock.addItem(self.please_select_str)self.combo_field.addItem(self.please_select_str)self.combo_tag.addItem(self.please_select_str)self.combo_stock.addItems(stock_list)self.combo_field.addItems(field_list)self.combo_tag.addItems(tagInfo_list)self.fill_table()self.progress.cancel()passdef fill_data_tab2(self):self.combo2_stock.clear()self.combo2_field.clear()self.combo2_tag.clear()self.lineedit2_query.clear()res = postgresql_utils.query_filters_in_all()stock_list = []field_list = []tagInfo_list = []for item in res:stock_list.extend(item[0])field_list.extend(item[1])tagInfo_list.extend(item[2])stock_list = list(set(stock_list))field_list = list(set(field_list))tagInfo_list = list(set(tagInfo_list))self.combo2_stock.addItem(self.please_select_str)self.combo2_field.addItem(self.please_select_str)self.combo2_tag.addItem(self.please_select_str)self.combo2_stock.addItems(stock_list)self.combo2_field.addItems(field_list)self.combo2_tag.addItems(tagInfo_list)passdef get_data_from_html(self,url_str:str,belong_type:str):res = postgresql_utils.query_max_timestamp_in_one_belongtype(belong_type)time_str = res[0].strftime('%Y-%m-%d %H:%M:%S')res_hashs00 = postgresql_utils.query_hashcode_in_maxtimestamp(time_str,belong_type)res_hashs = []for item in res_hashs00[0]:res_hashs.append(item)header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'}res_data_list = []is_break = Falsetry:for i in range(1,21):if is_break:breaktarget_url = f"{url_str}index_{i}.shtml"response = requests.get(target_url,headers=header)if response.status_code == 200:soup = BeautifulSoup(response.text, 'lxml')elements = soup.select('.list-con')list_con = elements[0]li_list = list_con.find_all('li')data_list = []for li in li_list:a = li.find('span').find('a')url = a.get('href')title = a.get('title')span = li.find('span').find('span')time_str = span.string# 信息的月份与 实际时间月份比较,如果实际时间月份比信息月份小,说明实际时间已经进入下一年,信息是上一年的信息month_str = time_str.split('月')[0]now_month = datetime.now().monthif now_month<int(month_str):year_int = datetime.now().year - 1else:year_int = datetime.now().yeartimestamp = datetime.strptime(str(year_int) + '年' + time_str, '%Y年%m月%d日 %H:%M').timestamp()timestamp_str = str(int(timestamp))time_str00 = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')pre_hash_str = f"{timestamp_str}{title}".encode('utf-8')hash_obj = hashlib.sha256(pre_hash_str)hash_val = hash_obj.hexdigest()# print(hash_val)if hash_val in res_hashs:is_break = Truebreakdata_list.append([belong_type,hash_val,time_str00,timestamp_str,title,url,time_str00])res_data_list.extend(data_list)passelse:print(f"{target_url},请求返回码 {response.status_code}")except:traceback.print_exc()self.insert_textedit3_log(traceback.format_exc())passsql_str = '''insert into t_thsfinancemsg (belong_type,hash_code,time_obj,timestamp_str,title,url,time_str) values (%s,%s,%s,%s,%s,%s,%s);'''conn = postgresql_utils.connect_db()cur = conn.cursor()try:cur.executemany(sql_str, res_data_list)conn.commit()passexcept:traceback.print_exc()conn.rollback()passfinally:cur.close()conn.close()passdef res_trans_df(self,res)->tuple:data_list = []stock_list = []field_list = []tagInfo_list = []for item in res:stock_list.extend(item[6])field_list.extend(item[7])tagInfo_list.extend(item[8])data_list.append([item[0],  # iditem[1],  # time_stritem[2],  # titleitem[3],  # shortitem[4],  # digestitem[5],  # url','.join(item[6]),  # stock','.join(item[7]),  # field','.join(item[8])  # tagInfo])df = pd.DataFrame(columns=['id', 'time_str', 'title', 'short', 'digest', 'url', 'stock', 'field', 'tagInfo'],data=data_list)self.whole_df = df.copy()self.whole_current_df = df.copy()return stock_list,field_list,tagInfo_listdef reset_below_content(self):self.table.setRowCount(0)self.lineedit000_title.clear()self.textedit000_content.clear()self.lineedit002_url.clear()passdef open_tab_init(self,tab_name:str):if tab_name == self.ONEDAY_TAB:res = postgresql_utils.query_duration_timestamp()self.dateedit.setDate(res[1])self.label_duration.setText(f"从 {str(res[0])} 到 {res[1]}")self.fill_data_tab1()passelif tab_name == self.QUERY_TAB:self.fill_data_tab2()passelif tab_name == self.UPDATE_TAB:passelse:QMessageBox.information(self,'提示',f'{tab_name} 不存在',QMessageBox.StandardButton.Ok)passdef insert_textedit3_log(self,msg:str):self.textedit3_log.append(msg+'\n')pass

视频

PyQt6实例_消息工具_概述_哔哩哔哩_bilibili

相关文章:

  • 牛客:BM1 反转链表
  • 4.26 数据交互升级引入配置文件
  • JBoss Web 安全问题实战总结(Session / CSP / Host Header)
  • threejs 零基础学习day01
  • Tauri文件系统操作:桌面应用的核心能力(入门系列四)
  • 深入理解N皇后问题:从DFS到对角线优化
  • Linux | Mfgtools 修改单独只烧写 Uboot,内核,文件系统
  • 用python写一个相机选型的简易程序
  • 视觉大模型专栏导航
  • 可视化大屏开发前提了解
  • MySQL 分布式架构与实战:从单机到集群的进阶之路(附生产级架构设计)
  • Spring AI Alibaba - Milvus 初体验,实现知识库效果
  • QT6 源(51)篇一:存储 c 语言字符串的类 QByteArray 的使用举例,采用 ascii 码字符集。函detach()的调用时机,
  • 【SSH 端口转发】通过SSH端口转发实现访问远程服务器的 tensorboard
  • 学习笔记——《Java面向对象程序设计》-内部类、匿名类、异常类
  • rsync+ Rocky Linux 主机同步部署实战
  • 4月26日星期六今日早报简报微语报早读
  • 创建可执行 JAR 文件
  • 如何在 Conda 环境中降级 Python 版本:详细指南
  • MyBatis 插件开发的完整详细例子
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • 马上评丨发钱奖励结婚,支持婚育就该系统性发力
  • 戴昕谈隐私、数据、声誉与法律现实主义
  • 一季度规模以上工业企业利润由降转增,国家统计局解读
  • 俄联邦安全局:俄军高级官员汽车爆炸案嫌疑人已被捕
  • 剪纸纹样“流动”在水乡,谁不忆江南