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 psycopg2

def 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 conn
    pass

连接数据库

复制代码
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 res

def 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 res
    pass
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 res
    pass

def 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 res
    pass

def 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 res
    pass

def 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 res

def 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 start
        widget_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 start
        widget_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 start
        widget_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 end

        self.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()
        pass
    def open_init(self):
        self.whole_df: pd.DataFrame = pd.DataFrame()
        self.whole_current_df: pd.DataFrame = pd.DataFrame()
        self.whole_ing_dialog = None
        self.please_select_str: str = '---请选择---'
        pass
    def tabs_tabBarClicked(self,tab_i:int):
        tab_name = self.tab_index_dict[tab_i]
        self.reset_below_content()
        self.open_tab_init(tab_name)
        pass
    def 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']].values
            for 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)
                    pass
            self.table.resizeColumnToContents(2)
            pass
        else:
            self.table.setRowCount(0)
        pass
    def 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}%\' ')
            pass
        if 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()
            pass
        else:
            QMessageBox.information(self,'提示','筛选条件不能为空',QMessageBox.StandardButton.Ok)
        pass
    def 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 = False
            for i in range(1, 100):
                if is_break:
                    break
                url = 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 = True
                            break
                        time_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
                        ))
                        pass
                    pass
                else:
                    print(f'requests失败,{response.status_code}')
                # print(i)
                pass
            conn = 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.shtml
            url = 'https://goodsfu.10jqka.com.cn/qhgd_list/'
            belong_type = '滚动期货'
            self.get_data_from_html(url,belong_type)
            pass
        elif tar_msg == 'ths_qsyw':
            # 期市要闻
            url = 'http://goodsfu.10jqka.com.cn/futuresnews_list/'
            belong_type = '期市要闻'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_spqh':
            # 商品期货
            url = 'http://goodsfu.10jqka.com.cn/spqh_list/'
            belong_type = '商品期货'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_xhsc':
            # 现货市场
            url = 'http://goodsfu.10jqka.com.cn/xhsc_list/'
            belong_type = '现货市场'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_cjyw':
            # 财经要闻
            url = 'https://news.10jqka.com.cn/today_list/'
            belong_type = '财经要闻'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_hgjj':
            # 宏观经济
            url = 'http://news.10jqka.com.cn/cjzx_list/'
            belong_type = '宏观经济'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_cjxw':
            # 产经新闻
            url = 'http://news.10jqka.com.cn/cjkx_list/'
            belong_type = '产经新闻'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_gjcj':
            # 国际财经
            url = 'http://news.10jqka.com.cn/guojicj_list/'
            belong_type = '国际财经'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_jrsc':
            # 金融市场
            url = 'http://news.10jqka.com.cn/jrsc_list/'
            belong_type = '金融市场'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_gsxw':
            # 公司新闻
            url = 'http://news.10jqka.com.cn/fssgsxw_list/'
            belong_type = '公司新闻'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_qyjj':
            # 区域经济
            url = 'http://news.10jqka.com.cn/region_list/'
            belong_type = '区域经济'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_cjpl':
            # 财经评论
            url = 'http://news.10jqka.com.cn/fortune_list/'
            belong_type = '财经评论'
            self.get_data_from_html(url, belong_type)
            pass
        elif tar_msg == 'ths_cjrw':
            # 财经人物
            url = 'http://news.10jqka.com.cn/cjrw_list/'
            belong_type = '财经人物'
            self.get_data_from_html(url, belong_type)
            pass
        else:
            QMessageBox.information(self,'提示',f"{tar_msg} 无更新业务",QMessageBox.StandardButton.Ok)
            return
        self.progress.cancel()
        self.insert_textedit3_log(f'{a0.text()} 更新到当前最新')
        QMessageBox.information(self,'提示',f'{a0.text()} 更新到当前最新',QMessageBox.StandardButton.Ok)
        pass
    def 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()
        pass
    def 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()
        pass
    def 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'])
            pass
        pass
    def dateedit_userDateChanged(self,a0:QDate):
        date_str = a0.toString('yyyy-MM-dd')
        self.label_title.setText(date_str)
        self.fill_data_tab1()
        pass
    def 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,tagInfo
        res = 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()
        pass
    def 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)
        pass

    def 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 = False
        try:
            for i in range(1,21):
                if is_break:
                    break
                target_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().month
                        if now_month<int(month_str):
                            year_int = datetime.now().year - 1
                        else:
                            year_int = datetime.now().year
                        timestamp = 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 = True
                            break
                        data_list.append([
                            belong_type,
                            hash_val,
                            time_str00,
                            timestamp_str,
                            title,
                            url,
                            time_str00
                        ])
                    res_data_list.extend(data_list)
                    pass
                else:
                    print(f"{target_url},请求返回码 {response.status_code}")
        except:
            traceback.print_exc()
            self.insert_textedit3_log(traceback.format_exc())
            pass

        sql_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()
            pass
        except:
            traceback.print_exc()
            conn.rollback()
            pass
        finally:
            cur.close()
            conn.close()
        pass
    def 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],  # id
                item[1],  # time_str
                item[2],  # title
                item[3],  # short
                item[4],  # digest
                item[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_list
    def reset_below_content(self):
        self.table.setRowCount(0)
        self.lineedit000_title.clear()
        self.textedit000_content.clear()
        self.lineedit002_url.clear()
        pass
    def 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()
            pass
        elif tab_name == self.QUERY_TAB:
            self.fill_data_tab2()
            pass
        elif tab_name == self.UPDATE_TAB:
            pass
        else:
            QMessageBox.information(self,'提示',f'{tab_name} 不存在',QMessageBox.StandardButton.Ok)
        pass
    def insert_textedit3_log(self,msg:str):
        self.textedit3_log.append(msg+'\n')
        pass

视频

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

相关推荐
程序猿与金融与科技17 小时前
PyQt6基础_pyqtgraph_折线图with缩放调节
python·pyqt6·pyqtgraph
程序猿与金融与科技1 天前
PyQt6基础_QTableWidget
pyqt6
程序猿与金融与科技3 天前
PyQt6实例_pyqtgraph多曲线显示工具_代码分享
pyqt6·pyqtgraph·a股
程序猿与金融与科技18 天前
PyQt6实例_A股财报数据维护工具_解说并数据与完整代码分享
pyqt6·a股
程序猿与金融与科技24 天前
PyQt6实例_A股日数据维护工具_界面代码
pyqt6·a股日数据
程序猿与金融与科技1 个月前
PyQt6实例_批量下载pdf工具_exe使用方法
pyqt6
程序猿与金融与科技1 个月前
PyQt6实例_批量下载pdf工具_主线程启用线程池
pyqt6
程序猿与金融与科技1 个月前
PyQt6实例_批量下载pdf工具_线程池
pyqt6
Mistra丶3 个月前
A股微型低频套利交易-Java版本
java·量化交易·a股·自动交易·做t·套利