Files
tophux_scrape/__pycache__/db_viewer.cpython-38.pyc

165 lines
14 KiB
Plaintext
Raw Normal View History

U
<00>iL`<00>@s<>dZddlZddlZddlZddlZddlmZddlmZddlm Z m
Z
m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlm Z m!Z!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'Gdd <09>d e
<EFBFBD>Z(d
d <0B>Z)e*d kr<>e)<29>dS) ug
TopHub数据查看器 - PySide5界面应用程序
用于显示SQLite数据库中的TopHub抓取数据
<EFBFBD>N)<01>datetime)<01>logger)<16> QApplication<6F> QMainWindow<6F> QTableWidget<65>QTableWidgetItem<65> QVBoxLayout<75> QHBoxLayout<75>QWidget<65>QLabel<65> QLineEdit<69> QPushButton<6F> QComboBox<6F> QGroupBox<6F>
QStatusBar<EFBFBD>QMenuBar<61>QMenu<6E> QMessageBox<6F> QHeaderView<65>QAbstractItemView<65>QDialog<6F> QFormLayout<75> QTextEdit<69> QInputDialog)<03>Qt<51>QUrl<72>QTimer)<04>QAction<6F>QFont<6E>QIcon<6F>QDesktopServicescs<>eZdZdZ<03>fdd<03>Zdd<05>Zdd<07>Zdd <09>Zd
d <0B>Zd d <0A>Z dd<0F>Z
dd<11>Z dd<13>Z dd<15>Z dd<17>Zdd<19>Zdd<1B>Zdd<1D>Z<11>ZS)<1E>DatabaseVieweru*主窗口类用于显示数据库内容cspt<00><00><01>tj<03>tj<03>t<06><01>}tj<03>|d<01>|_tj<03> |j<08>s\t
<EFBFBD> |dd|j<08><00><02>t <0C> d<04>|<00><0E>|<00><0F>dS)Nztophub_data.db<64>错误u数据库文件不存在: <20>)<10>super<65>__init__<5F>os<6F>path<74>dirname<6D>abspath<74>__file__<5F>join<69>db_path<74>existsr<00>critical<61>sys<79>exit<69>init_ui<75> load_data)<02>selfZ
script_dir<EFBFBD><01> __class__<5F><00>LC:\Users\xiaji\Documents\个人文件夹\夏骥\hothub的抓取\db_viewer.pyr%s

zDatabaseViewer.__init__cCs<>|<00>d<01>|<00>dddd<04>t<02>}|<00>|<01>t|<01>}td<05>}t|<03>}t<07>|_|j<08> d<06>|jj
<EFBFBD> |j <0C>|<04> td<07><01>|<04> |j<08>t<0F>|_|j<10>d<08>|jj<12> |j <0C>|<04> td <09><01>|<04> |j<10>td
<EFBFBD>|_|jj<15> |j<16>|<04> |j<14>td <0B>|_|jj<15> |j<18>|<04> |j<17>td <0C>|_|jj<15> |j<1A>|<04> |j<19>td <0A>|_|jj<15> |j<1C>|<04> |j<1B>|<02> |<03>td<0E>|_t|j<1D>|_td<0F>|_|j<1E> |j<1F>|<02> |j<1D>t <20>|_!|j!<21>"d<10>|j!<21>#ddddddg<06>|j!<21>$d<17>|j!<21>%t&j'<27>|j!<21>(t&j)<29>|j!<21>*d<17>|j!<21>+<2B>}|<05>,dt-j.<2E>|<05>,dt-j/<2F>|<05>,dt-j.<2E>|<05>,dt-j.<2E>|<05>,dt-j.<2E>|<05>,dt-j.<2E>|j!j0<6A> |j1<6A>|j!<21>2t3j4<6A>|j!j5<6A> |j6<6A>|<02> |j!<21>t7<74>|_8|<00>9|j8<6A>|<00>:<3A>dS)u初始化用户界面<E7958C>TopHub数据查看器<E79C8B>di<>i u搜索和筛选u输入搜索关键词...u搜索:<3A> 全部分类u分类:<3A> 刷新数据<E695B0>按关键字选中<E98089>删除选中项<E4B8AD>标记为感兴趣u 分类统计<E7BB9F> 暂无数据<E695B0>ZIDu标题u链接u分类u 来源日期u 感兴趣Trr#<00><00><00><00>N);<3B>setWindowTitle<6C> setGeometryr
<00>setCentralWidgetrrr r <00> search_edit<69>setPlaceholderText<78> textChanged<65>connect<63> filter_data<74> addWidgetr r<00>category_combo<62>addItem<65>currentTextChangedr Zrefresh_button<6F>clickedr2Zselect_by_keyword_button<6F>select_by_keywordZdelete_selected_button<6F>delete_selected_itemsZmark_interested_button<6F>mark_as_interestedZcategory_stats_groupZcategory_stats_layout<75>category_stats_labelr<00>table<6C>setColumnCount<6E>setHorizontalHeaderLabels<6C>setAlternatingRowColors<72>setSelectionBehaviorr<00>
SelectRows<EFBFBD>setEditTriggers<72>NoEditTriggers<72>setSortingEnabled<65>horizontalHeader<65>setSectionResizeModer<00>ResizeToContents<74>Stretch<63> cellClicked<65>on_cell_clicked<65>setContextMenuPolicyr<00>CustomContextMenu<6E>customContextMenuRequested<65>show_context_menur<00>
status_bar<EFBFBD> setStatusBar<61>create_menu_bar)r3Zcentral_widgetZ main_layoutZ filter_groupZ filter_layout<75>headerr6r6r7r1(sp

    
 
 
 
 

 
    
  zDatabaseViewer.init_uicCs<>|<00><00>}|<01>d<01>}td|<00>}|<03>d<03>|j<04>|j<06>|<02>|<03>td|<00>}|<04>d<05>|j<04>|j<08>|<02>|<04>|<01>d<06>}td|<00>}|j<04>|j <09>|<05>|<06>dS) u创建菜单栏u文件r;ZF5u退出zCtrl+Qu帮助<E5B8AE>关于N)
<EFBFBD>menuBar<61>addMenur<00> setShortcut<75> triggeredrKr2<00> addAction<6F>close<73>
show_about)r3ZmenubarZ file_menuZrefresh_actionZ exit_actionZ help_menuZ about_actionr6r6r7rk<00>s








zDatabaseViewer.create_menu_barc
Cs<00>zPt<00>|j<02>}|<01><03>}|<02>d<01>|<02><05>sFt<06>|dd<03>|<01><08>WdS|<02>d<05>|<02> <09>}|<01><08>|j
<EFBFBD> t |<03><01>t <0A>}i}t|<03>D<00>]J\}}|\}} }
} } } | r<>|<04>| <0B>|<05>| d<06>d|| <n|<05>dd<06>d|d<|j
<EFBFBD>|dtt|<08><01><01>|j
<EFBFBD>|dt| <09><01>t|
<EFBFBD>r |
nd <09>}|
<EFBFBD>r8|<0E>tj<16>|<0E>td d
tj<19><03>|j
<EFBFBD>|d |<0E>|j
<EFBFBD>|d t| <0B>r^| nd<08><01>|j
<EFBFBD>|d t| <0C><01>| dk<02>r<>dnd}t|<0F>}| dk<02>r<>|<10>tj<1A>|<10>td d
tj<19><03>|j
<EFBFBD>|d|<10>q<>|j<1B><1C>}|j<1B><1D>|j<1B>d<11>t|<04>D]}|j<1B>|<12><00>q<>|j<1B> |<11>}|dk<05>r.|j<1B>!|<13>|<00>"|<05>|j#<23>$dt |<03><01>d<13><03>Wn<>tj%k
<EFBFBD>r<>}z<t&<26>'dt|<14><01><00><02>t<06>|ddt|<14><01><00><02>|j#<23>$d<16>W5d}~XYn\t(k
<EFBFBD>r
}z<t&<26>'dt|<14><01><00><02>t<06>|ddt|<14><01><00><02>|j#<23>$d<16>W5d}~XYnXdS)u从数据库加载数据zESELECT name FROM sqlite_master WHERE type='table' AND name='articles'r"u 数据库中不存在articles表Nz<4E>
SELECT id, title, url, category, source_date, is_interested
FROM articles
ORDER BY id DESC
rr#<00> 未分类<E58886><00><><EFBFBD><EFBFBD><EFBFBD>rArBrC<00><>否rDr:u
已加载 <20>
条记录u数据库操作出错: <20>数据库错误u加载数据失败u加载数据时出错: ))<29>sqlite3rKr,<00>cursor<6F>executeZfetchonerr.rsZfetchallrV<00> setRowCount<6E>len<65>set<65> enumerate<74>add<64>get<65>setItemr<00>str<74> setForegroundr<00>blue<75>setFontr<00>Bold<6C>greenrN<00> currentText<78>clearrO<00>sorted<65>findText<78>setCurrentIndex<65>update_category_statsri<00> showMessage<67>Errorr<00>error<6F> Exception)r3<00>connr}<00>rows<77>
categories<EFBFBD>category_countsZrow_idx<64>rowZid_val<61>title<6C>url<72>categoryZ source_dateZ is_interestedZ link_itemZinterested_text<78>interested_itemZcurrent_category<72>cat<61>index<65>er6r6r7r2<00>sj 


 
 

   
 
zDatabaseViewer.load_datacCs<>|s|j<00>d<01>dSt|<01><03>dd<04>dd<06>}d<07>dd <09>|D<00><01>}t|<03>d
krZ|dd
<EFBFBD>d }|j<00>|<03>|j<00>d<07>d d <09>|D<00><01><01>dS) u更新分类统计显示r?NcSs|dS)Nr#r6)<01>xr6r6r7<00><lambda><00>z6DatabaseViewer.update_category_stats.<locals>.<lambda>T)<02>key<65>reversez | cSsg|]\}}|<01>d|<02><00><03>qS<00>z: r6<00><03>.0r<EFBFBD><00>countr6r6r7<00>
<listcomp> sz8DatabaseViewer.update_category_stats.<locals>.<listcomp><3E><>u'... (更多分类请查看完整数据)cSsg|]\}}|<01>d|<02><00><03>qSr<>r6r<>r6r6r7r<>s)rU<00>setTextr<74><00>itemsr+r<><00>
setToolTip)r3r<>Zsorted_categoriesZ
stats_textr6r6r7r<><00>s   z$DatabaseViewer.update_category_statscCsxi}t|j<01><02><00>D]V}|j<01>|<02>r$q|j<01>|d<01>}|rT|<03><05>}|<01>|d<02>d||<q|<01>dd<02>d|d<q|<00>|<01>dS)u$在筛选后更新分类统计显示rBrr#ruN)<08>rangerV<00>rowCount<6E> isRowHidden<65>item<65>textr<74>r<>)r3r<>r<><00> category_itemr<6D>r6r6r7<00>"update_category_stats_after_filters z1DatabaseViewer.update_category_stats_after_filterc s<00>j<00><01><00><02>}<01>j<03><04>}t<05>j<06><07><00>D]<5D>}d}|rxd}tdd<04>D].}<06>j<06>||<06>}|r@||<07><01><00><02>kr@d}qpq@|ov|}|dkr<><72>j<06>|d<06>}|o<>|<08><01>|k} |o<>| }<04>j<06> || <00>q&t
<EFBFBD>fdd<08>t<05>j<06><07><00>D<00><01>}
<EFBFBD>j <0B> d |
<EFBFBD>d
<EFBFBD>j<06><07><00>d <0B><05><00><00> <0A>d S) u'根据搜索条件和分类筛选数据TFr#r@r:rBc3s|]}<01>j<00>|<01>sdVqdS)r#N)rVr<>)r<>r<><00>r3r6r7<00> <genexpr>Ds <0C>z-DatabaseViewer.filter_data.<locals>.<genexpr>u显示 <20>/rzN)rHr<><00>lowerrNr<>r<>rVr<>r<><00> setRowHidden<65>sumrir<>r<>) r3Z search_textZselected_categoryr<79>Zshow_rowZ
text_match<EFBFBD>colr<6C>r<>Zcategory_matchZ visible_countr6r<>r7rL's(
  zDatabaseViewer.filter_datacCsV|dkrR|j<00>||<02>}|rR|<03><02>rR|<03><02>}|<04>d<02>r@t<04>|<04>n|j<06>d|<04><00><02>dS)u处理单元格点击事件rA<00>httpu无效的链接: N)rVr<>r<><00>
startswith<EFBFBD>
webbrowser<EFBFBD>openrir<>)r3r<><00>columnr<6E><00>linkr6r6r7rdKs 
 zDatabaseViewer.on_cell_clickedcCs<>|j<00>|<01><02><00>}|dkrdS|j<00>|<02>t|<00>}td|<00>}|j<06>|j<08>|<03> |<04>td|<00>}|j<06>|j
<EFBFBD>|<03> |<05>|<03> <0B>td|<00>}|j<06>|j <0C>|<03> |<06>|<03> |j<00>|<01><01>dS)u显示右键菜单rNr>u标记为不感兴趣r=)rV<00>rowAt<41>y<> selectRowrrrqrKrTrr<00>mark_as_not_interested<65> addSeparatorrS<00>exec_<63> mapToGlobal)r3<00>positionr<6E><00>menuZ mark_action<6F> unmark_actionZ delete_actionr6r6r7rhXs  





z DatabaseViewer.show_context_menucCsd}t<00>|d|<01>dS)u显示关于对话框u<E6A186>
<h3>TopHub数据查看器</h3>
<p>版本: 1.0</p>
<p>用于查看TopHub网站抓取数据的PySide5应用程序</p>
<p>功能特性:</p>
<ul>
<li>显示SQLite数据库中的抓取数据</li>
<li>支持点击链接在浏览器中打开</li>
<li>支持搜索和分类筛选</li>
<li>支持排序功能</li>
<li>支持标记感兴趣的项目</li>
</ul>
rmN)rZabout)r3Z
about_textr6r6r7rtzs zDatabaseViewer.show_aboutcCs<>t<00>|dd<02>\}}|r|sdS|<01><02>}d}t|j<04><05><00>D]l}|j<04>|<04>rJq8d}t|j<04><07><00>D].}|j<04>||<06>}|r\||<07> <09><00><02>kr\d}q<>q\|r8|j<04>
|<04>|d7}q8|j <0B> d|<03>d <09><03>dS)
u按关键字选中行r<u请输入关键字:NrFTr#u
已选中 u 行) rZgetTextr<74>r<>rVr<>r<><00> columnCountr<74>r<>r<>rir<>)r3<00>keyword<72>okZselected_countr<74><00>matchr<68>r<>r6r6r7rR<00>s$  
z DatabaseViewer.select_by_keywordc
Cs<>t<00>}|j<01><02>D]}|<01>|<02><04><00>q|s:t<05>|dd<02>dSt<05>|ddt|<01><01>d<06>tj tj
Btj
<EFBFBD>}|tj
krpdSz<>t <0B> |j <0A>}|<04><0E>}d}t|dd <09>D]@}|j<01>|d<07>}|r<>|<08><11>} |<05>d
| f<01>|j<01>|<07>|d 7}q<>|<04><14>|<04><15>|j<16>d |<06>d <0A><03>|<00><18>Wn<>t jk
<EFBFBD>rd}
z<t<1A>dt|
<EFBFBD><01><00><02>t<05>|ddt|
<EFBFBD><01><00><02>|j<16>d<10>W5d}
~
XYn\tk
<EFBFBD>r<>}
z<t<1A>dt|
<EFBFBD><01><00><02>t<05>|ddt|
<EFBFBD><01><00><02>|j<16>d<10>W5d}
~
XYnXdS)u删除选中的项目<E9A1B9>提示u请先选中要删除的行Nu 确认删除u确定要删除选中的 u( 行数据吗此操作不可撤销rT)r<>z!DELETE FROM articles WHERE id = ?r#u
已删除 u
行数据u删除数据时出错: r{u 删除失败r")r<>rV<00> selectedItemsr<73>r<>r<00> information<6F>questionr<6E><00>Yes<65>Nor|rKr,r}r<>r<>r<>r~<00> removeRow<6F>commitrsrir<>r2r<>rr<>r<>r.r<>) r3<00> selected_rowsr<73><00>replyr<79>r}Z deleted_countr<74><00>id_item<65>
article_idr<EFBFBD>r6r6r7rS<00>sL
<04>
  
 z$DatabaseViewer.delete_selected_itemsc
Cs<>t<00>}|j<01><02>D]}|<01>|<02><04><00>q|s:t<05>|dd<02>dSt<05>|ddt|<01><01>d<06>tj tj
Btj <09>}|tj
krpdSz<>t <0B> |j <0A>}|<04><0E>}d}|D]l}|j<01>|d<07>}|r<>|<08><10>} |<05>d| f<01>td <09>}
|
<EFBFBD>tj<15>|
<EFBFBD>td
d tj<18><03>|j<01>|d |
<EFBFBD>|d 7}q<>|<04><1A>|<04><1B>|j<1C>d|<06>d<0F><03>Wn<>t jk
<EFBFBD>r<>} z<t<1F> dt!| <0B><01><00><02>t<05>"|ddt!| <0B><01><00><02>|j<1C>d<12>W5d} ~ XYn\t#k
<EFBFBD>r<>} z<t<1F> dt!| <0B><01><00><02>t<05>"|ddt!| <0B><01><00><02>|j<1C>d<12>W5d} ~ XYnXdS)u$将选中的项目标记为感兴趣r<E8B6A3><00>请先选中要标记的行N<E8A18C> 确认标记<E6A087>确定要将选中的 u 行标记为感兴趣吗rz2UPDATE articles SET is_interested = 1 WHERE id = ?rxrvrwrDr#<00>
已标记 u 行为感兴趣<E585B4>标记数据时出错: r{<00> 标记失败r")$r<>rVr<>r<>r<>rr<>r<>r<>r<>r<>r|rKr,r}r<>r<>r~rr<>rr<>r<>rr<>r<>r<>rsrir<>r<>rr<>r<>r.r<><00> r3r<>r<>r<>r<>r}Z updated_countr<74>r<>r<>r<>r<>r6r6r7rT<00>sP
<04>
  
z!DatabaseViewer.mark_as_interestedc
Cs<>t<00>}|j<01><02>D]}|<01>|<02><04><00>q|s:t<05>|dd<02>dSt<05>|ddt|<01><01>d<06>tj tj
Btj <09>}|tj
krpdSz<>t <0B> |j <0A>}|<04><0E>}d}|D]L}|j<01>|d<07>}|r<>|<08><10>} |<05>d| f<01>td <09>}
|j<01>|d
|
<EFBFBD>|d 7}q<>|<04><14>|<04><15>|j<16>d |<06>d <0A><03>Wn<>t jk
<EFBFBD>r`} z<t<19>dt| <0B><01><00><02>t<05>|ddt| <0B><01><00><02>|j<16>d<10>W5d} ~ XYn\tk
<EFBFBD>r<>} z<t<19>dt| <0B><01><00><02>t<05>|ddt| <0B><01><00><02>|j<16>d<10>W5d} ~ XYnXdS)u'将选中的项目标记为不感兴趣r<E8B6A3>r<>Nr<4E>r<>u 行标记为不感兴趣吗rz2UPDATE articles SET is_interested = 0 WHERE id = ?ryrDr#r<>u 行为不感兴趣r<E8B6A3>r{r<>r")r<>rVr<>r<>r<>rr<>r<>r<>r<>r<>r|rKr,r}r<>r<>r~rr<>r<>rsrir<>r<>rr<>r<>r.r<>r<>r6r6r7r<>)sL
<04>
 
z%DatabaseViewer.mark_as_not_interested)<13>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r%r1rkr2r<>r<>rLrdrhrtrRrSrTr<><00> __classcell__r6r6r4r7r!s a[$ "!=@r!cCs>ttj<02>}|<00>d<01>|<00>d<02>t<05>}|<01><06>t<01>|<00><08><00>dS)u 主函数r8ZTopHubN) rr/<00>argvZsetApplicationNameZsetOrganizationNamer!<00>showr0<00>exec)<02>app<70>viewerr6r6r7<00>mainhs 


r<><00>__main__)+r<>r/r&r|r<>r<00>logurur<00>PySide6.QtWidgetsrrrrrr r
r r r rrrrrrrrrrrr<00>PySide6.QtCorerrr<00> PySide6.QtGuirrrr r!r<>r<>r6r6r6r7<00><module>s"  `U