This repository has been archived by the owner on Nov 23, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mainUI_v3.py
212 lines (185 loc) · 10.5 KB
/
mainUI_v3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import sys
from PyQt5.QtWidgets import * # noqa: F403
from PyQt5 import uic, QtCore
import crawling
from pprint import pprint
from pathlib import Path
import pandas as pd
from datetime import datetime
checkQuery_ui = uic.loadUiType("./UI/CheckQuery.ui")[0]
def DelOverlap(li): #추측: 중복제거
tmp_list = []
for v in li:
if v not in tmp_list and v != '':
tmp_list.append(v)
li[:] = tmp_list # 가르키는 object는 동일하다. -> 해당 object를 수정하기 위해 [:]을 사용
#class CheckQueryWindow(QMainWindow, checkQuery_ui): # noqa: F405
class CheckQueryWindow(QDialog): # noqa: F405
def __init__(self, Queryes):
QDialog.__init__(self, None)
uic.loadUi("./UI/CheckQuery.ui", self)
#super().__init__()
self.Queryes = Queryes
#self.setupUi(self)
self.setFixedSize(172, 262)
self.QueryBrowseAndEdit_PTextEdit.setLineWrapMode(0)
self.QueryBrowseAndEdit_PTextEdit.setPlainText('\n'.join(Queryes))
self.Save_btn.clicked.connect(self.Save_)
def Save_(self, Queryes):
self.Queryes[:] = self.QueryBrowseAndEdit_PTextEdit.toPlainText().split('\n') # 가르키는 object는 동일하다. -> 해당 object를 수정하기 위해 [:]을 사용
DelOverlap(self.Queryes)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.Queryes[:] = self.QueryBrowseAndEdit_PTextEdit.toPlainText().split('\n') # 가르키는 object는 동일하다. -> 해당 object를 수정하기 위해 [:]을 사용
DelOverlap(self.Queryes)
self.close()
class WindowClass(QDialog): # noqa: F405
Queryes = []
changed_item = []
def __init__(self):
QDialog.__init__(self,None)
uic.loadUi("./UI/mainUI_v2.ui",self)
self.AddQuery_btn.clicked.connect(self.AssociatedQuery('Func_AddQuery_btn'))
self.Query_LineEdit.returnPressed.connect(self.AssociatedQuery('Func_AddQuery_btn'))
self.openFile_btn.clicked.connect(self.AssociatedQuery('Func_openFile_btn'))
self.CheckQuery_btn.clicked.connect(self.AssociatedQuery('Func_CheckQuery_btn'))
self.AssociatedQuery('FileDIR_Default')
self.activateFunc_btn.clicked.connect(self.Func_activateFunc_btn)
self.AssociatedTable('SetDefaultTable')
self.ViewResult_table.setEditTriggers(QTableWidget.NoEditTriggers) # noqa: F405
self.FlagEditable_chbox.stateChanged.connect(self.AssociatedTable('Func_FlagEditable_chbox'))
self.SelectKeyword_cbox.currentIndexChanged.connect(self.AssociatedTable('Func_SelectKeyword_cbox'))
self.changeAdmit_btn.setEnabled(False)
self.changeAdmit_btn.clicked.connect(self.AssociatedTable('Func_ViewResult_table_admitChanges'))
self.ViewResult_table.cellDoubleClicked.connect(self.AssociatedTable('Func_ViewResult_table_doubleClicked'))
self.SaveAsFIle_btn.clicked.connect(self.Func_SaveAsFile_btn)
def AssociatedQuery(self, funcName):
# Query(keyword input)과 관련있는 Function들의 집합
def Func_openFile_btn():
# 실행조건 : openFile_btn이 눌렸을 때
# 동작 : Open file & get keywords(\n기준) & append to Queryes(앞뒤 공백 제거 후)
fname = QFileDialog.getOpenFileName(self) # noqa: F405 # file창 하나 열기
self.FileDIR_Browser.setPlainText(fname[0])
f = open(fname[0], 'r')
self.Queryes += [i.rstrip().lstrip() for i in f.readlines()]
DelOverlap(self.Queryes)
def Func_AddQuery_btn():
# 실행조건 : Query_LineEdit에서 enter누르거나, AddQuery_btn을 눌렀을 때 실행
# 동작 : Query_LineEdit의 text를 공백 제거 후 Queryes에 append함
# 이후 Query_LineEdit은 ''(Blank)로 돌아감
self.Queryes.append(self.Query_LineEdit.text().rstrip().lstrip())
self.Query_LineEdit.setText('')
DelOverlap(self.Queryes)
def Func_CheckQuery_btn():
# 실행조건 : CheckQuery_btn이 눌렸을 때
# 동작 : CheckQueryWindow Class의 __init__()에 지금까지 입력된 Queryes를 인자로 보내고 이 클래스(window)를 실행(show)한다.
self.CheckQueryWindow_ = CheckQueryWindow(self.Queryes)
self.CheckQueryWindow_.show()
def FileDIR_Default():
# 실행조건 : 초기 설정(초기 1회만 실행됨)
# 동작 : \n으로 구분된 keywords가 있는 메모장을 불러오기 전, 파일의 경로를 나타내는 FileDIR_Browser가 비어있을 때, 공백으로 채움
self.FileDIR_Browser.setPlainText(' ' * 100)
self.FileDIR_Browser.horizontalScrollBar().setValue(0)
self.FileDIR_Browser.setLineWrapMode(0)
return (Func_openFile_btn if funcName == 'Func_openFile_btn' else
Func_AddQuery_btn if funcName == 'Func_AddQuery_btn' else
Func_CheckQuery_btn if funcName == 'Func_CheckQuery_btn' else
FileDIR_Default() if funcName == 'FileDIR_Default' else
None)
def AssociatedTable(self, funcname): # 미완
# 실행 후 결과가 나타나는 table에 관련된 Function들의 집합
def Func_SelectKeyword_cbox(): # 미완
# UI 하단의 결과 창에 나타낼 결과 data를 keyword로 선택하는 것
self.index_ = self.SelectKeyword_cbox.currentIndex()
self.ViewResult_table.setRowCount(len(self.Result[self.index_][0]))
for col in range(3):
for row in range(len(self.Result[self.index_][col])):
self.ViewResult_table.setItem(row, col, QTableWidgetItem(str(self.Result[self.index_][col][row])))
def Func_ViewResult_table_admitChanges():
for item in self.changed_item:
self.Result[item[0]][item[1]][item[2]] = self.ViewResult_table.item(item[2], item[1]).text()
self.changed_item = []
def Func_FlagEditable_chbox():
# 실행조건 : FlagEditable_chbox의 상태가 변했을 때
# 동작 : 체크시 해당 keyword의 result Data 수정가능
if self.FlagEditable_chbox.isChecked():
self.ViewResult_table.setEditTriggers(QTableWidget.DoubleClicked) # noqa: F405
self.changeAdmit_btn.setEnabled(True)
else:
self.changeAdmit_btn.setEnabled(False)
self.ViewResult_table.setEditTriggers(QTableWidget.NoEditTriggers) # noqa: F405
def Func_ViewResult_table_doubleClicked():
self.row_ = self.ViewResult_table.currentRow()
self.col_ = self.ViewResult_table.currentColumn()
self.index_ = self.SelectKeyword_cbox.currentIndex()
if self.FlagEditable_chbox.isChecked():
self.changed_item.append([self.index_, self.col_, self.row_])
def SetDefaultTable():
# 실행조건 : 초기 설정(초기 1회만 실행됨)
# 동작 : ViewResult_table을 초기화
self.ViewResult_table.setRowCount(10) # data가 공백인 10개의 행(빈 행일시 User experience가 좋지 않을 것을 대비함)
self.ViewResult_table.setColumnCount(3) # column의 개수
items = ['url', '제목', '날짜']
self.ViewResult_table.setHorizontalHeaderLabels(items) # column의 header지정
return (Func_SelectKeyword_cbox if funcname == 'Func_SelectKeyword_cbox' else
Func_FlagEditable_chbox if funcname == 'Func_FlagEditable_chbox' else
SetDefaultTable() if funcname == 'SetDefaultTable' else
Func_ViewResult_table_doubleClicked if funcname == 'Func_ViewResult_table_doubleClicked' else
Func_ViewResult_table_admitChanges if funcname == 'Func_ViewResult_table_admitChanges' else
None)
def Func_activateFunc_btn(self): # 미완
driver_path = '/home/anthonyjo/Desktop/chromedriver'
self.Result = [crawling.view(self.Queryes[i], driver_path) for i in range(len(self.Queryes))]
for i in self.Queryes:
self.SelectKeyword_cbox.addItem(i)
self.ViewResult_table.setRowCount(len(self.Result[0][0]))#어차피 길이알고자하는것 따라서 그냥 [0][0]으로 함
for col in range(3):
for row in range(len(self.Result[0][col])):
self.ViewResult_table.setItem(row, col, QTableWidgetItem(str(self.Result[0][col][row])))
def getTime(self, slice_='second', char='-'):
r"""
인자 설명
slice_ : 어디까지 표현할 것인지(day, hour, minute, second, all)
(기본(미 설정시) : second)
char : 구분 문자 설정, 사용불가 문자 :(\ / : * ? " < > |)
(기본(미 설정시) : -)
"""
if char in ['\\', '/', ':', '*', '?', '"', '<', '>', '|']:
raise ValueError("char must not be in ['\\', '/', ':', '*', '?', '\"', '<', '>', '|']")
time = str(datetime.now())
if slice_ == 'day':
time = time[:time.index(' ')]
elif slice_ == 'hour':
time = time[:time.index(':')]
elif slice_ == 'minute':
index_ = time.index(':')
index_ += time[index_+1:].index(':') + 1
time = time[:index_]
elif slice_ == 'second':
time = time[:time.index('.')]
elif slice_ == 'all':
pass
else :
raise ValueError("slice_ must be in ['day', 'hour', 'minute', 'second', 'all']")
time = time.replace(':', '-')
if char != '-':
time = time.replace('-', char)
return time
def Func_SaveAsFile_btn(self):
folder_dir = 'View전체수집'
Path(folder_dir).mkdir(parents=True, exist_ok=True)
time_ = self.getTime()
for data_, keyword in zip(self.Result, self.Queryes):
data = {}
data['Rank'] = data_[3]
data['URL'] = data_[0]
data['제목'] = data_[1]
data['날짜'] = data_[2]
df = pd.DataFrame(data)
df.to_excel('{}/{}_{}.xlsx'.format(folder_dir, keyword, time_), index=False)
# query(keywords) 받는 부분은 마무리됨. start버튼으로 crawling하는 부분과 그 결과 data를 얻는 부분, 선택한 keyword에 해당하는 data를 table에 나타내는 부분, 그 data를 excel로 저장하는 부분 남음(예상)
if __name__ == "__main__":
app = QApplication(sys.argv) # noqa: F405
myWindow = WindowClass()
myWindow.show()
app.exec_()