def show_control(master, data): """Выводит блокнот управления с пятью закладками""" if data.is_restart: reload(control_a) reload(control_b) reload(control_c) reload(control_d) reload(control_e) reload(control_f) from control_a import show_goods from control_b import show_calc from control_c import show_sales_goods from control_d import show_sales from control_e import show_others from control_f import show_plus def tab_changes(tab): """функция, срабатывающая при нажатии закладок переключения между правыми (основными) фреймами""" window_names = controlTabs.tabs() index = window_names.index(controlTabs.select()) if not FLAGS[index]: CONTROL[index](workArea[index], data) #нужна ли эта дата? FLAGS[index] = True else: CONTROL[index].renew() CONTROL = (show_goods, show_calc, show_sales_goods, show_sales, show_others, show_plus) FLAGS = [False, False, False, False, False, False] heads = (u' Товары ', u' Калькуляции ', u' Акционные товары ', u' Акционные цены ', u' Категории, скидки, причины списания ', u' Дополнительно ') workArea = [] controlTabs = Notebook(master) for q in range (6): frame = Canvas(controlTabs, relief=GROOVE, highlightthickness=0) if USE_BACKGROUND: frame.create_image(0,0, anchor='nw', image=data.photo) controlTabs.add(frame, text=heads[q]) workArea.append(frame) controlTabs.pack(side=TOP, fill=BOTH, expand=YES) controlTabs.bind('<<NotebookTabChanged>>', tab_changes) Style().configure("TNotebook.Tab", font=('Verdana', FONT_SIZE))
class Application(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master) self.master = master self.master.title("Netstat Live") self.pack(fill=tk.BOTH, expand=tk.Y) master.protocol("WM_DELETE_WINDOW", self.app_quit) self._app_quit = False self._freeze = False self.tabs = Notebook(self) self.tabs_frames = OrderedDict() self.tabs_frames['TCP4'] = {'query': netstat_tcp4} self.tabs_frames['UDP4'] = {'query': netstat_udp4} self.tabs_frames['TCP6'] = {'query': netstat_tcp6} self.tabs_frames['UDP6'] = {'query': netstat_udp6} for tab in self.tabs_frames: # Creating tabs self.tabs_frames[tab]['tab'] = tk.Frame(self.tabs) self.tabs.add(self.tabs_frames[tab]['tab'], text=tab) #self.tabs_frames[tab]['tab'].pack(fill=tk.BOTH) # Adding Treeview widget to tabs self.tabs_frames[tab]['tbl'] = Treeview(self.tabs_frames[tab]['tab']) self.tabs_frames[tab]['tbl']['columns'] = ('Pid', 'User', 'Local addr', 'Remote addr', 'State') for column in self.tabs_frames[tab]['tbl']['columns']: self.tabs_frames[tab]['tbl'].heading(column, text=column) self.tabs_frames[tab]['tbl'].column(column, width=150) self.tabs_frames[tab]['scrollbar_y'] = Scrollbar(self.tabs_frames[tab]['tab'], orient=tk.VERTICAL, command=self.tabs_frames[tab]['tbl'].yview) self.tabs_frames[tab]['tbl']['yscroll'] = self.tabs_frames[tab]['scrollbar_y'].set self.tabs_frames[tab]['scrollbar_y'].pack(side=tk.RIGHT, fill=tk.Y) self.tabs_frames[tab]['tbl'].pack(expand=tk.Y, fill=tk.BOTH) # Bind right click event for displaying context menu self.tabs_frames[tab]['tbl'].bind('<Button-3>', self.context_menu_popup) self.tabs_frames[tab]['tbl'].bind('<Button-1>', self.context_menu_unpost) # Creating queue for each tab self.tabs_frames[tab]['queue'] = Queue(maxsize=1) self.tabs.pack(fill=tk.BOTH, expand=tk.Y) # Freeze button self.buttons = tk.Frame(master) self.buttons.pack(side=tk.BOTTOM, fill=tk.BOTH) self.freeze_btn = tk.Button(self.buttons, text='Freeze', command=self.freeze_btn_handler) self.freeze_btn.pack(side=tk.RIGHT) # Check dependencies self._xclip = True self._whois = True try: out = subprocess.check_output(['xclip', '-h'], stderr=subprocess.STDOUT) except: self._xclip = False try: out = subprocess.check_output(['whois', '--version'], stderr=subprocess.STDOUT) except: self._whois = False # Connections list context menu self._remote_addr = '' self.context_menu = tk.Menu(self, tearoff=0) if self._xclip: self.context_menu.add_command(label='Copy remote addr.', command=self.xclip) if self._whois: self.context_menu.add_command(label='Whois', command=self.whois) self.tabs.bind('<Button-1>', self.context_menu_unpost) self.poll = Thread(target=self.thread) self.poll.start() def context_menu_popup(self, event): current_tab = self.get_active_tab() tbl = self.tabs_frames[current_tab]['tbl'] item = tbl.identify_row(event.y) if item and len(tbl.get_children(item)) == 0: tbl.selection_set(item) # Get remote addr value self._remote_addr = tbl.set(item, column='Remote addr') self.context_menu.post(event.x_root, event.y_root) else: # Mouse pointer is not over item pass def context_menu_unpost(self, event): self.context_menu.unpost() def get_active_tab(self): try: current_tab = self.tabs.tab(self.tabs.select(), 'text') return current_tab except RuntimeError: # Sometimes raised on KeyboardInterrupt sys.stderr.write('Terminated.\n') self._app_quit = True sys.exit(0) def thread(self): while not self._app_quit: current_tab = self.tabs_frames[self.get_active_tab()] if current_tab['queue'].empty(): # Get netstat data try: netstat = current_tab['query']() except RuntimeError: sys.stderr.write('Main thread destroyed.\n') # Put to queue current_tab['queue'].put(netstat, True) else: sleep(0.5) def app_quit(self): self._app_quit = True self.master.destroy() def refresh(self): current_tab = self.get_active_tab() queue = self.tabs_frames[current_tab]['queue'] if not self._freeze and not queue.empty(): # Get active tab tbl = self.tabs_frames[current_tab]['tbl'] # Remember focus self.tabs_frames[current_tab]['focus'] = tbl.selection() data = queue.get(False) processes = [] for proc in data: processes.append(proc[6]) processes = tuple(set(processes)) # Unique list of processes in netstat # Clear tree: for proc in tbl.get_children(): tbl.delete(*tbl.get_children(proc)) for proc in processes: proc_name = '%s (%s)' % (os.path.basename(str(proc)), str(proc)) if not tbl.exists(proc_name): # Create root items for each process name tbl.insert('', 'end', proc_name, text=proc_name) for proc in data: proc_name = '%s (%s)' % (os.path.basename(str(proc[6])), str(proc[6])) # Pid User Local addr Remote addr State values = (str(proc[5]), str(proc[1]), str(proc[2]), str(proc[3]), str(proc[4])) h = hash(tuple(proc)) try: tbl.insert(proc_name, 'end', h, text=proc_name, values=values) except: pass # Removing empty root items for proc in tbl.get_children(): if len(tbl.get_children(proc)) == 0: tbl.delete(proc) # Restore focus try: tbl.selection_set(self.tabs_frames[current_tab]['focus']) except: pass self.master.after(500, self.refresh) def freeze_btn_handler(self): # Toggle freeze state if self._freeze: self.freeze_btn['text'] = 'Freeze' else: self.freeze_btn['text'] = 'Continue' self._freeze = not self._freeze def xclip(self, data=None): if not data: data = self._remote_addr try: xclip = subprocess.Popen(['xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE) xclip.communicate(input=data) xclip.terminate() except: pass def whois(self, addr=None): if not addr: addr = self._remote_addr addr = addr.split(':') try: reverse = subprocess.check_output(['dig', '+short', '-x', addr[0]]) except: reverse = None try: out = subprocess.check_output(['whois', addr[0]]) except: out = 'No info for this host.' self.whois_popup = {} self.whois_popup['window'] = tk.Toplevel(self) self.whois_popup['window'].title('Whois %s' % addr[0]) self.whois_popup['frame'] = tk.Frame(self.whois_popup['window']) self.whois_popup['frame'].pack(fill=tk.BOTH, expand=tk.Y) self.whois_popup['text'] = tk.Text(self.whois_popup['frame'], wrap=tk.WORD, height=32, width=96) self.whois_popup['text'].pack(fill=tk.BOTH, expand=tk.Y, side=tk.LEFT) self.whois_popup['scrollbar_y'] = Scrollbar(self.whois_popup['frame']) self.whois_popup['scrollbar_y'].config(command=self.whois_popup['text'].yview) self.whois_popup['scrollbar_y'].pack(side=tk.RIGHT, fill=tk.Y) self.whois_popup['text'].config(yscrollcommand=self.whois_popup['scrollbar_y'].set) if reverse: reverse = 'Reverse lookup: %s\n' % reverse self.whois_popup['text'].insert(tk.END, reverse) self.whois_popup['text'].insert(tk.END, out) tk.Button(self.whois_popup['window'], text='Ok', command=self.whois_popup['window'].destroy).pack()
def show_main_frame(root): """Создаем основное окно программы""" #------------------------------------------------------------ def press(button): """функция, срабатывающая при нажатии кнопок переключения между правыми (основными) фреймами""" index = BUTTONS.index(button) window_names = rightFrameTabs.tabs() rightFrameTabs.select(window_names[index]) #-------------------------------------------------------------- def tab_changes(tab): """функция, срабатывающая при нажатии закладок переключения между правыми (основными) фреймами""" window_names = rightFrameTabs.tabs() index = window_names.index(rightFrameTabs.select()) button = BUTTONS[index] for but in BUTTONS: if but <> button: but['style'] = 'Default.TButton' else: but['style'] = 'Chosen.TButton' if button == button_rule: if not checks_exist('Остались незакрытые счета!\nВы уверены, ' + ' что хотите перейти в раздел "Управление"?\nвсе незакрытые'+ ' счета в таком случае будут для вас потеряны!'): press(button_sell) if not FLAGS[index]: SHOW[index](workArea[index],data) FLAGS[index] = True #------------------------------------------------------------- leftFrame = Canvas(root, width=PANEL_WIDTH, highlightthickness=0) leftFrame.pack(side=LEFT, fill=Y) leftFrame.pack_propagate(False) if USE_BACKGROUND: leftFrame.create_image(0,0, anchor='nw', image=data.photo) heads = (u'Продажи', u'Отчеты', u'Приход', u'Списание', u'Сверка', u'Управление', u'Настройки',) workArea = [] rightFrameTabs = Notebook(root, style='Hidden.TNotebook') for q in range (7): frame = Canvas(rightFrameTabs, relief=GROOVE) rightFrameTabs.add(frame, text=heads[q]) workArea.append(frame) rightFrameTabs.pack(side=TOP, fill=BOTH, expand=YES) rightFrameTabs.bind('<<NotebookTabChanged>>', tab_changes) button_sell = Button(leftFrame, text = u'\nПРОДАЖИ\n', command=lambda: press(button_sell)) button_sell.pack(side=TOP, padx=10, pady=10, fill=X) button_comings = Button(leftFrame, text = u'\nПРИХОД\n', command=lambda: press(button_comings)) button_comings.pack(side=TOP, padx=10, pady=10, fill=X) button_lost = Button(leftFrame, text = u'\nСПИСАНИЕ\n', command=lambda: press(button_lost)) button_lost.pack(side=TOP, padx=10, pady=10, fill=X) button_inventory = Button(leftFrame, text = u'\nСВЕРКА\n', command=lambda: press(button_inventory)) button_inventory.pack(side=TOP, padx=10, pady=10, fill=X) button_reports = Button(leftFrame, text = u'\nОТЧЕТЫ\n', command=lambda: press(button_reports)) button_reports.pack(side=TOP, padx=10, pady=10, fill=X) button_rule = Button(leftFrame, text = u'\nУПРАВЛЕНИЕ\n', command=lambda: press(button_rule)) button_rule.pack(side=TOP, padx=10, pady=10, fill=X) button_exit = Button(leftFrame, text = u'\nВЫХОД\n', command=shutdown, style='Default.TButton') button_exit.pack(side=BOTTOM, padx=10, pady=10, fill=X) button_options = Button(leftFrame, text = u'\nНАСТРОЙКА\n', command=lambda: press(button_options)) button_options.pack(side=BOTTOM, padx=10, pady=10, fill=X) BUTTONS = (button_sell, button_reports, button_comings, button_lost, button_inventory, button_rule, button_options) SHOW = (show_sell, show_report, show_incoming, show_lost, show_verify, show_control, show_options) FLAGS = [True, False, False, False, False, False, True] styles() press(button_sell) return workArea