1#! /usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4# romiq.kh@gmail.com, 2015 5 6import sys, os 7import traceback 8import tkinter 9 10from tkguibrowser import TkBrowser, hlesc, cesc, fmt_hl, fmt_hl_len, fmt_arg, \ 11 fmt_dec, fmt_dec_len 12 13APPNAME = "Test tkinter gui browser" 14VERSION = "v0.1 2015-06-20" 15 16class App(TkBrowser): 17 def __init__(self, master): 18 super().__init__(master) 19 20 def init_gui(self): 21 self.master.title(APPNAME) 22 # path 23 if hasattr(sys, 'frozen'): 24 self.app_path = sys.executable 25 else: 26 self.app_path = __file__ 27 self.app_path = os.path.abspath(os.path.dirname(self.app_path)) 28 29 def create_widgets(self): 30 super().create_widgets() 31 32 self.path_handler["test"] = [self.path_test, "Tests"] 33 34 repath = "/" 35 for cmd, arg in self.start_act: 36 if cmd == "open": 37 repath = "" 38 if not self.open_path(arg): 39 print("DEBUG: stop opening after " + arg) 40 repath = "" 41 break 42 if repath: 43 self.open_path(repath) 44 45 46 def create_menu(self): 47 super().create_menu() 48 self.menufile = tkinter.Menu(self.master, tearoff = 0) 49 self.menubar.add_cascade(menu = self.menufile, 50 label = "File") 51 self.menufile.add_separator() 52 self.menufile.add_command( 53 command = self.on_exit, 54 label = "Quit") 55 56 def path_default(self, path): 57 self.switch_view(0) 58 self.update_gui("Outline") 59 self.clear_info() 60 self.add_info("Open path\n\n" + str(path)) 61 62 self.add_info("\n\n") 63 self.add_info("<a href=\"http://example.com/test\">example.com</a>\n") 64 self.add_info("\n\n<b>This is multi-") 65 self.add_info("line\nbold</b> text\n") 66 self.add_info("\n\n<u>This is multi-") 67 self.add_info("line\nunderline</u> text\n") 68 self.add_info("\n\n<font color=\"#ff00FF\">This is multi-") 69 self.add_info("line\ncolor</font> text\n") 70 71 self.add_info("\n<font bg=\"red\" color=\"white\"> <b>White</b> on <i>red</i> </font>\n") 72 73 self.insert_lb_act("Testing", "/test") 74 return True 75 76 def path_test(self, path): 77 if len(path) > 1: 78 return self.path_test_item(path) 79 if self.last_path != ("test",): 80 self.update_gui("Test") 81 self.insert_lb_act("Outline", []) 82 self.insert_lb_act("-", None) 83 self.insert_lb_act("Info", "/test/info") 84 self.insert_lb_act("Image", "/test/image") 85 self.switch_view(0) 86 self.clear_info() 87 self.add_info("Select test from outline") 88 return True 89 90 def path_test_item(self, path): 91 def display_page(): 92 item = None 93 path = self.curr_path 94 if len(path) > 2: 95 item = path[2] 96 self.clear_info() 97 sm = self.gl_state.get("test.info.mode", 0) 98 if item is None: 99 sm = -1 100 self.upd_toolgrp(self.curr_state["gbtns"], sm) 101 if item is None: 102 self.switch_view(0) 103 self.add_info("Select item " + path[1]) 104 else: 105 if path[1] == "image": 106 self.switch_view(1) 107 self.main_image = tkinter.PhotoImage(file = "img/splash.gif") 108 elif path[1] == "info": 109 self.switch_view(0) 110 self.add_info("Information panel for {}\n".format(path)) 111 self.add_info("Local mode {}\n".format( 112 self.curr_state.get("mode", None))) 113 self.add_info("Global mode {}\n".format( 114 self.gl_state.get("test.info.mode", None))) 115 for i in range(100): 116 self.add_info(" Item {}\n".format(i)) 117 118 if self.last_path[:2] != ("test", path[1]): 119 self.update_gui("Test %s" % path[1]) 120 self.insert_lb_act("Testing", "/test") 121 self.insert_lb_act("-", None) 122 for i in range(15): 123 self.insert_lb_act("{} #{}".format(path[1], i), 124 path[:2] + (i,), i) 125 # create mode buttons 126 def sw_mode1(): 127 print("Mode 1") 128 self.curr_state["mode"] = 1 129 self.curr_state["btn1"].config(state = tkinter.DISABLED) 130 self.curr_state["btn2"].config(state = tkinter.NORMAL) 131 display_page() 132 def sw_mode2(): 133 print("Mode 2") 134 self.curr_state["mode"] = 2 135 self.curr_state["btn1"].config(state = tkinter.NORMAL) 136 self.curr_state["btn2"].config(state = tkinter.DISABLED) 137 display_page() 138 self.curr_state["btn1"] = self.add_toolbtn("Mode 1", sw_mode1) 139 self.curr_state["btn1"].config(state = tkinter.DISABLED) 140 self.curr_state["btn2"] = self.add_toolbtn("Mode 2", sw_mode2) 141 # we store buttons in local state 142 self.curr_state["gbtns"] = self.add_toolgrp(None, "test.info.mode", 143 {0: "mode 1", 1: "mode 2", 2: "mode 3"}, display_page) 144 145 # change 146 item = None 147 if len(path) > 2: 148 # index 149 self.select_lb_item(path[2]) 150 else: 151 self.select_lb_item(None) 152 # display 153 display_page() 154 return True 155 156def main(): 157 root = tkinter.Tk() 158 app = App(master = root) 159 argv = sys.argv[1:] 160 while len(argv) > 0: 161 if argv[0] == "--nooutline": # open data 162 app.gui_setup["outline"] = False 163 argv = argv[1:] 164 else: 165 app.start_act.append(["open", argv[0]]) 166 argv = argv[1:] 167 app.mainloop() 168 169if __name__ == "__main__": 170 main() 171