diff options
Diffstat (limited to 'pjsip-apps/src/pygui/log.py')
-rw-r--r-- | pjsip-apps/src/pygui/log.py | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/pjsip-apps/src/pygui/log.py b/pjsip-apps/src/pygui/log.py new file mode 100644 index 00000000..d3772419 --- /dev/null +++ b/pjsip-apps/src/pygui/log.py @@ -0,0 +1,127 @@ +# $Id$ +# +# pjsua Python GUI Demo +# +# Copyright (C)2013 Teluu Inc. (http://www.teluu.com) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +import sys +if sys.version_info[0] >= 3: # Python 3 + import tkinter as tk + from tkinter import ttk + from tkinter import messagebox as msgbox +else: + import Tkinter as tk + import tkMessageBox as msgbox + import ttk + +import pjsua2 as pj +import application + + +class LogWindow(tk.Toplevel): + """ + Log window + """ + instance = None + def __init__(self, app): + tk.Toplevel.__init__(self, name='logwnd', width=640, height=480) + LogWindow.instance = self + self.app = app + self.state('withdrawn') + self.title('Log') + self._createWidgets() + self.protocol("WM_DELETE_WINDOW", self._onHide) + + def addLog(self, entry): + """entry fields: + int level; + string msg; + long threadId; + string threadName; + """ + self.addLog2(entry.level, entry.msg) + + def addLog2(self, level, msg): + if level==5: + tags = ('trace',) + elif level==3: + tags = ('info',) + elif level==2: + tags = ('warning',) + elif level<=1: + tags = ('error',) + else: + tags = None + self.text.insert(tk.END, msg, tags) + self.text.see(tk.END) + + def _createWidgets(self): + self.rowconfigure(0, weight=1) + self.rowconfigure(1, weight=0) + self.columnconfigure(0, weight=1) + self.columnconfigure(1, weight=0) + + self.text = tk.Text(self, font=('Courier New', '8'), wrap=tk.NONE, undo=False, padx=4, pady=5) + self.text.grid(row=0, column=0, sticky='nswe', padx=5, pady=5) + + scrl = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.text.yview) + self.text.config(yscrollcommand=scrl.set) + scrl.grid(row=0, column=1, sticky='nsw', padx=5, pady=5) + + scrl = ttk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.text.xview) + self.text.config(xscrollcommand=scrl.set) + scrl.grid(row=1, column=0, sticky='we', padx=5, pady=5) + + self.text.bind("<Key>", self._onKey) + + self.text.tag_configure('normal', font=('Courier New', '8'), foreground='black') + self.text.tag_configure('trace', font=('Courier New', '8'), foreground='#777777') + self.text.tag_configure('info', font=('Courier New', '8', 'bold'), foreground='black') + self.text.tag_configure('warning', font=('Courier New', '8', 'bold'), foreground='cyan') + self.text.tag_configure('error', font=('Courier New', '8', 'bold'), foreground='red') + + def _onKey(self, event): + # Ignore key event to make text widget read-only + return "break" + + def _onHide(self): + # Hide when close ('x') button is clicked + self.withdraw() + self.app.showLogWindow.set(0) + + +def writeLog2(level, msg): + if LogWindow.instance: + LogWindow.instance.addLog2(level, msg) + +def writeLog(entry): + if LogWindow.instance: + LogWindow.instance.addLog(entry) + +class Logger(pj.LogWriter): + """ + Logger to receive log messages from pjsua2 + """ + def __init__(self): + pj.LogWriter.__init__(self) + + def write(self, entry): + print entry.msg, + writeLog(entry) + +if __name__ == '__main__': + application.main() |