生活中的每個細節,有些人習慣使用圖像的方式做紀錄;有些人更喜歡使用文字去做紀錄。 那在資訊領域中呢? 有一群人就喜歡啃Raw data 所紀錄出的log ....
Python 中有一個好用的module,logging,其可以將log 等級做分類,細則就隨便google找找都有。 這次的重點則是,要怎麼把程式中隨時印在console 中的print 資訊,導入到UI 元件中。
筆者打算用signal的形式直接去實作,如果對於使用callback有興趣的朋友就另外去找其他文章來看囉.
使用工具
作法:
class LoggingHandler(QObject):
finished = Signal()
updated = Signal(str)
@QtCore.Slot()
def __init__(self):
super(LoggingHandler, self).__init__()
self.working = True
def work(self):
global v_logging
if self.working:
self.updated.emit(v_logging)
self.finished.emit()
self.thread3 = None
def runloggingTasks(self):
global v_logging
self.Logging = LoggingHandler()
self.thread3 = QThread()
self.thread3.started.connect(self.Logging.work)
self.Logging.updated.connect(self.updateText)
self.Logging.finished.connect(self.thread3.quit)
self.Logging.finished.connect(self.Logging.deleteLater)
self.Logging.moveToThread(self.thread3)
self.thread3.start()
v_logging = "log start"
[筆記]
(1) 筆者是使用v_logging 共用變數當成queue使用
(2) v_logging 可被用在任何放置print 的地方,筆者在這邊是測試功能,所以直接放置在功能內
筆者存放log的UI元件是使用lineEdit
self.runloggingTasks()
效果:
執行後可以看到紅色框框處多了log start 字樣
結論:
網路上有使用logging module + handleer的形式做出來,但筆者在看了程式碼後發現對方寫得太複雜了,筆者只想簡單實作就好。所以選擇使用signal + slot + queue的形式來實作。
後記:
做一個新專案來學一種新的應用真的是很棒的形式,PySide 系列筆者還是會繼續在鐵人賽後繼續鑽研下去,因為真的很有趣。網路上找到的參考資料並不一定適合每一個人,唯有取經跟自幹整合後才會變成自己的產物。
PS: 可惜自幹純手刻資料清洗工具的side project還沒做完,因為這專案還在繼續開發中,未來相關的分享會出現在其他地方吧。暫定是筆者即將開始撰寫的medium。