diff --git a/1.htm b/1.htm
new file mode 100644
index 0000000..781db6a
--- /dev/null
+++ b/1.htm
@@ -0,0 +1,8 @@
+
+《标题》
+作者
+时间
+【标注】
+********************************************************
+内容风急浪大肌肤立刻打算减肥;老大上课就犯困了;阿迪肌肤;打算减肥打卡【P123-126】
+
diff --git a/kman.py b/kman.py
index a97937c..0617693 100644
--- a/kman.py
+++ b/kman.py
@@ -70,6 +70,7 @@ DEBUG = 1 # 0 - INFO; 1 - DEBUG
LOG2FILE = 1 # 0 - to stdio; 1 - to file
LOGFILE = 'log'
DELIMITER= '|'
+#HEADER = {0:'type',1:'bookname',2:'author',3:'position',4:'date',5:'content'}
# log info
logger = logging.getLogger()
@@ -357,9 +358,13 @@ class kMan:
bks: books dict
info: filter by bookname or author information
tp: type to be filter
- 0: top/root item clicked
+ 0: root item clicked
1: bookname item clicked
2: author item clicked
+ Return: list:
+ [[Type,Bookname,Author,Position,Date,content],
+ [Type,Bookname,Author,Position,Date,content]
+ ....]
"""
nbks = defaultdict(dict)
@@ -378,9 +383,10 @@ class kMan:
if ks in ['author', 'lines']: continue
tm = self.format_time(' '.join([vs['day'],vs['week'], \
vs['meridiem'],vs['time']]))
- tp = '鏍囨敞' if vs['type']=='HL' else '绗旇'
- seclist.append((vs['content'],tp,kb,vb['author'],vs['position'],tm))
+ nttype = '鏍囨敞' if vs['type']=='HL' else '绗旇'
+ seclist.append([nttype,kb,vb['author'],vs['position'],tm,vs['content']])
idx += 1
+
return seclist
def add_note_to_highlight(self,bks):
diff --git a/kmanapp.py b/kmanapp.py
index aee0b7f..69d3f64 100644
--- a/kmanapp.py
+++ b/kmanapp.py
@@ -1,12 +1,17 @@
+#########################################################
+## @file : kmanapp.py
+## @desc : kindle note managerment tool GUI
+## @create : 2020/06/03
+## @author : Chengan
+## @email : douboer@gmail.com
+#########################################################
+
import sys
from time import sleep
+import pandas as pd
-from PySide2.QtWidgets import QApplication
-from PySide2.QtWidgets import QMainWindow
-from PySide2.QtWidgets import QLabel
-from PySide2.QtWidgets import QMessageBox
-from PySide2.QtWidgets import QFileDialog
+from PySide2.QtWidgets import *
from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
QAbstractTableModel, QObject, QPoint, QRect, QSize, QTime,
@@ -14,7 +19,6 @@ from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
QPixmap, QRadialGradient, QStandardItem, QStandardItemModel)
-#from PySide2.QtWidgets import *
from mainwindow import Ui_MainWindow
from kman import *
@@ -40,6 +44,7 @@ class kmanWindow(QMainWindow):
self.km = kMan()
self.books = self.km.import_clips()
+ self.filter_data = self.km.filter_clips(self.books)
self.add_ui_component()
@@ -65,26 +70,41 @@ class kmanWindow(QMainWindow):
ui.searchToolButton.clicked.connect(self.search_button_clicked)
ui.treeView.clicked.connect(self.tree_item_clicked)
ui.tableView.clicked.connect(self.table_item_clicked)
+ ui.tableView.setColumnWidth(0, 40) # type
+ ui.tableView.setColumnWidth(2, 50) # author
+ ui.tableView.selectRow(0)
def add_ui_component(self):
self.ui.searchComboBox.addItems(['ALL','bookname','content','author'])
+ self.ui.treeView.resize(200,200)
# status bar
self.ui.status_label = QLabel()
self.ui.pe = QPalette()
- # table
- #self.ui.tablemodel=QStandardItemModel(100,5)
- self.ui.tablemodel= nTableModel(100,5)
- self.ui.tablemodel.setHorizontalHeaderLabels(
- [u'Content',u'Type',u'Bookname',u'Author',u'Position',u'Date'])
- self.ui.tablemodel.update(self.km.filter_clips(self.books))
+ # table view
+ self.ui.tablemodel = nTableModel(self.convert_to_panda(self.filter_data))
self.ui.tableView.verticalHeader().hide()
- for row in range(5):
- for column in range(5):
- i=QStandardItem("row %s,column %s"%(row,column))
- self.ui.tablemodel.setItem(row,column,i)
self.ui.tableView.setModel(self.ui.tablemodel)
+ self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
+ # fit window
+ #headerView = self.ui.tableView.horizontalHeader()
+ #headerView.setSectionResizeMode(QHeaderView.Stretch)
+ self.ui.tableView.horizontalHeader().setStretchLastSection(True)
+ self.ui.tablemodel.tabledata_update.connect(self.tabledata_update_slot)
+
+ # initial textedit content
+ [stype,sbookname,sauthor,sposition,stime,scontent] = self.filter_data[0]
+ self.ui.textEdit.setHtml("""銆妠bookname}銆
+ {author}
+ {time}
+ 銆恵note}銆
+ ********************************************************
+ {content}
+ 銆怭{position}銆
""".
+ format(bookname=sbookname, author=sauthor, time=stime,
+ note=stype, content=scontent, position=sposition))
+
"""
if not ONLY_TEST: # XXXXXXXXXXXXX
@@ -129,22 +149,60 @@ class kmanWindow(QMainWindow):
self.ui.treeView.setModel(model)
"""
+ def convert_to_panda(self, seclist):
+ pdframe = pd.DataFrame(seclist, \
+ columns = ['Type','Bookname','Author','Position','Date','Content'])
+ return pdframe
+
+ def tabledata_update_slot(self, s):
+ print('call tabledata_update_slot() {}'.format(s))
+
def tree_item_clicked(self, modelidx):
model_index_list = self.ui.treeView.selectedIndexes() # QModelIndexList
model_index = model_index_list[0] # QModelIndex
itemmodel = model_index.model() #QAbstractItemModel/QStandardItemModel
item = itemmodel.itemFromIndex(modelidx) #QStandardItem
- print(item.text())
+ description = item.accessibleDescription()
+ print(description, item.text())
+
# filter clips
+ self.filter_data = None
+ if description in ['root', 'bookname', 'author']:
+ self.filter_data = self.km.filter_clips(self.books)
+ elif description == 'bleaf': # bookname leaf
+ info = re.split(r'\s+',item.text())[0]
+ self.filter_data = self.km.filter_clips(self.books, info, 1)
+ else: # author leaf
+ info = re.split(r'\s+',item.text())[0]
+ self.filter_data = self.km.filter_clips(self.books, info, 2)
- #item = self.ui.treeView.selectedIndexes()[0]
- #print(item.model().itemFromIndex(modelidx).text())
+ data = self.convert_to_panda(self.filter_data)
+ self.ui.tablemodel= nTableModel(data)
+ self.ui.tableView.verticalHeader().hide()
+ self.ui.tableView.setModel(self.ui.tablemodel)
- def table_item_clicked(self, item):
- content = item.data()
- #print('call table_item_clicked() {}'.format(content))
+ def table_item_clicked(self, index):
+ if index.isValid():
+ row = index.row()
+ stype = index.sibling(row, 0).data()
+ sbookname = index.sibling(row, 1).data()
+ sauthor = index.sibling(row, 2).data()
+ sposition = index.sibling(row, 3).data()
+ stime = index.sibling(row, 4).data()
+ scontent = index.sibling(row, 5).data()
+ else: return
+
+ self.ui.textEdit.setHtml("""銆妠bookname}銆
+ {author}
+ {time}
+ 銆恵note}銆
+ ********************************************************
+ {content}
+ 銆怭{position}銆
""".
+ format(bookname=sbookname, author=sauthor, time=stime,
+ note=stype, content=scontent, position=sposition))
def search_button_clicked(self):
print( 'call search_button_clicked()' )
@@ -213,7 +271,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/emblem_library.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
- item.setAccessibleDescription('top')
+ item.setAccessibleDescription('root')
rootItem.appendRow(item)
parent_item = item
@@ -223,7 +281,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/book_open.png", QSize(), QIcon.Normal, QIcon.Off)
bookname_item.setIcon(icon)
- bookname_item.setAccessibleDescription('root')
+ bookname_item.setAccessibleDescription('bookname')
parent_item.appendRow(bookname_item)
if totalnum > 0:
@@ -232,7 +290,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/book_open_bookmark.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
- item.setAccessibleDescription('leaf')
+ item.setAccessibleDescription('bleaf')
bookname_item.appendRow(item)
# add author tree
@@ -241,7 +299,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/person.png", QSize(), QIcon.Normal, QIcon.Off)
author_item.setIcon(icon)
- author_item.setAccessibleDescription('root')
+ author_item.setAccessibleDescription('author')
parent_item.appendRow(author_item)
parent_item = author_item
@@ -251,7 +309,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/user.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
- item.setAccessibleDescription('leaf')
+ item.setAccessibleDescription('aleaf')
author_item.appendRow(item)
self.ui.treeView.setModel(self.ui.model)
@@ -313,46 +371,42 @@ class kmanWindow(QMainWindow):
# stop check thread
self.flag = False
-## thanks 鍕ゅ鐨勫皬闈掕洐 ^_^ - http://www.jyguagua.com/?p=2615
-#class nTableModel(QAbstractTableModel):
-class nTableModel(QStandardItemModel):
- def __init__(self, parent=None, seclist=None, *args):
+# thanks Martin Fitzpatrick ^_^
+# https://www.learnpyqt.com/courses/model-views/qtableview-modelviews-numpy-pandas/
+class nTableModel(QAbstractTableModel):
+ tabledata_update = Signal(str)
+
+ def __init__(self, data):
super(nTableModel, self).__init__()
- self.seclist = None
+ self._data = data
- def update(self, seclist):
- self.seclist = seclist
-
- def rowCount(self, parent):
- if not self.seclist: return 0
- return len(self.seclist)
-
- def columnCount(self, parent):
- if not self.seclist: return 0
- return len(self.seclist[0])
-
def data(self, index, role):
- if not index.isValid():
- return None
- elif role != Qt.DisplayRole:
- return None
- return self.seclist[index.row()][index.column()]
-
- def sort(self, col, order):
- """sort table by given column number col"""
- self.emit(SIGNAL("layoutAboutToBeChanged()"))
+ if role == Qt.DisplayRole:
+ value = self._data.iloc[index.row(), index.column()]
+ self.tabledata_update[str].emit('{} {}'.format(index.row(),index.column()))
+ return str(value)
- self.seclist = sorted(self.seclist, key=operator.itemgetter(col))
- if order == Qt.DescendingOrder:
- self.seclist.reverse()
+ def rowCount(self, index):
+ return self._data.shape[0]
+
+ def columnCount(self, index):
+ return self._data.shape[1]
+
+ def headerData(self, section, orientation, role):
+ # section is the index of the column/row.
+ if role == Qt.DisplayRole:
+ if orientation == Qt.Horizontal:
+ return str(self._data.columns[section])
+
+ if orientation == Qt.Vertical:
+ return str(self._data.index[section])
- self.emit(SIGNAL("layoutChanged()"))
-
if __name__ == "__main__":
app = QApplication(sys.argv)
kmw = kmanWindow()
- kmw.resize(900, 600)
+ #kmw.resize(900, 600)
+ kmw.showFullScreen()
kmw.show()
# loop check kindle is connected or not
@@ -364,6 +418,5 @@ if __name__ == "__main__":
except:
print ("Error: can not start thread")
"""
-
app.exec_()
diff --git a/kmanapp.pyproject.user b/kmanapp.pyproject.user
index 3bdb45e..e06a03e 100644
--- a/kmanapp.pyproject.user
+++ b/kmanapp.pyproject.user
@@ -1,6 +1,6 @@
-
+
EnvironmentId
diff --git a/tdataframe.py b/tdataframe.py
new file mode 100644
index 0000000..5db7fd1
--- /dev/null
+++ b/tdataframe.py
@@ -0,0 +1,81 @@
+
+import pandas as pd
+from kman import *
+
+data = {
+ 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
+ 'year':[2000,2001,2002,2001,2002],
+ 'pop':[1.5,1.7,3.6,2.4,2.9],
+ 'xx':[1.5,1.7,3.6,2.4,2.9]
+}
+"""
+ year state pop debt
+one 2000 Ohio 1.5 16.5
+two 2001 Ohio 1.7 16.5
+three 2002 Ohio 3.6 16.5
+four 2001 Nevada 2.4 16.5
+five 2002 Nevada 2.9 16.5
+"""
+frame = pd.DataFrame(data,
+ index = ['one', 'two','three','four','five'],
+ columns = ['year','state','pop','debt','xx'])
+
+print(frame.iat[0, 0])
+print(frame.iat[1, 1])
+print(frame.iat[2, 2])
+print(frame.iat[2, 1])
+
+'''
+print('\n---------------------')
+print(frame)
+print('\n---------------------')
+frame['debt']=16.5
+print(frame)
+print('\n---------------------')
+print(frame.iloc[2]) #line 2
+print('\n---------------------')
+print(frame.iloc[[2,3],0:2])
+print('\n---------------------')
+print(frame.iloc[[2,3],0:2])
+print('\n---------------------')
+print(frame.iat[1, 1])
+print('\n---------------------')
+for index, row in frame.iterrows():
+ print(index)
+ print(row)
+print('\n---------------------')
+for row in frame.iterrows():
+ print(row)
+ #print(row[0], row[1])
+print('\n---------------------')
+print(frame.head(2))
+print('\n---------------------')
+print(frame.columns)
+print('\n---------------------')
+print(frame.index)
+print('\n---------------------')
+print(frame.to_dict())
+print('\n---------------------')
+'''
+
+km = kMan()
+books = km.import_clips()
+print(books)
+print('\n---------------------')
+frame = pd.DataFrame(books)
+print(frame)
+
+print('\n---------------------')
+data = [['Ohio','Ohio','Ohio','Nevada','Nevada'],
+ [2000,2001,2002,2001,2002],
+ [1.5,1.7,3.6,2.4,2.9],
+ [1.5,1.7,3.6,2.4,2.9],
+ [1.5,1.7,3.6,2.4,2.9],
+ ]
+frame = pd.DataFrame(data,
+ columns = ['year','state','pop','debt','xx'])
+print(frame)
+
+
+
+
diff --git a/tqtableview.py b/tqtableview.py
new file mode 100644
index 0000000..231bce3
--- /dev/null
+++ b/tqtableview.py
@@ -0,0 +1,88 @@
+
+# -*- coding: utf-8 -*-
+"""
+@author: Taar
+"""
+
+#conversion of https://github.com/openwebos/qt/tree/master/examples/tutorials/modelview/5_edit
+
+#I work with ints for values instead of strings (less cumbersome to add)
+
+import sys
+import pandas as pd
+
+from PySide2.QtWidgets import *
+from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
+ QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
+ QPixmap, QRadialGradient, QStandardItem, QStandardItemModel)
+from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
+ QAbstractTableModel, QObject, QPoint, QRect, QSize, QTime,
+ QUrl, Qt, QThread, Signal, QTimer)
+
+class TableModel(QAbstractTableModel):
+
+ def __init__(self, data):
+ super(TableModel, self).__init__()
+ self._data = data
+
+ def data(self, index, role):
+ if role == Qt.DisplayRole:
+ value = self._data.iloc[index.row(), index.column()]
+ return str(value)
+
+ def rowCount(self, index):
+ return self._data.shape[0]
+
+ def columnCount(self, index):
+ return self._data.shape[1]
+
+ def headerData(self, section, orientation, role):
+ # section is the index of the column/row.
+ if role == Qt.DisplayRole:
+ if orientation == Qt.Horizontal:
+ return str(self._data.columns[section])
+
+ if orientation == Qt.Vertical:
+ return str(self._data.index[section])
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super().__init__()
+
+ self.table = QTableView()
+
+ data = pd.DataFrame([
+ [1, 9, 2],
+ [1, 0, -1],
+ [3, 5, 2],
+ [3, 3, 2],
+ [5, 8, 9],
+ ],
+ columns = ['A', 'B', 'C'],
+ index=['Row 1', 'Row 2', 'Row 3', 'Row 4', 'Row 5'])
+
+ self.model = TableModel(data)
+ self.table.setModel(self.model)
+
+ data = pd.DataFrame([
+ [1, 5, 5, 9],
+ [1, 5, 5, 9],
+ [1, 2, 1, 3],
+ [1, 1, 0, -1],
+ [1, 5, 5, 2],
+ [1, 5, 5, 8],
+ [1, 5, 5, 9],
+ ],
+ columns = ['Aa', 'Bb', 'Cc', 'dd'],
+ index=['Row 1', 'Row 3', 'Row 4', 'Row 4', 'Row 5', '6', '7'])
+
+ self.model = TableModel(data)
+ self.table.setModel(self.model)
+ self.setCentralWidget(self.table)
+
+
+if __name__ == '__main__':
+ app=QApplication(sys.argv)
+ window=MainWindow()
+ window.show()
+ app.exec_()
diff --git a/x b/x
new file mode 100644
index 0000000..3634d0f
--- /dev/null
+++ b/x
@@ -0,0 +1,25 @@
+class TableModel(QAbstractTableModel):
+
+ def __init__(self, data):
+ super(TableModel, self).__init__()
+ self._data = data
+
+ def data(self, index, role):
+ if role == Qt.DisplayRole:
+ value = self._data.iloc[index.row(), index.column()]
+ return str(value)
+
+ def rowCount(self, index):
+ return self._data.shape[0]
+
+ def columnCount(self, index):
+ return self._data.shape[1]
+
+ def headerData(self, section, orientation, role):
+ # section is the index of the column/row.
+ if role == Qt.DisplayRole:
+ if orientation == Qt.Horizontal:
+ return str(self._data.columns[section])
+
+ if orientation == Qt.Vertical:
+ return str(self._data.index[section])