Пример #1
0
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))
Пример #2
0
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()
Пример #3
0
    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