Ejemplo n.º 1
1
    def show(frame, iterator):
        """Выводит на экран выборку, заданную в iterator"""

        scrollbar = Scrollbar(frame)
        tree = Treeview(frame, selectmode='none', padding=3,
                                style='Custom.Treeview', height=REPORT_HEIGHT,
                                yscrollcommand=scrollbar.set)
        tree.pack(side=LEFT, fill=BOTH, expand=YES)
        scrollbar.config(command=tree.yview)
        scrollbar.pack(side=LEFT, fill=Y)

        tree.tag_configure('1', font=('Verdana', FONT_SIZE_REPORT))
        tree.tag_configure('2', font=('Verdana', FONT_SIZE_REPORT),
                                                           background='#f5f5ff')

        Style().configure('Custom.Treeview', rowheight=FONT_SIZE_REPORT*2)

        columns = ['#' + str(x + 1) for x in range(8)]
        tree.configure(columns=columns)

        for q in range(len(header)):
            tree.heading('#%d' % (q + 1), text=header[q], anchor='w')
            tree.column('#%d' % (q + 1), width=REPORT_SCALE * col_width[q + 1],
                                                                     anchor='w')
        tree.heading('#0', text='', anchor='w')
        tree.column('#0', width=0, anchor='w', minwidth=0)

        flag = True
        summ = 0
        for item in iterator:

            value = item.quantity * item.price * (100 - item.discount) / 100
            summ += value

            col = []
            col.append(add_s(item.check.id))
            col.append(add_s(item.goods.cathegory.name))
            col.append(add_s(item.goods.name))
            col.append(add_s(item.quantity))
            col.append(add_s(item.discount) +'%' if item.discount else ' -- ')
            col.append(add_s(u'%6.2f грн.' % value))
            col.append(add_s(item.check.date_time.strftime('%d.%m.%Y')))
            col.append(add_s(item.check.date_time.time())[:8])

            flag = not flag
            if flag:
                tree.insert('', 'end', text='', values=col, tag='2')
            else:
                tree.insert('', 'end', text='', values=col, tag='1')

        return summ
Ejemplo n.º 2
0
def start_browse_teams():
    global root
    root = Tk()
    root.title("Browse Teams")
    root.minsize(width=500, height=500)

    browse_teams_tree = Treeview(root)
    browse_teams_tree["columns"] = ("1", "2", "3", "4", "5")
    browse_teams_tree.column("1", width=100)
    browse_teams_tree.column("2", width=100)
    browse_teams_tree.column("3", width=100)
    browse_teams_tree.column("4", width=100)
    browse_teams_tree.column("5", width=100)
    browse_teams_tree.heading("1", text="Team ID")
    browse_teams_tree.heading("2", text="Camp ID")
    browse_teams_tree.heading("3", text="Team Name")
    browse_teams_tree.heading("4", text="Max Number of Members")
    browse_teams_tree.heading("5", text="Number of Members")

    index = 0
    for team_id in Team.get_all_ids():
        current_team = Team.select_team(team_id[0])
        browse_teams_tree.insert('', index, text= "row" + str(index + 1), values = (team_id[0], current_team[0], current_team[1], current_team[2], current_team[3]))
        index += 1

    browse_teams_tree.pack()

    exit_browse_teams_bt = Button(root, text="Exit", width=30, command = exit_browse_teams_bt_handler)
    exit_browse_teams_bt.pack(expand=True)
    root.mainloop()
Ejemplo n.º 3
0
    def __init__(self, parent, process, x, y):
        Toplevel.__init__(self, parent)
        self.wm_overrideredirect(True)
        self.wm_geometry("+%d+%d" % (x+25,y+20))
        label = Label(self, text="", justify='left',
                       background='white', relief='solid', borderwidth=1,
                       font=("times", "12", "normal"))
        label.pack(ipadx=20)
        tree = Treeview(label)
        tree["columns"] = ("value")
        tree.column("#0", minwidth=0, width=100)
        tree.column("#1", minwidth=0, width=100)
        tree.heading("#0", text="Name")
        tree.heading("#1", text="Value")

        for A, state in process.state.items():
            if isinstance(A, Algorithm):
                tree.insert("", 0, iid=A, text=str(A), values=("",))
                for key, val in state.items():
                    tree.insert(A, 0, text=key, values=(val,))
        for key, val in process.state.items():
            if not isinstance(key, Algorithm):
                tree.insert("", 0, text=key, values=(val,))
        tree.insert("", 0, text="UID", values=(process.UID,))
        tree.pack()
Ejemplo n.º 4
0
def start_browse_campers():
    global root
    root = Tk()
    root.title("Browse Campers")
    root.minsize(width=500, height=500)

    browse_camps_tree = Treeview(root)
    browse_camps_tree["columns"] = ("Camper ID", "First Name", "Last Name",
                                    "Date of Birth", "Gender", "Address",
                                    "Camps IDs", "Bunkhouses IDs", "Teams IDs")
    browse_camps_tree.column("Camper ID", width=100)
    browse_camps_tree.column("First Name", width=100)
    browse_camps_tree.column("Last Name", width=100)
    browse_camps_tree.column("Date of Birth", width=100)
    browse_camps_tree.column("Gender", width=100)
    browse_camps_tree.column("Address", width=100)
    browse_camps_tree.column("Camps IDs", width=100)
    browse_camps_tree.column("Bunkhouses IDs", width=100)
    browse_camps_tree.column("Teams IDs", width=100)
    browse_camps_tree.heading("Camper ID", text="Camper ID")
    browse_camps_tree.heading("First Name", text="First Name")
    browse_camps_tree.heading("Last Name", text="Last Name")
    browse_camps_tree.heading("Date of Birth", text="Date of Birth")
    browse_camps_tree.heading("Gender", text="Gender")
    browse_camps_tree.heading("Address", text="Address")
    browse_camps_tree.heading("Camps IDs", text="Camps IDs")
    browse_camps_tree.heading("Bunkhouses IDs", text="Bunkhouses IDs")
    browse_camps_tree.heading("Teams IDs", text="Teams IDs")

    index = 0
    for camper_id in Camper.get_all_ids():
        current_camper = Camper(camper_id[0])
        data = current_camper.select_camper()
        data2 = Bunkhouse.select_camp_team_bunkhouse(camper_id[0])
        browse_camps_tree.insert('',
                                 index,
                                 text="row" + str(index + 1),
                                 values=(camper_id, data[0], data[1], data[2],
                                         data[3], data[4], data2[0][:-2],
                                         data2[2][:-2], data2[1][:-2]))
        index += 1

    browse_camps_tree.pack()

    exit_browse_camp_bt = Button(root,
                                 text="Exit",
                                 width=30,
                                 command=exit_browse_camp_bt_handler)
    exit_browse_camp_bt.pack(expand=True)
    root.mainloop()
Ejemplo n.º 5
0
 def mostra_historic(self):
     popup = Toplevel()
     agenda_historic = Treeview(
         popup,
         columns=["nom", "tel", "email", "path", "accio", "data"],
         show="headings")
     agenda_historic.heading("nom", text="Nom")
     agenda_historic.heading("tel", text="Telefon")
     agenda_historic.heading("email", text="Email")
     agenda_historic.heading("path", text="Path")
     agenda_historic.heading("accio", text="Acció")
     agenda_historic.heading("data", text="Data")
     agenda_historic.column("nom",
                            minwidth=0,
                            width=150,
                            stretch=True,
                            anchor="c")
     agenda_historic.column("tel",
                            minwidth=0,
                            width=100,
                            stretch=True,
                            anchor="c")
     agenda_historic.column("email",
                            minwidth=0,
                            width=150,
                            stretch=True,
                            anchor="c")
     agenda_historic.column("path",
                            minwidth=0,
                            width=200,
                            stretch=True,
                            anchor="c")
     agenda_historic.column("accio",
                            minwidth=0,
                            width=100,
                            stretch=True,
                            anchor="c")
     agenda_historic.column("data",
                            minwidth=0,
                            width=150,
                            stretch=True,
                            anchor="c")
     agenda_historic.grid(row=0, column=0, padx=5, pady=5)
     self.cursor.execute("select * from HISTORIC ORDER BY data DESC;")
     dades = self.cursor.fetchall()
     for data_usuari in dades:
         agenda_historic.insert('', 'end', values=data_usuari)
Ejemplo n.º 6
0
class FilamentReport(Toplevel):
	def __init__(self, app, printer, settings, logger, *arg):
		self.app = app
		self.printer = printer
		self.settings = settings
		self.logger = logger
		
		layers = self.app.gcodeInfo.layerOrder
		usage = self.app.gcodeInfo.filLayers

		self.selection = None
		
		Toplevel.__init__(self, app, *arg)
		self.title("Layer by Layer Filament Usage")
		self.protocol("WM_DELETE_WINDOW", self.doCancel)

		f = Frame(self)
		f.grid(row=1, column=1, rowspan=1, padx=10)

		self.tree = Treeview(self, height=12, selectmode='browse')
		self.sb = Scrollbar(self)
		self.sb.config(command=self.tree.yview)
		self.tree.config(yscrollcommand=self.sb.set)

		ln = []
		for l in layerinfo:
			ln.append(l[0])
		del ln[0]
		self.tree.config(columns=ln)
		
		for l in layerinfo:
			self.tree.column(l[0], width=l[1], anchor=l[2])
			self.tree.heading(l[0], text=l[3])

		self.sb.pack(side=RIGHT, fill=Y)
		self.tree.pack(side=LEFT, fill=BOTH, expand=1)

		prev = 0.0	
		tl = layers[-1]
		total = usage[tl]		
		for l in layers:
			n = usage[l]
			self.tree.insert('', 'end', text=l, values=("%7.3f" % (n-prev), "%9.3f" % n, "%9.3f" % (total-n)))
			prev = n

	def doCancel(self):
		self.app.closeFilamentReport()
Ejemplo n.º 7
0
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.tree = Treeview(self)

        self.tree["columns"] = ("item1", "item2")
        self.tree.heading("item1", text="Column 1")
        self.tree.heading("item2", text="Column 2")

        self.tree.insert("", 0, text="Item 1", values=("Value 1", "Value 2"))

        row2 = self.tree.insert("", 1, "row2", text="Item 2")
        self.tree.insert(row2,
                         "end",
                         "item1",
                         text="Item 1",
                         values=("3", "7"))
        self.tree.insert(row2,
                         "end",
                         "item2",
                         text="Item 2",
                         values=("2", "5"))

        self.tree.pack(expand=1, fill="both")

        self.delete = Button(self, text="Delete Row", command=self.on_delete)
        self.delete.pack(side="bottom")

    def on_delete(self):
        try:
            selected_item = self.tree.selection()[0]
            self.tree.delete(selected_item)
        except IndexError:
            pass
Ejemplo n.º 8
0
def start_query_browse():
    global root
    root = Tk()
    root.title("Browse Camps, Bunkhouse and Teams")
    root.minsize(width=500, height=500)

    browse_query_tree = Treeview(root)
    browse_query_tree["columns"] = ("1", "2", "3", "4", "5", "6", "7", "8",
                                    "9")
    browse_query_tree.column("1", width=100)
    browse_query_tree.column("2", width=100)
    browse_query_tree.column("3", width=100)
    browse_query_tree.column("4", width=100)
    browse_query_tree.column("5", width=100)
    browse_query_tree.column("6", width=100)
    browse_query_tree.column("7", width=100)
    browse_query_tree.column("8", width=100)
    browse_query_tree.column("9", width=100)
    browse_query_tree.heading("1", text="Bunkhouses IDs")
    browse_query_tree.heading("2", text="Camps IDs")
    browse_query_tree.heading("3", text="Camp Start Date")
    browse_query_tree.heading("4", text="Camp End Date")
    browse_query_tree.heading("5", text="Camper ID")
    browse_query_tree.heading("6", text="First Name")
    browse_query_tree.heading("7", text="Last Name")
    browse_query_tree.heading("8", text="Gender")
    browse_query_tree.heading("9", text="Teams IDs")

    index = 0
    for row_data in Bunkhouse.get_all_query_data():
        browse_query_tree.insert('',
                                 index,
                                 text="row" + str(index + 1),
                                 values=(row_data[0], row_data[1], row_data[2],
                                         row_data[3], row_data[4], row_data[5],
                                         row_data[6], row_data[7],
                                         row_data[8]))
        index += 1

    browse_query_tree.pack()

    exit_bt = Button(root, text="Exit", width=30, command=exit_bt_handler)
    exit_bt.pack(expand=True)
    root.mainloop()
Ejemplo n.º 9
0
    def show(frame, iterator):
        """Выводит на экран выборку, заданную в iterator"""

        scrollbar = Scrollbar(frame)
        tree = Treeview(frame, selectmode='none', padding=3,
                                    style='Custom.Treeview', height=REPORT_HEIGHT,
                                    yscrollcommand=scrollbar.set)
        tree.pack(side=LEFT, fill=BOTH, expand=YES)
        scrollbar.config(command=tree.yview)
        scrollbar.pack(side=LEFT, fill=Y)

        tree.tag_configure('1', font=('Verdana', FONT_SIZE_REPORT))
        tree.tag_configure('2', font=('Verdana', FONT_SIZE_REPORT),
                                                           background='#f5f5ff')

        Style().configure('Custom.Treeview', rowheight=FONT_SIZE_REPORT*2)

        columns = ['#' + str(x + 1) for x in range(7)]
        tree.configure(columns=columns)

        for q in range(len(header)):
            tree.heading('#%d' % (q + 1), text=header[q], anchor='w')
            tree.column('#%d' % (q + 1), width=REPORT_SCALE * col_width[q + 1],
                                                                     anchor='w')
        tree.heading('#0', text='', anchor='w')
        tree.column('#0', width=0, anchor='w', minwidth=0)

        flag = True
        for item in iterator:
            col = []
            col.append(add_s(item.goods.cathegory.name if item.goods.cathegory
                                                                 else u'-Нет-'))
            col.append(add_s(item.goods.name))
            col.append(add_s(item.quantity))
            col.append(add_s(item.goods.measure))
            col.append(add_s(item.date_time.strftime('%d.%m.%Y')))
            col.append(add_s(item.reason.reason))
            col.append(form(item.full_reason))

            flag = not flag
            if flag:
                tree.insert('', 'end', text='', values=col, tag='2')
            else:
                tree.insert('', 'end', text='', values=col, tag='1')
Ejemplo n.º 10
0
def start_browse_camps():
    global root
    root = Tk()
    root.title("Browse Camps")
    root.minsize(width=500, height=500)

    browse_camps_tree = Treeview(root)
    browse_camps_tree["columns"] = ("Camp ID", "Start Date", "End Date",
                                    "Number of Bunckhouses", "Number of Teams",
                                    "Cost")
    browse_camps_tree.column("Camp ID", width=100)
    browse_camps_tree.column("Start Date", width=100)
    browse_camps_tree.column("End Date", width=100)
    browse_camps_tree.column("Number of Bunckhouses", width=100)
    browse_camps_tree.column("Number of Teams", width=100)
    browse_camps_tree.column("Cost", width=100)
    browse_camps_tree.heading("Camp ID", text="Camp ID")
    browse_camps_tree.heading("Start Date", text="Start Date")
    browse_camps_tree.heading("End Date", text="End Date")
    browse_camps_tree.heading("Number of Bunckhouses",
                              text="Number of Bunckhouses")
    browse_camps_tree.heading("Number of Teams", text="Number of Teams")
    browse_camps_tree.heading("Cost", text="Cost")

    index = 0
    for camp_id in Camp.get_all_ids():
        current_camp = Camp(camp_id[0])
        data = current_camp.select_camp()
        browse_camps_tree.insert('',
                                 index,
                                 text="row" + str(index + 1),
                                 values=(camp_id, data[0], data[1], data[2],
                                         data[3], data[4]))
        index += 1

    browse_camps_tree.pack()

    exit_browse_camp_bt = Button(root,
                                 text="Exit",
                                 width=30,
                                 command=exit_browse_camp_bt_handler)
    exit_browse_camp_bt.pack(expand=True)
    root.mainloop()
Ejemplo n.º 11
0
def start_browse_payments():
    global root
    root = Tk()
    root.title("Browse Payments")
    root.minsize(width=500, height=500)

    browse_payments_tree = Treeview(root)
    browse_payments_tree["columns"] = ("1", "2", "3", "4", "5", "6")
    browse_payments_tree.column("1", width=100)
    browse_payments_tree.column("2", width=100)
    browse_payments_tree.column("3", width=100)
    browse_payments_tree.column("4", width=100)
    browse_payments_tree.column("5", width=100)
    browse_payments_tree.column("6", width=100)
    browse_payments_tree.heading("1", text="Payment ID")
    browse_payments_tree.heading("2", text="Camper ID")
    browse_payments_tree.heading("3", text="Camp ID")
    browse_payments_tree.heading("4", text="Date of Payment")
    browse_payments_tree.heading("5", text="Amount Paid")
    browse_payments_tree.heading("6", text="Camp Start Date")

    index = 0
    for payment_id in Payment.get_all_ids():
        current_payment = Payment(payment_id[0])
        data = current_payment.select_payment()
        mycamp = Camp(data[1])
        camp_start = mycamp.select_camp()[0]
        browse_payments_tree.insert('',
                                    index,
                                    text="row" + str(index + 1),
                                    values=(payment_id, data[0], data[1],
                                            data[2], data[3], camp_start))
        index += 1

    browse_payments_tree.pack()

    exit_payments_camp_bt = Button(root,
                                   text="Exit",
                                   width=30,
                                   command=exit_browse_payment_bt_handler)
    exit_payments_camp_bt.pack(expand=True)
    root.mainloop()
Ejemplo n.º 12
0
class MainWindow(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.treeview = None
        self.createui()
        self.loadtable()
        self.grid(sticky=(N, S, W, E))
        parent.grid_rowconfigure(0, weight=1)
        parent.grid_columnconfigure(0, weight=1)

    def createui(self):
        image = Image.open('header.png')
        photo = ImageTk.PhotoImage(image)
        lbl = Label(self, image=photo)
        lbl.image = photo
        lbl.grid(row=0, column=0, columnspan=2, sticky='ns')
        self.treeview = Treeview(self)
        self.treeview['columns'] = ['title']
        self.treeview.heading("#0", text='Repeticiones', anchor='center')
        self.treeview.column("#0", anchor="center", width=90)
        self.treeview.heading('title', text='Titulo', anchor='w')
        self.treeview.column('title', anchor='w', width=700)
        self.treeview.grid(sticky=(N, S, W, E))
        self.treeview.bind("<Double-1>", self.openlink)
        ysb = Scrollbar(self, width=18, orient='vertical', command=self.treeview.yview)
        ysb.grid(row=1, column=1, sticky='ns')
        self.treeview.configure(yscroll=ysb.set)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def openlink(self, event):
        item = self.treeview.identify('item', event.x, event.y)
        web = self.treeview.item(item, 'values')[1]
        webbrowser.open_new(web)

    def loadtable(self):
        self.treeview.delete(*self.treeview.get_children())
        sorted_x = sorted(dic.items(), key=lambda x: x[1][1], reverse=True)
        for key, value in sorted_x:
            self.treeview.insert('', 'end', text=str(value[1]), values=[value[0], key])
Ejemplo n.º 13
0
    def new_point(self):
        window = Toplevel(self)
        tree = Treeview(window)
        tree["columns"]=("1","2","3","4","5")
        tree.column("1", width=50)
        tree.column("2", width=50)
        tree.column("3", width=50)
        tree.column("4", width=50)
        tree.column("5", width=50)
        tree.heading("1", text="Played")
        tree.heading("2", text="Won")
        tree.heading("3", text="Lost")
        tree.heading("4", text="Points")
        
        rows = cur.execute('''SELECT * FROM point_table ORDER BY points DESC''')
        c = 0
        for row in rows:        
            tree.insert("" , c,text=str(row[1]), values=(row[2],row[3],row[4],row[5]))
            c+=1

        tree.pack()
Ejemplo n.º 14
0
tree.column('c5', width=100, anchor='center')
tree.column('c6', width=90, anchor='center')

#设置每列表头标题文本
tree.heading('c1', text='姓名')
tree.heading('c2', text='性别')
tree.heading('c3', text='年龄')
tree.heading('c4', text='部门')
tree.heading('c5', text='电话')
tree.heading('c6', text='QQ')
tree.pack(side=tkinter.LEFT, fill=tkinter.Y)

#Treeview组件与垂直滚动条结合
scrollBar.config(command=tree.yview)

#定义并绑定Treeview组件的鼠标单击事件


def treeviewClick(event):
    pass


tree.bind('<Button-1>', treeviewClick)

#插入演示数据

for i in range(100):
    tree.insert('', i, values=[str(i)] * 6)

#运行程序,启动事件循环
root.mainloop()
Ejemplo n.º 15
0
class TreeTable(Frame):
    """
    A table based on :class:`ttk.Treeview`.

    :Parameters:
        **master** : Tkinter or ttk widget
            The widget in which the :class:`TableTree` will reside.
        **headers** : list of str
            The column headers for the table.
        **data** : list of tuples
            Table data. There must be as many elements in each tuple as there \
            are headers. Each tuple in the list corresponds to a row in the \
            table.
    """
    def __init__(self, master, headers, data, name=None):
        Frame.__init__(self, master, name=name)
        #: column headers
        self.headers = headers
        #: table data
        self.data = data
        #: :class:`~ttk.Treeview` that only shows "headings" not "tree columns"
        self.tree = Treeview(self,
                             columns=self.headers,
                             show="headings",
                             name='tabletree')
        #: vertical scrollbar
        self.yscroll = Scrollbar(self,
                                 orient="vertical",
                                 command=self.tree.yview,
                                 name='table_yscroll')
        #: horizontal scrollbar
        self.xscroll = Scrollbar(self,
                                 orient="horizontal",
                                 command=self.tree.xview,
                                 name='table_xscroll')
        self.tree['yscrollcommand'] = self.yscroll.set  # bind to scrollbars
        self.tree['xscrollcommand'] = self.xscroll.set
        # position widgets and set resize behavior
        self.tree.grid(column=0, row=0, sticky=(N + E + W + S))
        self.yscroll.grid(column=1, row=0, sticky=(N + S))
        self.xscroll.grid(column=0, row=1, sticky=(E + W))
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)
        # build tree
        for col in self.headers:
            # NOTE: Use col as column identifiers, crafty!
            # NOTE: Also change col to title case using str.title()
            # NOTE: make lambda behave nicely in a loop using default arg!
            callback = lambda c=col: self.sortby(c, False)
            self.tree.heading(col, text=col.title(), command=callback)
            # adjust the column's width to the header string
            self.tree.column(col, width=tkFont.Font().measure(col.title()))
        # insert a new top-level treeview item by suing an empty string
        for item in self.data:
            self.tree.insert('', END, values=item)
            # adjust column's width if necessary to fit each value
            for idx, val in enumerate(item):
                col_width = tkFont.Font().measure(val)
                # option can be specified at least 3 ways: as (a) width=None,
                # (b) option='width' or (c) 'width', where 'width' can be any
                # valid column option.
                if self.tree.column(self.headers[idx], 'width') < col_width:
                    self.tree.column(self.headers[idx], width=col_width)

    def sortby(self, col, descending):
        """
        Sort table contents when a column header is clicked.

        :Parameters:
            **col**
                The column identifier of the column to sort.
            **descending**
                False if ascending, True if descending, switches each time.
        """
        logging.debug('sortby %s, descending: %s', col, descending)
        # grab values to sort
        data = [(self.tree.set(child, col), child)
                for child in self.tree.get_children('')]
        # now sort the data in place
        data.sort(reverse=descending)
        for idx, item in enumerate(data):
            self.tree.move(item[1], '', idx)
        # switch the heading so it will sort in the opposite direction
        callback = lambda: self.sortby(col, not descending)
        self.tree.heading(col, command=callback)
Ejemplo n.º 16
0
class WaitingRoom(cll.ClientListener, object): #Note: extending cll.ClientListener if Gui does not extend WaitingRoom
    def __init__(self):
        self.Names = []
        self.tree_headers = ['Player','Status','Address','Game','Color']
        self.quit = False   #quit program after wroom has been closed. it will be passed to Gui.quit

    def startWaitingRoomUI(self, pumpit):
        self.pumpit = True
        if 'pumpit' in locals():
            self.pumpit = pumpit
        cfg.wroom = Tk()
        cfg.wroom.protocol("WM_DELETE_WINDOW", self.quitWaitingRoom)

        """State variables - By using textvariable=var in definition widget is tied to this variable"""
        statusmsg_sv = StringVar() #needed
        entry_sv = StringVar(value = cfg.name)
        #entry_sv.trace("w", lambda name, index, mode, sv=entry_sv: self.changeName(sv))
        chatentry_sv = StringVar(value = "Press enter to chat")

        """Create and grid the outer content frame"""
        content = ttk.Frame(cfg.wroom) #, padding=(5, 5, 12, 0)) 		#Frame in cfg.wroom
        content.grid(column = 0, row = 0, sticky = (N,W,E,S))
        cfg.wroom.grid_columnconfigure(0, weight = 1)
        cfg.wroom.grid_rowconfigure(0, weight = 1)

        """Create the different widgets; note the variables that some widgets are bound to"""
        self.tree = Treeview(content, show="headings", columns=cfg.wroominstance.tree_headers, name = "treeview")
        self.tree.column("#1", minwidth = 100, width = 120, stretch = NO)
        self.tree.column("#2", minwidth = 30, width = 60, stretch = NO)
        self.tree.column("#3", minwidth = 30, width = 50, stretch = YES)
        self.tree.column("#4", minwidth = 30, width = 50, stretch = YES)
        self.tree.column("#5", minwidth = 30, width = 50, stretch = YES)
        namelbl = ttk.Label(content, text="Player name")
        self.nameentry = ttk.Entry(content, bg = 'white', textvariable = entry_sv, name = "nameentry")#, validatecommand=validateIt)
        colorlbl = ttk.Label(content, text="Player color")
        self.colorframe = ttk.Frame(content, name = "colorframe", borderwidth = 1, relief='sunken')
        lbl = ttk.Label(content, text="Send to player:")	#Label on the right
        self.log = Listbox(content, height = 5, bg = 'white', name = "logbox")#, listvariable=cmessagelog		#Listbox with messages
        self.chatAll = ttk.Button(content, text = 'Chat to All', command = self.chatToAll, default = 'active', width = '6',name = "chat")
        self.chatentry = ttk.Entry(content, bg = 'white', foreground = 'gray', textvariable = chatentry_sv, name = "chatentry", selectforeground = 'blue')
        testbtn = ttk.Button(content, text = 'Connections', command = self.test, default = 'active', width = '6', name = "testbtn")
        ready = ttk.Button(content, text = 'Ready', command = self.toggleReadyForGame, default = 'active', width = '6', name = "readybtn")
        solitaire = ttk.Button(content, text = 'Solitaire', command = self.solitaire, default = 'active', width = '6', name = "solitairebtn")
        quit = ttk.Button(content, text = 'Quit', command = self.quitWaitingRoom, default = 'active', width = '6', name = "quitbtn")
        status = ttk.Label(content, textvariable = statusmsg_sv, anchor = W, name = "statuslbl") #Label on the bottom

        def get_tree():
            """Get from the self.tree an item when clicked"""
            idxs = self.tree.item(self.tree.focus())
            vals = idxs['values']
            if len(idxs['values'])==0: return None
            return vals
        """def sortby(tree, col, descending):
            Sort tree contents when a column header is clicked on
            # grab values to sort
            data = [(tree.set(child, col), child) \
                for child in tree.get_children('')]
            # now sort the data in place
            data.sort(reverse=descending)
            for ix, item in enumerate(data):
                tree.move(item[1], '', ix)
            # switch the heading so it will sort in the opposite direction
            tree.heading(col, command=lambda col=col: sortby(tree, col, int(not descending)))
        """
        def showstatus(*args):
            """Called when the selection in the listbox changes;
            Update the status message on the bottom with the new information"""
            list = get_tree()
            if list is None:
                return
            statusmsg_sv.set("Player %s has this status: %s" % (list[0], list[1]))

        # Grid all the widgets
        self.tree.grid(row = 0, column = 0, rowspan = 9, sticky = (N,S,E,W))
        namelbl.grid(row = 0, column = 1, columnspan = 2, sticky = (N,W), padx = 5)
        self.nameentry.grid(row = 1, column = 1, columnspan = 2, sticky = (N,E,W), pady = 5, padx = 5)
        colorlbl.grid(row = 0, column = 3, columnspan = 1, sticky = (N,W), padx = 5)
        self.colorframe.grid(row = 1, column = 3, columnspan = 1, sticky = (N,E,W), pady = 5, padx = 5)
        #testbtn.grid(row = 3, column = 3, columnspan = 1, sticky = E, padx = 5)		#Test Button
        self.log.grid(row = 5, column = 1, columnspan = 3, sticky = (N,S,E,W), padx = 5, pady = 5)   #Listbox with all messages
        self.chatentry.grid(row = 6, column = 1, columnspan = 2, sticky = (N,E), padx = 5, pady = 5)
        self.chatAll.grid(row = 6, column = 3, columnspan = 1, sticky = (N,E), padx = 5, pady = 5)
        ready.grid(row = 7, column = 1, sticky = (W,S), padx = 5, pady = 5)			#
        solitaire.grid(row = 7, column = 2, sticky = (W,S), padx = 5, pady = 5)
        quit.grid(row = 7, column = 3, sticky = (W,S), padx = 5, pady = 5)
        status.grid(row = 9, column = 0, columnspan = 2, sticky = (W,E))

        """Configure content Frame and color Frame"""
        content.grid_columnconfigure(0, weight = 1)
        content.grid_rowconfigure(5, weight = 1)
        h = self.nameentry.winfo_reqheight()
        self.colorframe.configure(height = h, bg = 'red')

        """Set event bindings"""
        self.tree.bind('<<TreeviewSelect>>', showstatus)
        self.nameentry.bind('<Return>', (lambda _: self.askChangeName(self.nameentry)))
        self.nameentry.bind('<FocusOut>', (lambda _: self.askChangeName(self.nameentry)))
        cfg.wroom.bind('<Control-Key-w>', self.quitWaitingRoom)
        cfg.wroom.bind('<Control-Key-q>', self.quitWaitingRoom)
        cfg.wroom.bind('<Control-Key-r>', self.toggleReadyForGame)
        cfg.wroom.bind('<Control-Key-s>', self.solitaire)
        self.chatentry.bind("<Return>",self.chatToAll)
        def chatEntryActive(e = None):
            self.chatentry.config(foreground = 'black')
            self.chatentry.delete(0, 'end')
        def chatEntryInactive(e = None):
            print(self)
            chatentry_sv.set("Press enter to chat")
            self.chatentry.config(foreground = 'gray')
        self.chatentry.bind("<FocusIn>", lambda e: chatEntryActive(e))
        self.chatentry.bind("<FocusOut>", lambda e: chatEntryInactive(e))
        self.colorframe.bind("<ButtonRelease-1>", self.changeColor)

        """Set tooltips on widgets"""
        hover.createToolTip(namelbl, "Type in your name")
        hover.createToolTip(self.nameentry, "Type in your name")
        hover.createToolTip(ready, "Toggle ready state to play tantrix with other players")
        hover.createToolTip(solitaire, "Start a two player game on this computer")
        hover.createToolTip(quit, "Quit Tantrix")
        hover.createToolTip(self.chatentry, "Press enter to send to chat")
        hover.createToolTip(self.chatAll, "Press enter to send to chat")
        hover.createToolTip(self.colorframe, "Click to select your color")
        hover.createToolTip(colorlbl, "Your color")

        """Set the starting state of the interface"""
        statusmsg_sv.set('')
        showstatus()

        """Start main loop for tkinter and Sixpodnet"""
        self.keepLooping = True
        if self.pumpit:
            self.mainLoopWithPump()
        else:
            self.mainLoopWithoutPump()
        return self.quit

    def test(self):
        if self.pumpit:
            self.send_to_server("test")

    def chatToAll(self, e = None):
        """Chat to every player in the wroom"""
        """Get the chat entry and add it to the local log"""
        msgList = [self.chatentry.get()]
        if len(msgList[0]) is 0: return
        """Send message to server"""
        self.sendChatToAll(msgList = msgList)
        """Clear chat entry"""
        self.chatentry.delete(0, 'end')
        self.chatentry.focus_set()


    def buildTree(self, tree_list):
        def sortby(tree, col, descending):
            """Sort tree contents when a column header is clicked on"""
            # grab values to sort
            data = [(tree.set(child, col), child) \
                for child in tree.get_children('')]
            # now sort the data in place
            data.sort(reverse=descending)
            for ix, item in enumerate(data):
                tree.move(item[1], '', ix)
            # switch the heading so it will sort in the opposite direction
            tree.heading(col, command=lambda col=col: sortby(tree, col, int(not descending)))

        for ind, col in enumerate(self.tree_headers):
            self.tree.heading(ind, text=col.title(),command=lambda c=col: sortby(self.tree, c, 0))#
            # adjust the column's width to the header string
            #self.tree.column(col, width=tkFont.Font().measure(col.title()))
        """Convert Status and Game to a better format, then insert in Treeview"""
        convert_status = {0: "Idle", 1: "Ready", -1: "Playing", -2: "Solitaire"}
        for item in tree_list:
            item[1] = convert_status[item[1]]
            if item[3] is None: item[3] = ""
            self.tree.insert('', 'end', values=item)
            # adjust column's width if necessary to fit each value
            #import Tkinter.font as tkFont
            #for ix, val in enumerate(item):
                #col_w = tkFont.Font().measure(val)
            #if self.tree.column(selfcfg.wroominstance.tree_headers[ix],width=None)<col_w:
                #self.tree.column(selfcfg.wroominstance.tree_headers[ix], width=col_w)

    def addToMessageLog(self, listToLog, fg = 'black'):
        """Add a line to the log listbox"""
        for item in listToLog:
            self.log.insert(END, item)
            self.log.itemconfig(END, {'fg': fg})
        self.log.select_set(END)
        self.log.yview(END)

    def searchTreeByHeader(self, val, header = 'Player'):
        """Return item in Treeview by player name"""
        val = str(val)
        items = self.tree.get_children()
        headerIndToSearchInto = cfg.wroominstance.tree_headers.index(header) # ['Player','Status','Address']
        for item in items:
            itemval = str(self.tree.item(item, 'values')[headerIndToSearchInto])
            if itemval.startswith(val):
                return item
        return None

    def editItemInTree(self, item, valList, headerList = ['Player']):
        """Edit an item of TreeView by its header(s)"""
        #Get the current (old) values as a list
        old_vals = self.tree.item(item)['values']
        #Create a list with the new values
        newvalues = list(old_vals)
        for ind, header in enumerate(headerList):
            #Get from headerList which index should be changed
            headerIndex = cfg.wroominstance.tree_headers.index(header)
            newvalues[headerIndex] = valList[ind]
        #Finally change the old values
        self.tree.item(item, values=newvalues)

    def removeFromTree(self, name = ''):
        """remove an item of TreeView by its name filed"""
        item = self.searchTreeByHeader(name, header = 'Player')
        if item is not None:
            self.tree.delete(item)

    def askChangeName(self, sv):
        """User wants to change name. Ask server if ok"""
        name = sv.get()
        self.sendChangedName(name)

    def changeName(self, name):
        """Server sends the name of this player"""
        self.nameentry.delete(0, END)
        self.nameentry.insert(0, name)
        cfg.name = name
        cfg.wroom.title(name + ": waiting room")
        cfg.wroom.update()

    def changeColor(self, e = None):
        current = self.colorframe.cget('bg')
        color_ind = cfg.PLAYERCOLORS.index(current) + 1
        color = cfg.PLAYERCOLORS[color_ind % 4]
        self.colorframe.configure(bg = color)
        cfg.playercolor = color
        self.sendChangedColor(color)

    def toggleReadyForGame(self, e = None):
        if self.pumpit:
            self.sendToggleReady()
            #Change button layout when clicked
            frame = cfg.wroom.winfo_children()[0]
            readybtn = frame.children['readybtn']
            """Configure the button"""
            if readybtn.config('relief')[4]=='raised':
                readybtn.configure(relief='sunken')
                readybtn.configure(bg = 'green')
            elif readybtn.config('relief')[4]=='sunken':
                readybtn.configure(relief='raised')
                readybtn.configure(bg = '#d6d6d6')
            sleep(0.1)
            cfg.wroom.update()

    def quitWaitingRoom(self, e = None):
        print("Quitting the waiting room")
        self.keepLooping = False
        self.quit = True    #used to quit everything after wroom has been closed
        if self.pumpit:
            self.send_to_server("quit")

    def solitaire(self, e = None):
        print("Starting a game on one client (solitaire)")
        cfg.solitaire = True
        self.keepLooping = False
        if self.pumpit:
            self.sendSolitaire()
        #cfg.wroominstance.tree = None

    def mainLoopWithoutPump(self):
        """Start main loop in waiting room. Do not use Sixpodnet to connect with server"""
        while self.keepLooping: #self.keepLooping changed by callbacks below
            """Update the boards"""
            cfg.wroom.update()
            cfg.wroom.update_idletasks()
        cfg.wroom.destroy()

    def mainLoopWithPump(self):
        """Start main loop in waiting room"""
        while self.keepLooping:      #self.keepLooping changed by callbacks below
            """Polling loop for the client. asks the connection singleton for any new messages from the network"""
            connection.Pump()
            """Server"""
            self.Pump()
            """Check if there is a connection. If so start the waiting room, else go to preSolitaire"""
            if cfg.connected:
                """Update the boards"""
                cfg.wroom.update()
                cfg.wroom.update_idletasks()
            else:
                global attempt2connect
                attempt2connect += 1
                if attempt2connect == 20:
                    self.solitaire()
        cfg.wroom.destroy()
Ejemplo n.º 17
0
class SnakeLog(Frame):

    def createMenubar(self, master):
        self.menubar = Menu(root)

        self.filemenu = Menu(self.menubar, tearoff=0)

        self.importmenu = Menu(self.filemenu)
        self.importmenu.add_command(label="from ADIF...", command=None)

        self.exportmenu = Menu(self.filemenu)
        self.exportmenu.add_command(label="to ADIF...", command=None)
        self.exportmenu.add_command(label="to Cabrillo...", command=None)

        self.filemenu.add_command(label="Open log...", command=None)
        self.filemenu.add_command(label="Save log as...", command=None)
        self.filemenu.add_separator()
        self.filemenu.add_cascade(label="Export", menu=self.exportmenu)
        self.filemenu.add_cascade(label="Import", menu=self.importmenu)
        self.filemenu.add_separator()
        self.filemenu.add_command(label="Exit", command=None)

        self.menubar.add_cascade(label="File", menu=self.filemenu)

        master.config(menu=self.menubar)

    def createQSOView(self, master):
        self.qsoviewScrollbar = Scrollbar(master)
        self.qsoview = Treeview(master, show=('headings'),
                                yscrollcommand=self.qsoviewScrollbar.set)


        self.qsoviewfields = {'day':            {'name': "D", 'width': 10},
                              'month':          {'name': "M", 'width': 10},
                              'year':           {'name': "Y", 'width': 20},
                              'timeon':         {'name': "Time", 'width': 30},
                              'timeoff':        {'name': "Timeoff", 'width': 30},
                              'band':           {'name': "Band", 'width': 20},
                              'freq':           {'name': "Frequency", 'width': 50},
                              'mode':           {'name': "Mode", 'width': 25},
                              'call':           {'name': "Call", 'width': 50},
                              'srst':           {'name': "S RST", 'width': 25},
                              'rrst':           {'name': "R RST",'width': 25},
                              'name':           {'name': "Name",'width': 40},
                              'grid':           {'name': "Gridsquare",'width': 30},
                              'iota':           {'name': "IOTA", 'width': 30},
                              'qsls':           {'name': "Q S",'width': 25},
                              'qsls_date':      {'name': "Q S D",'width': 50},
                              'qslr':           {'name': "Q R",'width': 25},
                              'qslr_date':      {'name': "Q R D",'width': 50},
                              'lotw_qsls':      {'name': "LQ S",'width': 25},
                              'lotw_qsls_date': {'name': "LQ S D",'width': 50},
                              'lotw_qslr':      {'name': "LQ R",'width': 25},
                              'lotw_qslr_date': {'name': "LQ R D",'width': 50}}


        self.qsoviewdisplayesfields = ('day', 'month', 'year', 'timeon',
                                       'band', 'freq', 'mode', 'call',
                                       'srst', 'rrst', 'name', 'grid',
                                       'iota', 'qsls', 'qsls_date', 'qslr',
                                       'qslr_date', 'lotw_qsls', 'lotw_qsls_date', 'lotw_qslr',
                                       'lotw_qslr_date')


        self.qsoview["columns"] = self.qsoviewfields.keys()
        self.qsoview["displaycolumns"] = self.qsoviewdisplayesfields


        self.qsoview.column(0, width=40)
        for columnname, data in self.qsoviewfields.items():
            # set columnwidth for QSOView
            self.qsoview.column(columnname, width=data['width'])
            # set QSOView headers
            self.qsoview.heading(columnname, text=data['name'])

        for i in range(400):
            self.qsoview.insert('', 'end', str(i), values=(str(i), 'bar'+str(i)))

        self.qsoviewScrollbar.config(command=self.qsoview.yview)

        self.qsoviewScrollbar.grid(column=1, row=0, sticky=(N,S))
        self.qsoview.grid(column=0, row=0, sticky=(N,S,E,W))

        master.columnconfigure(0, weight=1)
        master.rowconfigure(0, weight=1)

    def __init__(self, master=None):

        master.columnconfigure(0, weight=1)
        master.rowconfigure(0, weight=1)

        self.mainFrame = Frame.__init__(self, master)

        self.grid(sticky=(N,S,E,W))
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        self.createMenubar(master)

        self.qsoFrame = Frame(self.mainFrame)
        self.createQSOView(self.qsoFrame)
        self.qsoFrame.grid(sticky=(N,S,E,W))
Ejemplo n.º 18
0
class vb_steady:
    def __init__(self, parent):
        self.master = parent  # store the parent
        top = tk.Frame(parent)  # frame for all class widgets
        top.pack(side='top')  # pack frame in parent's window

        self.master.minsize(400, 400)
        self.master.geometry("600x550")
        self.master.title("vb_steady_gui.py ver 1.2  by Tom Irvine")

        crow = 0

        self.hwtext1 = tk.Label(
            top,
            text=
            'Steady-state Response of an SDOF System to Sinusoidal Excitation')
        self.hwtext1.grid(row=crow,
                          column=0,
                          columnspan=6,
                          pady=10,
                          sticky=tk.W)

        ###############################################################################

        crow = crow + 1

        self.hwtext5 = tk.Label(top, text='Select Units')
        self.hwtext5.grid(row=crow, column=0, columnspan=1, pady=10)

        self.hwtext4 = tk.Label(top, text='Select Excitation')
        self.hwtext4.grid(row=crow, column=1, columnspan=1, padx=20, pady=10)

        self.hwtext6 = tk.Label(top, text='Enter Q')
        self.hwtext6.grid(row=crow, column=2, columnspan=1, padx=20, pady=10)

        ###############################################################################

        crow = crow + 1

        self.Lb_unit = tk.Listbox(top, height=3, width=30, exportselection=0)

        self.Lb_unit.insert(1, "lbf, G, in/sec, in")
        self.Lb_unit.insert(2, "N, G, m/sec, mm")
        self.Lb_unit.insert(3, "N, m/sec^2, m/sec, mm")

        self.Lb_unit.grid(row=crow, column=0, pady=4, sticky=tk.N)
        self.Lb_unit.select_set(0)
        self.Lb_unit.bind('<<ListboxSelect>>', self.force_accel_change)

        self.Lb_ex = tk.Listbox(top, height=2, exportselection=0)
        self.Lb_ex.insert(1, "Applied Force")
        self.Lb_ex.insert(2, "Base Excitation")
        self.Lb_ex.grid(row=crow, column=1, padx=20, pady=4, sticky=tk.N)
        self.Lb_ex.select_set(0)
        self.Lb_ex.bind('<<ListboxSelect>>', self.force_accel_change)

        self.Qr = tk.StringVar()
        self.Qr.set('10')
        self.Q_entry = tk.Entry(top, width=5, textvariable=self.Qr)
        self.Q_entry.grid(row=crow, column=2, sticky=tk.N)
        self.Q_entry.bind("<KeyPress>", self.OnKeyPress)

        ###############################################################################

        crow = crow + 1

        self.hwtext15 = tk.Label(top, text='Enter Natural Frequency (Hz)')
        self.hwtext15.grid(row=crow, column=0, columnspan=1, pady=10)

        self.hwtext14 = tk.Label(top, text='Enter Excitation Frequency (Hz)')
        self.hwtext14.grid(row=crow, column=1, columnspan=1, padx=20, pady=10)

        crow = crow + 1

        self.fnr = tk.StringVar()
        self.fn_entry = tk.Entry(top, width=10, textvariable=self.fnr)
        self.fn_entry.grid(row=crow, column=0, sticky=tk.N)
        self.fn_entry.bind("<KeyPress>", self.OnKeyPress)

        self.f_extr = tk.StringVar()
        self.f_ext_entry = tk.Entry(top, width=10, textvariable=self.f_extr)
        self.f_ext_entry.grid(row=crow, column=1, sticky=tk.N)
        self.f_ext_entry.bind("<KeyPress>", self.OnKeyPress)

        ###############################################################################

        crow = crow + 1

        self.amp_text_r = tk.StringVar()
        self.amp_text_r.set('Enter Applied Force (lbf)')
        self.hwtext_amp = tk.Label(top, textvariable=self.amp_text_r)
        self.hwtext_amp.grid(row=crow, column=0, columnspan=1, pady=10)

        self.mass_text_r = tk.StringVar()
        self.mass_text_r.set('Enter Mass (lbm)')
        self.hwtext_mass = tk.Label(top, textvariable=self.mass_text_r)
        self.hwtext_mass.grid(row=crow, column=1, columnspan=1, pady=10)
        self.hwtext_mass.config(state='normal')

        crow = crow + 1

        self.ampr = tk.StringVar()
        self.amp_entry = tk.Entry(top, width=10, textvariable=self.ampr)
        self.amp_entry.grid(row=crow, column=0, sticky=tk.N)
        self.amp_entry.bind("<KeyPress>", self.OnKeyPress)

        self.massr = tk.StringVar()
        self.mass_entry = tk.Entry(top, width=10, textvariable=self.massr)
        self.mass_entry.grid(row=crow, column=1, sticky=tk.N)
        self.mass_entry.config(state='normal')
        self.mass_entry.bind("<KeyPress>", self.OnKeyPress)

        ###############################################################################

        crow = crow + 1

        self.button_calculate = tk.Button(top,
                                          text="Calculate",
                                          command=self.calculate)
        self.button_calculate.config(height=2, width=15)
        self.button_calculate.grid(row=crow, column=0, pady=20)

        root = self.master

        self.button_quit = tk.Button(top,
                                     text="Quit",
                                     command=lambda root=root: quit(root))
        self.button_quit.config(height=2, width=15)
        self.button_quit.grid(row=crow, column=1, padx=10, pady=20)

        crow = crow + 1

        self.hwtext_results = tk.Label(top, text='Results')
        self.hwtext_results.grid(row=crow, column=0, columnspan=1, pady=12)

        crow = crow + 1

        self.tree = Treeview(top,
                             selectmode="extended",
                             columns=("A", "B"),
                             height=4)
        self.tree.grid(row=crow,
                       column=0,
                       columnspan=2,
                       padx=10,
                       pady=1,
                       sticky=tk.NW)

        self.tree.heading('#0', text='')
        self.tree.heading('A', text='Parameter')
        self.tree.heading('B', text='Value')

        self.tree.column('#0', minwidth=0, width=1)
        self.tree.column('A', minwidth=0, width=170, stretch=tk.YES)
        self.tree.column('B', minwidth=0, width=85)

###############################################################################

    def calculate(self):

        x = self.tree.get_children()

        for i in range(0, len(x)):
            self.tree.delete(x[i])

        nfa_choice = int(self.Lb_ex.curselection()[0])
        nun_choice = int(self.Lb_unit.curselection()[0])

        fn = float(self.fnr.get())
        freq = float(self.f_extr.get())
        amp = float(self.ampr.get())
        Q = float(self.Qr.get())
        damp = 1 / (2 * Q)

        rho = freq / fn
        omegan = 2 * pi * fn
        omega = 2 * pi * freq

        den = omegan**2 - omega**2 + (2 * damp * omegan * omega) * 1j

        rel_disp = 0

        if (nfa_choice == 0):  # force

            force = amp

            mass = float(self.massr.get())

            if (nun_choice == 0):
                mass /= 386

            stiff = mass * omegan**2

            if (nun_choice == 0):
                print('\n  stiffness= %8.4g lbf/in \n' % stiff)
            else:
                print('\n  stiffness= %8.4g N/m \n' % stiff)

            disp = force * (1 / stiff) * omegan**2 / den
            velox = omega * disp * 1j
            accel = -omega**2 * disp

            term = 2 * damp * rho

            num = sqrt(1 + term**2)
            den = sqrt((1 - rho**2)**2 + term**2)

            transmitted_force = force * num / den

            A3 = "%8.4g" % abs(transmitted_force)

            if (nun_choice == 0):
                L3 = 'Transmitted Force (lbf)'
            if (nun_choice == 1):
                L3 = 'Transmitted Force (N)'
            if (nun_choice == 2):
                L3 = 'Transmitted Force (N)'

        else:

            base_accel = amp

            if (nun_choice == 0):
                base_accel = base_accel * 386

            if (nun_choice == 1):
                base_accel = base_accel * 9.81

            num = omegan**2 + (1j) * 2 * damp * omega * omegan

            accel = base_accel * num / den
            velox = accel / ((1j) * omega)
            disp = accel / (-omega**2)
            rel_disp = -base_accel / den

            if (nun_choice == 0):
                L3 = 'Relative Displacement (in)'
            if (nun_choice == 1):
                L3 = 'Relative Displacement (mm)'
            if (nun_choice == 2):
                L3 = 'Relative Displacement (mm)'

##########

        if (nun_choice == 0):
            L0 = 'Acceleration (G)'
            L1 = 'Velocity (in/sec)'
            L2 = 'Displacement (in)'
        if (nun_choice == 1):
            L0 = 'Acceleration (G)'
            L1 = 'Velocity (m/sec)'
            L2 = 'Displacement (mm)'
        if (nun_choice == 2):
            L0 = 'Acceleration (m/sec^2)'
            L1 = 'Velocity (m/sec)'
            L2 = 'Displacement (mm)'

        if (nun_choice == 0):
            accel /= 386
        if (nun_choice == 1):
            accel /= 9.81
            disp *= 1000
            rel_disp *= 1000
        if (nun_choice == 2):
            disp *= 1000
            rel_disp *= 1000

        A0 = "%8.4g" % abs(accel)
        A1 = "%8.4g" % abs(velox)
        A2 = "%8.4g" % abs(disp)

        if (nfa_choice == 1):
            A3 = "%8.4g" % abs(rel_disp)

        self.tree.insert('', 'end', values=(L0, A0))
        self.tree.insert('', 'end', values=(L1, A1))
        self.tree.insert('', 'end', values=(L2, A2))
        self.tree.insert('', 'end', values=(L3, A3))

        print("%s %s" % (L0, A0))
        print("%s %s" % (L1, A1))
        print("%s %s" % (L2, A2))
        print("%s %s" % (L3, A3))

    def force_accel_change(self, val):

        map(self.tree.delete, self.tree.get_children())

        nfa_choice = int(self.Lb_ex.curselection()[0])
        nun_choice = int(self.Lb_unit.curselection()[0])

        if (nfa_choice == 0):  # force
            self.hwtext_mass.config(state='normal')
            self.mass_entry.config(state='normal')
            if (nun_choice == 0):  #   Engish
                self.amp_text_r.set('Enter Applied Force (lbf)')
                self.mass_text_r.set('Enter Mass (lbm)')
            else:  #   metric
                self.amp_text_r.set('Enter Applied Force (N)')
                self.mass_text_r.set('Enter Mass (kg)')
        else:
            self.hwtext_mass.config(state='disabled')  # accel
            self.mass_entry.config(state='disabled')

            self.massr.set(' ')

            if (nun_choice <= 1):  #   English
                self.amp_text_r.set('Enter Base Accel (G)')
            else:  #   metric
                self.amp_text_r.set('Enter Base Accel (m/sec^2)')

    def OnKeyPress(self, event):
        map(self.tree.delete, self.tree.get_children())
class vb_rainflow:
    def __init__(self, parent):
        self.master = parent  # store the parent
        self.top = tk.Frame(parent)  # frame for all class widgets
        self.top.pack(side='top')  # pack frame in parent's window

        self.master.minsize(400, 400)
        self.master.geometry("820x620")
        self.master.title("vb_rainflow_gui.py ver 1.5  by Tom Irvine")

        self.num = 0

        self.crow = 0

        self.hwtext1 = tk.Label(
            self.top, text='ASTM E 1049-85 (2005) Rainflow Counting Method')
        self.hwtext1.grid(row=self.crow,
                          column=0,
                          columnspan=4,
                          pady=7,
                          sticky=tk.W)

        self.crow = self.crow + 1

        self.hwtext2 = tk.Label(self.top, text='Select input data format ')
        self.hwtext2.grid(row=self.crow,
                          column=0,
                          columnspan=2,
                          pady=7,
                          sticky=tk.SW)

        self.hwtext3 = tk.Label(self.top, text='Remove Mean ')
        self.hwtext3.grid(row=self.crow,
                          column=2,
                          columnspan=1,
                          padx=5,
                          pady=7,
                          sticky=tk.S)

        self.crow = self.crow + 1

        self.Lb1 = tk.Listbox(self.top, height=2, exportselection=0)
        self.Lb1.insert(1, "time & amplitude")
        self.Lb1.insert(2, "amplitude")
        self.Lb1.grid(row=self.crow, column=0, pady=4, sticky=tk.W)
        self.Lb1.select_set(0)

        self.Lb2 = tk.Listbox(self.top, height=2, exportselection=0)
        self.Lb2.insert(1, "yes")
        self.Lb2.insert(2, "no")
        self.Lb2.grid(row=self.crow, column=2, padx=5, pady=4, sticky=tk.NW)
        self.Lb2.select_set(0)

        self.crow = self.crow + 1

        self.button_read = tk.Button(self.top,
                                     text="Read Input File",
                                     command=self.read_data)
        self.button_read.config(height=3, width=15)
        self.button_read.grid(row=self.crow,
                              column=0,
                              columnspan=1,
                              pady=10,
                              sticky=tk.W)

        self.button_calculate = tk.Button(self.top,
                                          text="Calculate",
                                          command=self.calculate)
        self.button_calculate.config(height=3, width=15, state='disabled')
        self.button_calculate.grid(row=self.crow,
                                   column=2,
                                   columnspan=1,
                                   pady=10,
                                   sticky=tk.W)

        root = self.master

        self.button_quit = tk.Button(self.top,
                                     text="Quit",
                                     command=lambda root=root: quit(root))
        self.button_quit.config(height=3, width=15)
        self.button_quit.grid(row=self.crow,
                              column=3,
                              columnspan=2,
                              padx=10,
                              pady=20)

        self.crow = self.crow + 1

        self.tree = Treeview(self.top,
                             selectmode="extended",
                             columns=("A", "B", "C", "D", "E", "F", "G"))
        self.tree.grid(row=self.crow, column=0, columnspan=6, padx=10, pady=20)

        self.tree.heading('#0', text='')
        self.tree.heading('A', text='')
        self.tree.heading('B', text='')
        self.tree.heading('C', text='')
        self.tree.heading('D', text='')
        self.tree.heading('E', text='')
        self.tree.heading('F', text='')
        self.tree.heading('G', text='')

        self.tree.column('#0', minwidth=0, width=1)
        self.tree.column('A', minwidth=0, width=120, stretch=tk.YES)
        self.tree.column('B', minwidth=0, width=85)
        self.tree.column('C', minwidth=0, width=80)
        self.tree.column('D', minwidth=0, width=80)
        self.tree.column('E', minwidth=0, width=80)
        self.tree.column('F', minwidth=0, width=80)
        self.tree.column('G', minwidth=0, width=80)

        self.crow = self.crow + 1

        self.hwtextext_rapv1 = tk.Label(self.top, text='Range=peak-valley')
        self.hwtextext_rapv1.grid(row=self.crow,
                                  column=0,
                                  columnspan=1,
                                  pady=10,
                                  sticky=tk.W)

        self.hwtextext_rapv2 = tk.Label(self.top,
                                        text='Amplitude=(peak-valley)/2')
        self.hwtextext_rapv2.grid(row=self.crow,
                                  column=2,
                                  columnspan=1,
                                  pady=10,
                                  sticky=tk.W)

        self.crow = self.crow + 1

        self.hwtextext_exrf = tk.Label(self.top, text='Export Rainflow Data')
        self.hwtextext_exrf.grid(row=self.crow, column=0, pady=10)
        self.hwtextext_exrf.config(state='disabled')

        self.crow = self.crow + 1

        self.button_rt = tk.Button(self.top,
                                   text="Rainflow Table (csv format)",
                                   command=self.export_table)
        self.button_rt.config(height=2, width=26, state='disabled')
        self.button_rt.grid(row=self.crow,
                            column=0,
                            columnspan=2,
                            pady=3,
                            padx=1)

        self.button_rc = tk.Button(self.top,
                                   text="Range & Cycles",
                                   command=self.export_range_cycles)
        self.button_rc.config(height=2, width=26, state='disabled')
        self.button_rc.grid(row=self.crow,
                            column=2,
                            columnspan=2,
                            pady=3,
                            padx=4)

        self.button_ac = tk.Button(self.top,
                                   text="Amplitude & Cycles",
                                   command=self.export_amp_cycles)
        self.button_ac.config(height=2, width=26, state='disabled')
        self.button_ac.grid(row=self.crow,
                            column=4,
                            columnspan=2,
                            pady=3,
                            padx=4)

################################################################################

    def export_table(self):
        output_file_path = asksaveasfilename(
            parent=self.master,
            title="Enter the Rainflow Table Comma-Delimited filename")
        output_file = output_file_path.rstrip('\n')

        header = ([
            'Range(units)', 'Cycle Count', 'Ave Amp', 'Max Amp', 'Ave Mean',
            'Min Valley', 'Max Peak'
        ])

        with open(output_file, 'wb') as f:
            writer = csv.writer(f)
            writer.writerow(header)

            for i in range(13, 0, -1):

                s1 = "%8.2f to %8.2f" % (self.L[i], self.L[i + 1])
                s2 = "%8.1f" % self.C[i]
                s3 = "%6.4g" % self.AverageAmp[i]
                s4 = "%6.4g" % self.MaxAmp[i]
                s5 = "%6.4g" % self.AverageMean[i]
                s6 = "%6.4g" % self.MinValley[i]
                s7 = "%6.4g" % self.MaxPeak[i]

                mat = ([s1, s2, s3, s4, s5, s6, s7])
                writer.writerow(mat)

    def export_range_cycles(self):
        output_file_path = asksaveasfilename(
            parent=self.master, title="Enter the Range & Cycles filename")
        output_file = output_file_path.rstrip('\n')
        WriteData2B(self.kv, self.B, output_file)

    def export_amp_cycles(self):
        output_file_path = asksaveasfilename(
            parent=self.master, title="Enter the Amplitude & Cycles filename")
        output_file = output_file_path.rstrip('\n')
        WriteData2B(self.kv, self.B / 2, output_file)

################################################################################

    @classmethod
    def find_points(cls, self):
        y = self.b
        k = 0
        self.a[0] = y[0]

        k = 1

        for i in range(1, int(self.num - 1)):

            slope1 = (y[i] - y[i - 1])
            slope2 = (y[i + 1] - y[i])

            if ((slope1 * slope2) <= 0 and abs(slope1) > 0):
                self.a[k] = y[i]
                k += 1

        self.last_a = k
        self.hold = self.last_a
        self.a[k] = y[self.num - 1]

################################################################################

    @classmethod
    def count_cycles(cls, self):

        i = 0
        j = 1

        self.sum = 0
        self.kv = 0

        self.ymax = -1.0e+20

        print(" ")
        # print (" last_a=%d " %last_a)

        aa = self.a.tolist()

        nkv = 0

        print("\n percent completed \n")

        while (1):

            Y = abs(aa[i] - aa[i + 1])
            X = abs(aa[j] - aa[j + 1])

            ##    print (" i=%d j=%d last_a=%d  X=%8.4g  Y=%8.4g " %(i,j,last_a,X,Y)

            if (X >= Y and Y > 0):
                if (Y > self.ymax):
                    self.ymax = Y

                if (i == 0):
                    self.sum += 0.5
                    self.B[self.kv][3] = aa[i + 1]
                    self.B[self.kv][2] = aa[i]
                    self.B[self.kv][1] = 0.5
                    self.B[self.kv][0] = Y
                    self.kv += 1
                    aa.pop(i)
                    self.last_a -= 1
                    i = 0
                    j = 1

                else:
                    self.sum += 1
                    self.B[self.kv][3] = aa[i + 1]
                    self.B[self.kv][2] = aa[i]
                    self.B[self.kv][1] = 1.
                    self.B[self.kv][0] = Y
                    self.kv += 1

                    aa.pop(i + 1)
                    aa.pop(i)

                    i = 0
                    j = 1

                    self.last_a -= 2

                    nkv += 1

                    if (nkv == 3000):
                        pr = (self.sum / (self.hold / 2)) * 100.
                        print(" %8.4g " % pr)
                        nkv = 0

            else:
                i += 1
                j += 1

            if ((j + 1) > self.last_a):
                break

        for i in range(0, int(self.last_a)):

            Y = (abs(aa[i] - aa[i + 1]))

            ##    print ("i=%d  kv=%d  Y=%g " %(i,kv,Y)

            if (Y > 0):

                self.sum += 0.5
                self.B[self.kv][3] = aa[i + 1]
                self.B[self.kv][2] = aa[i]
                self.B[self.kv][1] = 0.5
                self.B[self.kv][0] = Y

                self.kv += 1

                if (Y > self.ymax):
                    self.ymax = Y

        print(" ymax=%8.4g " % self.ymax)

################################################################################

    @classmethod
    def rainflow_bins(cls, self):

        self.L = np.zeros(15, 'f')
        self.C = np.zeros(15, 'f')

        self.AverageMean = np.zeros(15, 'f')
        self.MaxPeak = np.zeros(15, 'f')
        self.MinValley = np.zeros(15, 'f')
        self.MaxAmp = np.zeros(15, 'f')
        self.AverageAmp = np.zeros(15, 'f')

        self.L[1] = 0
        self.L[2] = 2.5
        self.L[3] = 5
        self.L[4] = 10
        self.L[5] = 15
        self.L[6] = 20
        self.L[7] = 30
        self.L[8] = 40
        self.L[9] = 50
        self.L[10] = 60
        self.L[11] = 70
        self.L[12] = 80
        self.L[13] = 90
        self.L[14] = 100

        for ijk in range(1, 15):

            self.L[ijk] *= self.ymax / 100.

            self.MaxPeak[ijk] = -1.0e+20
            self.MinValley[ijk] = 1.0e+20

            self.MaxAmp[ijk] = -1.0e+20

        self.kv -= 1

        for i in range(0, int(self.kv + 1)):
            Y = self.B[i][0]

            ##     print ("i=%d  Y=%g " %(i,Y)

            for ijk in range(13, 0, -1):

                if (Y >= self.L[ijk] and Y <= self.L[ijk + 1]):
                    self.C[ijk] += self.B[i][1]

                    self.AverageMean[ijk] += self.B[i][1] * (
                        self.B[i][3] + self.B[i][2]) * 0.5  # weighted average

                    if (self.B[i][3] > self.MaxPeak[ijk]):
                        self.MaxPeak[ijk] = self.B[i][3]

                    if (self.B[i][2] > self.MaxPeak[ijk]):
                        self.MaxPeak[ijk] = self.B[i][2]

                    if (self.B[i][3] < self.MinValley[ijk]):
                        self.MinValley[ijk] = self.B[i][3]

                    if (self.B[i][2] < self.MinValley[ijk]):
                        self.MinValley[ijk] = self.B[i][2]

                    if (Y > self.MaxAmp[ijk]):
                        self.MaxAmp[ijk] = Y

                    self.AverageAmp[ijk] += self.B[i][1] * Y * 0.5

                    break

        for ijk in range(1, 15):

            if (self.C[ijk] > 0):
                self.AverageMean[ijk] /= self.C[ijk]
                self.AverageAmp[ijk] /= self.C[ijk]

            if (self.C[ijk] < 0.5):
                self.AverageMean[ijk] = 0.
                self.AverageAmp[ijk] = 0.
                self.MaxPeak[ijk] = 0.
                self.MinValley[ijk] = 0.
                self.MaxAmp[ijk] = 0.

        self.MaxAmp[ijk] /= 2.
        #
        self.tree.heading('A', text='Range (units)')
        self.tree.heading('B', text='Cycle Count')
        self.tree.heading('C', text='Ave Amp')
        self.tree.heading('D', text='Max Amp')
        self.tree.heading('E', text='Ave Mean')
        self.tree.heading('F', text='Min Valley')
        self.tree.heading('G', text='Max Peak')

        self.hwtextext_exrf.config(state='normal')
        self.button_rt.config(height=2, width=26, state='normal')
        self.button_ac.config(height=2, width=26, state='normal')
        self.button_rc.config(height=2, width=26, state='normal')

        print(" ")
        print(" Amplitude = (peak-valley)/2  ")

        #        outfile.write('\n  Amplitude = (peak-valley)/2 \n\n')

        #*****************************************************************************

        print(" ")
        print(
            "          Range            Cycle       Ave      Max     Ave     Min       Max"
        )
        print(
            "         (units)           Counts      Amp      Amp     Mean    Valley    Peak "
        )

        for i in range(13, 0, -1):
            print ("  %8.2f to %8.2f\t%8.1f\t%6.4g\t%6.4g\t%6.4g\t%6.4g\t %6.4g "\
            %(self.L[i],self.L[i+1],self.C[i],self.AverageAmp[i],self.MaxAmp[i],\
                       self.AverageMean[i],self.MinValley[i],self.MaxPeak[i]))

            s0 = "%8.2f to %8.2f" % (self.L[i], self.L[i + 1])

            s1 = "%8.1f" % self.C[i]

            s2 = "%6.4g" % self.AverageAmp[i]

            s3 = "%6.4g" % self.MaxAmp[i]

            s4 = "%6.4g" % self.AverageMean[i]

            s5 = "%6.4g" % self.MinValley[i]

            s6 = "%6.4g" % self.MaxPeak[i]

            self.tree.insert('', 'end', values=(s0, s1, s2, s3, s4, s5, s6))

        sh = self.hold
        sn = self.num
        sy = self.ymax
        ss = self.sum

        print("\n\n Total Cycles = %g  hold=%d  NP=%d ymax=%g\n" %
              (ss, sh, sn, sy))

#############################################################################

    def calculate(self):
        # remove mean
        imr = int(self.Lb2.curselection()[0])

        if (imr == 0):
            self.b -= np.mean(self.b)

        self.b = np.array(self.b)

        ################################################################################

        self.a = np.zeros(self.num, 'f')
        self.B = np.zeros((self.num, 4), 'f')

        self.find_points(self)
        self.count_cycles(self)
        self.rainflow_bins(self)

################################################################################

    def read_data(self):
        icf = int(self.Lb1.curselection()[0])

        plt.ion()
        plt.clf()

        if (icf == 1):  # single column
            self.b, self.num = read_one_column_from_dialog(
                'Select Input File', self.master)
            plt.figure(1)
            plt.plot(self.b, linewidth=1.0, color='b')
        else:  # two columns
            self.a, self.b, self.num = read_two_columns_from_dialog(
                'Select Input File', self.master)
            plt.figure(1)
            plt.plot(self.a, self.b, linewidth=1.0, color='b')
            plt.xlabel('Time (sec)')

        plt.grid(True)
        plt.ylabel('Amplitude')
        plt.title('Time History')
        plt.draw()

        print("\n samples = %d " % self.num)

        self.button_calculate.config(state='normal')

        self.tree.heading('A', text='')
        self.tree.heading('B', text='')
        self.tree.heading('C', text='')
        self.tree.heading('D', text='')
        self.tree.heading('E', text='')
        self.tree.heading('F', text='')
        self.tree.heading('G', text='')

        self.hwtextext_exrf.config(state='disabled')
        self.button_rt.config(state='disabled')
        self.button_ac.config(state='disabled')
        self.button_rc.config(state='disabled')
Ejemplo n.º 20
0
class Multicolumn_Listbox(object):
    _style_index = 0

    class List_Of_Rows(object):
        def __init__(self, multicolumn_listbox):
            self._multicolumn_listbox = multicolumn_listbox

        def data(self, index):
            return self._multicolumn_listbox.row_data(index)
            
        def get(self, index):
            return Row(self._multicolumn_listbox, index)

        def insert(self, data, index=None):
            self._multicolumn_listbox.insert_row(data, index)

        def delete(self, index):
            self._multicolumn_listbox.delete_row(index)

        def update(self, index, data):
            self._multicolumn_listbox.update_row(index, data)

        def select(self, index):
            self._multicolumn_listbox.select_row(index)

        def deselect(self, index):
            self._multicolumn_listbox.deselect_row(index)

        def set_selection(self, indices):
            self._multicolumn_listbox.set_selection(indices)

        def __getitem__(self, index): 
            return self.get(index)

        def __setitem__(self, index, value): 
            return self._multicolumn_listbox.update_row(index, value)

        def __delitem__(self, index): 
            self._multicolumn_listbox.delete_row(index)

        def __len__(self): 
            return self._multicolumn_listbox.number_of_rows

    class List_Of_Columns(object):
        def __init__(self, multicolumn_listbox):
            self._multicolumn_listbox = multicolumn_listbox
        
        def data(self, index):
            return self._multicolumn_listbox.get_column(index)

        def get(self, index):
            return Column(self._multicolumn_listbox, index)

        def delete(self, index):
            self._multicolumn_listbox.delete_column(index)

        def update(self, index, data):
            self._multicolumn_listbox.update_column(index, data)

        def __getitem__(self, index): 
            return self.get(index)

        def __setitem__(self, index, value): 
            return self._multicolumn_listbox.update_column(index, value)

        def __delitem__(self, index): 
            self._multicolumn_listbox.delete_column(index)

        def __len__(self): 
            return self._multicolumn_listbox.number_of_columns

    def __init__(self, master, columns, data=None, command=None, sort=True, select_mode=None, heading_anchor = CENTER, cell_anchor=W, style=None, height=None, padding=None, adjust_heading_to_content=False, stripped_rows=None, selection_background=None, selection_foreground=None, field_background=None, heading_font= None, heading_background=None, heading_foreground=None, cell_pady=2, cell_background=None, cell_foreground=None, cell_font=None, headers=True):

        self._stripped_rows = stripped_rows

        self._columns = columns
        
        self._number_of_rows = 0
        self._number_of_columns = len(columns)
        
        self.row = self.List_Of_Rows(self)
        self.column = self.List_Of_Columns(self)
        
        s = Style()

        if style is None:
            style_name = "Multicolumn_Listbox%s.Treeview"%self._style_index
            self._style_index += 1
        else:
            style_name = style
        
        style_map = {}
        if selection_background is not None:
            style_map["background"] = [('selected', selection_background)]
            
        if selection_foreground is not None:
            style_map["foeground"] = [('selected', selection_foreground)]

        if style_map:
            s.map(style_name, **style_map)

        style_config = {}
        if cell_background is not None:
            style_config["background"] = cell_background

        if cell_foreground is not None:
            style_config["foreground"] = cell_foreground

        if cell_font is None:
            font_name = s.lookup(style_name, "font")
            cell_font = nametofont(font_name)
        else:
            if not isinstance(cell_font, Font):
                if isinstance(cell_font, basestring):
                    cell_font = nametofont(cell_font)
                else:
                    if len(font) == 1:
                        cell_font = Font(family=cell_font[0])
                    elif len(font) == 2:
                        cell_font = Font(family=cell_font[0], size=cell_font[1])
                        
                    elif len(font) == 3:
                        cell_font = Font(family=cell_font[0], size=cell_font[1], weight=cell_font[2])
                    else:
                        raise ValueError("Not possible more than 3 values for font")
        
            style_config["font"] = cell_font
        
        self._cell_font = cell_font

        self._rowheight = cell_font.metrics("linespace")+cell_pady
        style_config["rowheight"]=self._rowheight

        if field_background is not None:
            style_config["fieldbackground"] = field_background

        s.configure(style_name, **style_config)

        heading_style_config = {}
        if heading_font is not None:
            heading_style_config["font"] = heading_font
        if heading_background is not None:
            heading_style_config["background"] = heading_background
        if heading_foreground is not None:
            heading_style_config["foreground"] = heading_foreground

        heading_style_name = style_name + ".Heading"
        s.configure(heading_style_name, **heading_style_config)

        treeview_kwargs = {"style": style_name}

        if height is not None:
            treeview_kwargs["height"] = height
            
        if padding is not None:
            treeview_kwargs["padding"] = padding
            
        if headers:
            treeview_kwargs["show"] = "headings"
        else:
            treeview_kwargs["show"] = ""
        
        if select_mode is not None:
            treeview_kwargs["selectmode"] = select_mode

        self.interior = Treeview(master, columns=columns, **treeview_kwargs)
        
        if command is not None:
            self._command = command
            self.interior.bind("<<TreeviewSelect>>", self._on_select)

        for i in range(0, self._number_of_columns):

            if sort:
                self.interior.heading(i, text=columns[i], anchor=heading_anchor, command=lambda col=i: self.sort_by(col, descending=False))
            else:
                self.interior.heading(i, text=columns[i], anchor=heading_anchor)
                
            if adjust_heading_to_content:
                self.interior.column(i, width=Font().measure(columns[i]))

            self.interior.column(i, anchor=cell_anchor)
            
        if data is not None:
            for row in data:
                self.insert_row(row)

    @property
    def row_height(self):
        return self._rowheight
        
    @property
    def font(self):
        return self._cell_font

    def configure_column(self, index, width=None, minwidth=None, anchor=None, stretch=None):
        kwargs = {}
        for config_name in ("width", "anchor", "stretch", "minwidth"):
            config_value = locals()[config_name]
            if config_value is not None:
                kwargs[config_name] = config_value
            
        self.interior.column('#%s'%(index+1), **kwargs)

    def row_data(self, index):
        try:
            item_ID = self.interior.get_children()[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)        

        return self.item_ID_to_row_data(item_ID)

    def update_row(self, index, data):
        try:
            item_ID = self.interior.get_children()[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)
            
        if len(data) == len(self._columns):
            self.interior.item(item_ID, values=data)
        else:
            raise ValueError("The multicolumn listbox has only %d columns"%self._number_of_columns)

    def delete_row(self, index):
        list_of_items = self.interior.get_children()

        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)

        self.interior.delete(item_ID)
        self._number_of_rows -= 1
        
        if self._stripped_rows:
            for i in range(index, self._number_of_rows):
                self.interior.tag_configure(list_of_items[i+1], background=self._stripped_rows[i%2])
            
    def insert_row(self, data, index=None):
        if len(data) != self._number_of_columns:
            raise ValueError("The multicolumn listbox has only %d columns"%self._number_of_columns)
        
        if index is None:
            index = self._number_of_rows-1

        item_ID = self.interior.insert('', index, values=data)        
        self.interior.item(item_ID, tags=item_ID)

        self._number_of_rows += 1        

        if self._stripped_rows:            
            list_of_items = self.interior.get_children()

            self.interior.tag_configure(item_ID, background=self._stripped_rows[index%2])

            for i in range(index+1, self._number_of_rows):
                self.interior.tag_configure(list_of_items[i], background=self._stripped_rows[i%2])

    def column_data(self, index):
        return [self.interior.set(child_ID, index) for child_ID in self.interior.get_children('')]

    def update_column(self, index, data):
        for i, item_ID in enumerate(self.interior.get_children()): 
            data_row = self.item_ID_to_row_data(item_ID)
            data_row[index] = data[i]

            self.interior.item(item_ID, values=data_row)

        return data

    def clear(self):
        # Another possibility:
        #  self.interior.delete(*self.interior.get_children())

        for row in self.interior.get_children():
            self.interior.delete(row)
            
        self._number_of_rows = 0
            
    def update(self, data):
        self.clear()

        for row in data:
            self.insert_row(row)
            
    def focus(self, index=None):
        if index is None:
            return self.interior.item(self.interior.focus())
        else:
            item = self.interior.get_children()[index]
            self.interior.focus(item)

    def state(self, state=None):
        if stateSpec is None:
            return self.interior.state()
        else:
            self.interior.state(state)

    @property
    def number_of_rows(self):
        return self._number_of_rows
        
    @property
    def number_of_columns(self):
        return self._number_of_columns
        
    def toogle_selection(self, index):
        list_of_items = self.interior.get_children()
        
        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)

        self.interior.selection_toggle(item_ID)     

    def select_row(self, index):
        list_of_items = self.interior.get_children()
        
        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)

        self.interior.selection_add(item_ID)

    def deselect_row(self, index):
        list_of_items = self.interior.get_children()
        
        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d"%index)

        self.interior.selection_remove(item_ID)
        
    def deselect_all(self):
        self.interior.selection_remove(self.interior.selection())

    def set_selection(self, indices):
        list_of_items = self.interior.get_children()

        self.interior.selection_set(" ".join(list_of_items[row_index] for row_index in indices))

    @property
    def selected_rows(self):
        data = []
        for item_ID in self.interior.selection():
            data_row = self.item_ID_to_row_data(item_ID)
            data.append(data_row)
        
        return data

    @property
    def indices_of_selected_rows(self):
        list_of_indices = []
        for index, item_ID in enumerate(self.interior.get_children()):
            if item_ID in self.interior.selection():
                list_of_indices.append(index)

        return list_of_indices
        
    def delete_all_selected_rows(self):
        selected_items = self.interior.selection()
        for item_ID in selected_items:
            self.interior.delete(item_ID)
        
        number_of_deleted_rows = len(selected_items)
        self._number_of_rows -= number_of_deleted_rows

        return number_of_deleted_rows

    def _on_select(self, event):
        for item_ID in event.widget.selection():
            data_row = self.item_ID_to_row_data(item_ID)
            self._command(data_row)

    def item_ID_to_row_data(self, item_ID):
        item = self.interior.item(item_ID)
        return item["values"]
    
    @property
    def table_data(self):
        data = []

        for item_ID in self.interior.get_children():
            data_row = self.item_ID_to_row_data(item_ID)
            data.append(data_row)

        return data
    
    @table_data.setter
    def table_data(self, data):
        self.update(data)
    
    def cell_data(self, row, column):
        """Get the value of a table cell"""
        try:
            item = self.interior.get_children()[row]
        except IndexError:
            raise ValueError("Row index out of range: %d"%row)
            
        return self.interior.set(item, column)
            
    def update_cell(self, row, column, value):
        """Set the value of a table cell"""

        item_ID = self.interior.get_children()[row]
        
        data = self.item_ID_to_row_data(item_ID)
        
        data[column] = value
        self.interior.item(item_ID, values=data)
    
    def __getitem__(self, index):
        if isinstance(index, tuple):
            row, column = index
            return self.cell_data(row, column)
        else:
            raise Exception("Row and column indices are required")
        
    def __setitem__(self, index, value):
        if isinstance(index, tuple):
            row, column = index
            self.update_cell(row, column, value)
        else:
            raise Exception("Row and column indices are required")

    def bind(self, event, handler):
        self.interior.bind(event, handler)

    def sort_by(self, col, descending):
        """
        sort tree contents when a column header is clicked
        """
        # grab values to sort
        data = [(self.interior.set(child_ID, col), child_ID) for child_ID in self.interior.get_children('')]
        
        # if the data to be sorted is numeric change to float
        try:
            data = [(float(number), child_ID) for number, child_ID in data]
        except ValueError:
            pass

        # now sort the data in place
        data.sort(reverse=descending)
        for idx, item in enumerate(data):
            self.interior.move(item[1], '', idx)

        # switch the heading so that it will sort in the opposite direction
        self.interior.heading(col, command=lambda col=col: self.sort_by(col, not descending))
        
        if self._stripped_rows:
            list_of_items = self.interior.get_children('')
            for i in range(len(list_of_items)):
                self.interior.tag_configure(list_of_items[i], background=self._stripped_rows[i%2])

    def destroy(self):
        self.interior.destroy()
        
    def item_ID(self, index):
        return self.interior.get_children()[index]
Ejemplo n.º 21
0
class MacroFrame(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent, background="white")
        self.parent = parent
        self.numStates = 0
        self.initUI()

    def initUI(self):
        self.columnconfigure(0, weight=0)
        self.columnconfigure(1, weight=0)
        self.columnconfigure(2, weight=1)
        self.columnconfigure(3, weight=1)

        self.rowconfigure(0, weight=1)

        self.commandFrame = Frame(self, background="white")
        self.commandFrame.grid(row=0, column=0, columnspan=5, sticky=W + E)
        self.commandFrame.columnconfigure(1, weight=1)

        self.btnCommand = Button(self.commandFrame, text="Run")
        self.btnCommand.grid(row=0, column=0)

        self.strCommand = StringVar()
        self.entCommand = Entry(self.commandFrame, textvariable=self.strCommand)
        self.entCommand.grid(row=0, column=1, sticky=W + E)

        self.lstMacro = Listbox(self)
        self.lstMacro.grid(row=1, column=0, sticky=N + S + W + E)

        self.treeview = Treeview(self, columns=("Angle"), displaycolumns="#all", selectmode="browse")
        self.treeview.grid(row=1, column=1, columnspan=4, sticky=N + S + W + E)
        self.treeScrollbar = Scrollbar(self)
        self.treeScrollbar.grid(row=1, column=5, sticky=N + S)
        self.treeview.config(yscrollcommand=self.treeScrollbar.set)
        self.treeScrollbar.config(command=self.treeview.yview)

        self.btnFrame = Frame(self, background="white")
        self.btnFrame.grid(row=2, column=0, columnspan=5, sticky=W + E)

        self.btnRun = Button(self.btnFrame, text="Run", command=self.runMacro)
        self.btnRun.grid(row=0, column=0)

        self.btnStop = Button(self.btnFrame, text="Stop")
        self.btnStop.grid(row=0, column=1)

        self.btnSaveMacro = Button(self.btnFrame, text="Save Macro", command=self.saveMacro)
        self.btnSaveMacro.grid(row=0, column=2)

        self.btnDeleteMacro = Button(self.btnFrame, text="Delete Macro")
        self.btnDeleteMacro.grid(row=0, column=3)

        self.btnDeleteState = Button(self.btnFrame, text="Delete State")
        self.btnDeleteState.grid(row=0, column=4)

    def addState(self, robot):
        stateName = "state" + str(self.numStates)
        self.treeview.insert("", END, iid=stateName, text=stateName)
        limbNum = 0
        for limb in robot.getLimbs():
            limbName = "limb" + str(limbNum)
            self.treeview.insert(stateName, END, iid=stateName + "_" + limbName, text=limbName)
            partNum = 0
            for part in limb.getComponents():
                partName = "joint" + str(partNum)
                if isinstance(part, Joint):
                    self.treeview.insert(
                        stateName + "_" + limbName,
                        END,
                        iid=stateName + "_" + limbName + "_" + partName,
                        text=partName,
                        values=[part.angle],
                    )
                    partNum += 1
            limbNum += 1
        self.numStates += 1

    def getState(self, stateNum, robot):
        stateName = "state" + str(stateNum)
        limbNum = 0
        for limb in robot.getLimbs():
            limbName = "limb" + str(limbNum)
            partNum = 0
            for part in limb.getComponents():
                partName = "joint" + str(partNum)
                if isinstance(part, Joint):
                    part.setAngle(int(self.treeview.item(stateName + "_" + limbName + "_" + partName, "values")[0]))
                    partNum += 1
            limbNum += 1

    def runMacro(self):
        thread = threading.Thread(target=self.updateState)
        thread.start()

    def updateState(self):
        for i in range(self.numStates):
            self.getState(i, self.parent.robotFrame.robot)
            time.sleep(0.1)

    def saveMacro(self):
        pass
Ejemplo n.º 22
0
class MacroFrame(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent, background="white")
        self.parent = parent
        self.numStates = 0
        self.initUI()

    def initUI(self):
        self.columnconfigure(0, weight=0)
        self.columnconfigure(1, weight=0)
        self.columnconfigure(2, weight=1)
        self.columnconfigure(3, weight=1)

        self.rowconfigure(0, weight=1)

        self.commandFrame = Frame(self, background="white")
        self.commandFrame.grid(row=0, column=0, columnspan=5, sticky=W+E)
        self.commandFrame.columnconfigure(1, weight=1)

        self.btnCommand = Button(self.commandFrame, text="Run")
        self.btnCommand.grid(row=0, column=0)

        self.strCommand = StringVar()
        self.entCommand = Entry(self.commandFrame, textvariable=self.strCommand)
        self.entCommand.grid(row=0, column=1, sticky=W+E)
        
        self.lstMacro = Listbox(self)
        self.lstMacro.grid(row=1, column=0, sticky=N+S+W+E)
        
        self.treeview = Treeview(self, columns=("Angle"), displaycolumns="#all", selectmode="browse")
        self.treeview.grid(row=1, column=1, columnspan=4, sticky=N+S+W+E)
        self.treeScrollbar = Scrollbar(self)
        self.treeScrollbar.grid(row=1, column=5, sticky=N+S)
        self.treeview.config(yscrollcommand=self.treeScrollbar.set)
        self.treeScrollbar.config(command=self.treeview.yview)

        self.btnFrame = Frame(self, background="white")
        self.btnFrame.grid(row=2, column=0, columnspan=5, sticky=W+E)

        self.btnRun = Button(self.btnFrame, text="Run", command=self.runMacro)
        self.btnRun.grid(row=0, column=0)
        
        self.btnStop = Button(self.btnFrame, text="Stop")
        self.btnStop.grid(row=0, column=1)

        self.btnSaveMacro = Button(self.btnFrame, text="Save Macro", command=self.saveMacro)
        self.btnSaveMacro.grid(row=0, column=2)

        self.btnDeleteMacro = Button(self.btnFrame, text="Delete Macro")
        self.btnDeleteMacro.grid(row=0, column=3)

        self.btnDeleteState = Button(self.btnFrame, text="Delete State")
        self.btnDeleteState.grid(row=0, column=4)

    def addState(self, robot):
        stateName = "state" + str(self.numStates)
        self.treeview.insert("", END, iid=stateName, text=stateName)
        limbNum = 0
        for limb in robot.getLimbs():
            limbName = "limb" + str(limbNum)
            self.treeview.insert(stateName, END, iid=stateName + "_" + limbName, text=limbName)
            partNum = 0
            for part in limb.getComponents():
                partName = "joint" + str(partNum)
                if isinstance(part, Joint):
                    self.treeview.insert(stateName + "_" + limbName,
                                         END,
                                         iid=stateName + "_" + limbName + "_" + partName,
                                         text=partName,
                                         values=[part.angle])
                    partNum += 1
            limbNum += 1
        self.numStates += 1

    def getState(self, stateNum, robot):
        stateName = "state" + str(stateNum)
        limbNum = 0
        for limb in robot.getLimbs():
            limbName = "limb" + str(limbNum)
            partNum = 0
            for part in limb.getComponents():
                partName = "joint" + str(partNum)
                if isinstance(part, Joint):
                    part.setAngle(int(self.treeview.item(stateName + "_" + limbName + "_" + partName, "values")[0]))
                    partNum += 1
            limbNum += 1

    def runMacro(self):
        thread = threading.Thread(target=self.updateState)
        thread.start()
            
    def updateState(self):
        for i in range(self.numStates):
            self.getState(i, self.parent.robotFrame.robot)
            time.sleep(.1)

    def saveMacro(self):
        pass
Ejemplo n.º 23
0
class Statistics(Toplevel):	
	def __init__(self,parent):
		Toplevel.__init__(self,parent)
		self.title("Статистика")	
		self.transient(parent)
		self.parent = parent

	#fields for parameters of search-----------------------------------------------------------------------------------
		paramframe = Frame(self,relief=GROOVE,width=200,bd=1)
		paramframe.pack(side=LEFT,fill=BOTH)

		Label(paramframe, text="Что вывести",width=20,height=2).grid(row=0,column=0,columnspan=2)
		what = Combobox(paramframe,state='readonly',values = [u"Расходы",u"Доходы",u"Всё"],height=5)
		what.set(u"Расходы")
		what.grid(row=1,column=0,columnspan=2)
		self.what = what		
		
		Label(paramframe, text="За период",height=2).grid(row=2,column=0,columnspan=2)
		when = Combobox(paramframe,state='readonly',values=[u"Сегодня",u"3 дня",u"5 дней",u"Неделю",u"3 недели",u"Месяц",u"Всё время"],height=5)
		when.set(u"Сегодня")
		when.grid(row=3,column=0,columnspan=2)
		self.when = when
		
		Label(paramframe,text="Упорядочить по",height=2).grid(row=4,column=0,columnspan=2)
		orderby = Combobox(paramframe,state='readonly',values=[u"Дата",u"Cумма",u"Категория"],height=3)
		orderby.set(u"Дата")
		orderby.grid(row=5,column=0,columnspan=2)
		
		self.orderby = orderby		

		Button(paramframe,text="Вывести",command=(lambda: self.getStatistics())).grid(row=6,column=0,columnspan=2)		

		Label(paramframe,text="Итого: ",height=20).grid(row=7,column=0)
		self.summarylbl = Label(paramframe,text='0.0',height=20)
		self.summarylbl.grid(row=7,column=1)


	#end ------------------------------------------------------------------------------------------------------------------
		
	#table -------------------------------------------------------------------------------------------------------------
		
		self.viewframe = Frame(self,relief=GROOVE,width=200,bd=1)
		self.viewframe.pack(side=RIGHT,fill=BOTH,expand=YES)

	#end ------------------------------------------------------------------------------------------------------------------

		self.geometry("%dx%d+%d+%d" % (1000,500,225,125))
		self.wait_window(self)
	
	def getStatistics(self):
		when = self.when.current()
		dateRange = ''
		
		if when == 0:
		#today
			dateRange = datetime.date.today()
		elif when == 1:
		#3 days
			dateRange = datetime.date.today() - datetime.timedelta(days=3)
		elif when == 2:
		#5 days
			dateRange = datetime.date.today() - datetime.timedelta(days=5)
		elif when == 3:
		#1 week
			dateRange = datetime.date.today() - datetime.timedelta(weeks=1)
		elif when == 4:
		#3 weeks
			dateRange = datetime.date.today() - datetime.timedelta(weeks=3)
		elif when == 5:
		#1 month
			dateRange = datetime.date.today() - datetime.timedelta(weeks=4)
		elif when == 6:
		#all 
			dateRange = '2012-01-01'
		
		orderby = self.orderby.current()
		if orderby == 0:
		#date
			orderby = 4
		elif orderby == 1:
		#summ
			orderby = 2
		elif orderby == 2:
		#c.title
			orderby = 6
			
		global payments
		payments.getPayments(1,str(dateRange))
		
		if hasattr(self, 'tree'):
			self.tree.destroy()
			
		self.tree = Treeview(self.viewframe,selectmode="extended",columns=('summ', 'comment', 'date','mul','category_title'))
		self.tree.heading('#0',text='№')
		self.tree.column('#0',width=15,anchor='center')
		
		
		self.tree.column('summ', width=60, anchor='center')
		self.tree.column('comment', anchor='center')
		self.tree.column('date', width=60, anchor='center')
		self.tree.column('mul', width=7, anchor='center')
		self.tree.column('category_title',  anchor='center')
		
		self.tree.heading('summ', text='Сумма')
		self.tree.heading('comment', text='Комметарий')
		self.tree.heading('date', text='Дата')
		self.tree.heading('mul', text='Количество')
		self.tree.heading('category_title', text='Категория')
		
		i=1
		summary = 0.0
		for row in payments.paymetsList:
			self.tree.insert('', i,str(i), text=str(i))
			self.tree.set(str(i),'summ',row['summ'])
			self.tree.set(str(i),'comment',row['comment'])
			self.tree.set(str(i),'date',row['date'])
			self.tree.set(str(i),'mul',row['mul'])
			self.tree.set(str(i),'category_title',row['category_title'])
			i+=1
			summary+=row['summ']*row['mul']
		
		self.summarylbl.config(text=str(summary))
		self.tree.pack(side=TOP, fill=BOTH, expand=YES)
		
		s = Scrollbar(self.tree, orient=VERTICAL, command=self.tree.yview)
		self.tree.configure(yscrollcommand=s.set)
		s.pack(side=RIGHT,fill=Y)
class SleepableThreadManagerGUI:
    ui = None  # Main UI Window

    top = None  # Top UI frame
    bottom = None  # Bottom UI frame

    allow_scroll = True

    manager = None  # Sleepable thread manager

    iidList = []

    ui_update_thread = None  # UI Update thread

    thread_dropdown = None  # Dropdown to select threads
    function_dropdown = None  # Dropdown to select functions

    thread_selected = None  # Variable for the thread selection
    threads_selected = []
    function_selected = None  # Variable for the function selection

    function_menu = None
    selection_context_menu = None
    empty_selection_context_menu = None

    info_tree_view = None  # Tree view for thread info
    output_textbox = None  # Output textbox for the UI thread to write to

    def __init__(self):
        self.manager = SleepableThreadManager()

        self.ui = Tk()
        self.ui.title('Sleepable Thread Manager')
        self.ui.geometry('550x600')

        self.function_selected = StringVar(self.ui)
        self.thread_selected = StringVar(self.ui)

        self.thread_selected.set('Select a Thread...')
        self.function_selected.set('Select a Function...')

        # create all of the main containers
        self.top = Frame(self.ui, width=300, height=50, pady=5)
        self.bottom = Frame(self.ui, bg='orange', width=300, height=20, pady=0)

        # main window
        self.ui.grid_columnconfigure(
            0, weight=1)  # expand main column when main ui resizes
        self.top.grid(row=0, sticky="ew")  # Stick top frame to east/west
        self.bottom.grid(
            row=1,
            sticky="nsew")  # Stick bottom frame to north/south/easy/west
        self.ui.grid_rowconfigure(
            1, weight=1)  # Expand bottom panel when main ui resizes

        # top frame component config
        self.top.grid_rowconfigure(
            0, weight=1)  # Expand first row when top frame resizes
        self.top.grid_rowconfigure(
            1, weight=1)  # Expand second row when top frame resizes
        self.top.grid_columnconfigure(
            1, weight=1)  # Expand second column when top frame resizes

        # bottom frame component config
        self.bottom.grid_rowconfigure(
            0, weight=1)  # Expand row 1 when bottom frame resizes
        self.bottom.grid_rowconfigure(
            1, weight=1)  # Expand row 2 when bottom frame resizes
        self.bottom.grid_columnconfigure(
            0, weight=1)  # Expand column 1 when bottom frame resizes
        self.bottom.grid_columnconfigure(0, weight=1)

        # create widgets for top frame
        function_label = Label(self.top, text='Function name:')
        self.function_dropdown = OptionMenu(
            self.top, self.function_selected,
            *self.manager.function_mappings.keys())

        # layout the widgets in the top frame
        function_label.grid(row=1, column=0)
        self.function_dropdown.grid(row=1, column=1, columnspan=3, sticky="ew")

        # create widgets for bottom frame
        self.selection_context_menu = Menu(self.info_tree_view)
        createMultiple = Menu(self.info_tree_view)
        functionMenu = Menu(self.selection_context_menu)
        functionMenu.add_command(
            label='Square', command=lambda: self.set_thread_function('Square'))
        functionMenu.add_command(
            label='Cube', command=lambda: self.set_thread_function('Cube'))

        self.selection_context_menu.add_cascade(label='Create...',
                                                menu=createMultiple)
        self.selection_context_menu.add_cascade(label='Set function...',
                                                menu=functionMenu)

        self.selection_context_menu.add_command(label='Start',
                                                command=self.start_thread)
        self.selection_context_menu.add_command(label='Sleep',
                                                command=self.sleep_thread)
        self.selection_context_menu.add_command(label='Wake',
                                                command=self.wake_thread)
        self.selection_context_menu.add_command(label='Stop',
                                                command=self.stop_thread)
        self.selection_context_menu.add_command(label='Restart',
                                                command=self.restart_thread)
        self.selection_context_menu.add_command(label='Remove',
                                                command=self.remove_thread)

        self.empty_selection_context_menu = Menu(self.info_tree_view)

        createMultiple.add_command(label='1', command=self.create_thread)
        createMultiple.add_command(
            label='5', command=lambda: self.create_thread(amount=5))
        createMultiple.add_command(
            label='10', command=lambda: self.create_thread(amount=10))
        createMultiple.add_command(
            label='20', command=lambda: self.create_thread(amount=20))

        self.empty_selection_context_menu.add_cascade(label='Create',
                                                      menu=createMultiple)

        self.info_tree_view = Treeview(self.bottom,
                                       columns=('Function', 'Status'))
        self.info_tree_view.heading('#0', text='Thread Name')
        self.info_tree_view.heading('#1', text='Function Name')
        self.info_tree_view.heading('#2', text='Status')
        self.info_tree_view.column('#0', width=100, stretch=NO)
        self.info_tree_view.column('#1', width=75)
        self.info_tree_view.column('#2', width=100, stretch=NO)
        self.info_tree_view.bind('<Button-3>', self.popup)
        self.output_textbox = Text(self.bottom,
                                   background="white",
                                   font=("Helvetica", 8))

        self.output_scrollbar = Scrollbar(self.bottom,
                                          command=self.output_textbox.yview)
        self.info_scrollbar = Scrollbar(self.bottom,
                                        command=self.info_tree_view.yview)

        # layout for the widgets in the bottom frame
        self.info_tree_view.grid(row=0, column=0, sticky='nsew')
        self.info_scrollbar.grid(row=0, column=1, sticky="nse")
        self.info_tree_view.config(yscrollcommand=self.info_scrollbar.set)

        self.output_textbox.grid(row=1, column=0, sticky='nsew')
        self.output_scrollbar.grid(row=1, column=1, sticky="nse")
        self.output_textbox.config(yscrollcommand=self.output_scrollbar.set)

        self.ui_update_thread = SleepableThread(work_wait=0.5)
        self.ui_update_thread.set_thread_work(self.refresh_output)
        self.ui_update_thread.start_thread()

        # Mainloop
        self.ui.mainloop()

    # UI refresh
    def refresh_tree_view(self):
        self.info_tree_view.delete(*self.info_tree_view.get_children())
        for item in self.manager.threads.items():
            self.info_tree_view.insert(
                '',
                'end',
                text=item[0],
                values=(str(item[1].work_function),
                        item[1].thread_state_mappings[item[1].thread_state]))

    def refresh_output(self):
        # function passed to ui thread, change to labels/gridview? need independent message queue on threads
        if self.manager.functions.MessageQueue.__len__() > 0:
            while self.manager.functions.MessageQueue.__len__() != 0:
                item = self.manager.functions.MessageQueue.pop()
                if len(item) >= 400:
                    raise Exception('Output too large')
                else:
                    self.output_textbox.delete('1.0', END)
                    self.output_textbox.insert(END, '{}\n'.format(item))
                    if self.manager.thread_stats(
                    )[1] > 0 and self.allow_scroll:
                        self.output_textbox.see('end')

    def popup(self, event):
        self.allow_scroll = False
        #iid = self.info_tree_view.identify_row(event.y)
        self.iidList = self.info_tree_view.selection()
        if self.iidList:
            if self.iidList > 0:
                for i in self.iidList:
                    self.threads_selected.append(
                        self.info_tree_view.item(i)['text'])
            # self.info_tree_view.selection_set(iid)
            # self.thread_selected.set(self.info_tree_view.item(iid)['text'])
            self.selection_context_menu.post(event.x_root, event.y_root)
        else:
            self.empty_selection_context_menu.post(event.x_root, event.y_root)
            pass
        self.manager.functions.MessageQueue = []
        self.allow_scroll = True

    # Button functions
    def create_thread(self, amount=1):
        i = 0
        while i != amount:
            self.manager.control(command='create')
            i += 1
        self.refresh_tree_view()

    def remove_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='remove')
        self.refresh_tree_view()

    def start_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='start')
        self.refresh_tree_view()

    def restart_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='restart')
        self.refresh_tree_view()

    def sleep_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='sleep')
        self.refresh_tree_view()

    def wake_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='wake')
        self.refresh_tree_view()

    def stop_thread(self):
        while self.threads_selected.__len__() != 0:
            self.manager.control(thread=self.threads_selected.pop(),
                                 command='stop')
        self.refresh_tree_view()

    def set_thread_function(self, funct):
        while self.threads_selected.__len__() != 0:
            self.manager.set_function(self.threads_selected.pop(), funct)
        self.refresh_tree_view()
Ejemplo n.º 25
0
keywords=Treeview(rightPan)
keywords["columns"]=["Frequency"]
style = Style(root)
style.configure('Treeview', rowheight=29,font='arial 10 bold')

keywords.heading("#0", text="Word")
keywords.heading("Frequency", text="Frequency")
keywords.column("#0", anchor=tk.CENTER)
keywords.column("Frequency", anchor=tk.CENTER)
keywordIndex={}
top10Words=topWords[-10:]

tree_i=0
for index,row in top10Words.iteritems():
    treeind=keywords.insert(parent="",index=0,text=str(index), values=(str(row)))
    keywordIndex[tree_i]=treeind
    tree_i+=1
    
rightPan.add(keywords)
keywords.pack()


#Sample    
lab4 =tk.Label(rightPan, text="Categorization Sample",font='arial 10 bold')
rightPan.add(lab4)
lab4.pack()


scrollbar = tk.Scrollbar(rightPan)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
class vb_sine_amplitude:
    def __init__(self,parent): 
        self.master=parent        # store the parent
        top = tk.Frame(parent)    # frame for all class widgets
        top.pack(side='top')      # pack frame in parent's window
        
        self.master.minsize(400,550)
        self.master.geometry("500x550")
        self.master.title("vb_sine_amplitude_gui.py ver 1.2  by Tom Irvine")         

        
        self.iflag=0
        
        crow=0
        
        self.hwtext1=tk.Label(top,text='Sine Amplitude Conversion Utility')
        self.hwtext1.grid(row=crow, column=0, columnspan=6, pady=7,sticky=tk.W)        
        
        crow=crow+1

        self.hwtext3=tk.Label(top,text='Select Input')
        self.hwtext3.grid(row=crow, column=0, columnspan=1, pady=7,sticky=tk.E)       
        
        crow=crow+1

        self.Lb1 = tk.Listbox(top,height=4,width=30,exportselection=0)
        self.Lb1.insert(1, "Displacement (peak-to-peak)")
        self.Lb1.insert(2, "Displacement (zero-to-peak)")
        self.Lb1.insert(3, "Velocity (zero-to-peak)")
        self.Lb1.insert(4, "Acceleration (zero-to-peak)")        
        self.Lb1.grid(row=crow, column=0, columnspan=2, pady=4)
        self.Lb1.select_set(0) 
        self.Lb1.bind("<<ListboxSelect>>", self.OnKeyPress)        

        crow=crow+1
        
        self.hwtext_freq=tk.Label(top,text='Enter Frequency (Hz)')
        self.hwtext_freq.grid(row=crow, column=0, columnspan=6, pady=12,sticky=tk.W) 
 
        self.amp_text=tk.StringVar()  
        self.amp_text.set('Enter Displacement (peak-to-peak)')         
        self.hwtext_amp=tk.Label(top,textvariable=self.amp_text)
        self.hwtext_amp.grid(row=crow, column=1, columnspan=6, padx=40, pady=12,sticky=tk.S)          
             
        crow=crow+1             

        self.fnr=tk.StringVar()  
        self.fnr.set('')  
        self.fn_entry=tk.Entry(top, width = 12,textvariable=self.fnr)
        self.fn_entry.grid(row=crow, column=0,padx=5, pady=1,sticky=tk.N)  

        self.ampr=tk.StringVar()  
        self.ampr.set('')  
        self.amp_entry=tk.Entry(top, width = 12,textvariable=self.ampr)
        self.amp_entry.grid(row=crow, column=1,padx=20, pady=1,sticky=tk.NE)
        
        self.Lb2 = tk.Listbox(top,height=2,width=10,exportselection=0)
        self.Lb2.insert(1, "inch")
        self.Lb2.insert(2, "mm")
        self.Lb2.grid(row=crow, column=2, columnspan=1, padx=1,pady=1,sticky=tk.NW)
        self.Lb2.select_set(0)        
        
        crow=crow+1    
        
        self.button_calculate = tk.Button(top, text="Calculate", command=self.calculation)
        self.button_calculate.config( height = 2, width = 15)
        self.button_calculate.grid(row=crow, column=0,columnspan=1, pady=20) 
                
        root=self.master             

        self.button_quit=tk.Button(top, text="Quit", command=lambda root=root:quit(root))
        self.button_quit.config( height = 2, width = 15 )
        self.button_quit.grid(row=crow, column=1,columnspan=1, padx=10,pady=20)
        
        crow=crow+1  
        
        self.hwtext_results=tk.Label(top,text='Results')
        self.hwtext_results.grid(row=crow, column=0, columnspan=2, pady=12) 

        crow=crow+1          
                
        self.tree = Treeview(top,selectmode="extended",columns=("A","B"),height=5)
        self.tree.grid(row=crow, column=0,columnspan=2, padx=10,pady=1,sticky=tk.NW)

        self.tree.heading('#0', text='') 
        self.tree.heading('A', text='Parameter')          
        self.tree.heading('B', text='Value')
        
        self.tree.column('#0',minwidth=0,width=1)
        self.tree.column('A',minwidth=0,width=170, stretch=tk.YES)        
        self.tree.column('B',minwidth=0,width=85)              


################################################################################

    def OnKeyPress(self,event):
        self.Lb2.delete(0, tk.END)

        n=1+int(self.Lb1.curselection()[0]) 

        s1='Enter Displacement (peak-to-peak)'
        s2='Enter Displacement (zero-to-peak)'
        s3='Enter Velocity'
        s4='Enter Acceleration'


        if(n==1 or n==2):
            str1='inch'
            str2='mm'

        if(n==1):
            self.amp_text.set(s1)

        if(n==2):
            self.amp_text.set(s2)

        if(n==3):
            self.amp_text.set(s3)
            str1='inch/sec'
            str2='m/sec'

        if(n==4):
            self.amp_text.set(s4)
            str1='G'
            str2='m/sec^2'


        self.Lb2.insert(1, str1)
        self.Lb2.insert(2, str2)
        self.Lb2.select_set(0) 
          
###############################################################################        

    def calculation(self):
        
        x=self.tree.get_children()
        
        for i in range (0,len(x)):
            self.tree.delete(x[i])
                
#        map(self.tree.delete, self.tree.get_children())

        n=1+int(self.Lb1.curselection()[0]) 
        m=1+int(self.Lb2.curselection()[0])         

        freq= float(self.fnr.get())   
        amp= float(self.ampr.get())        
        
        omega=2*np.pi*freq
        om2=omega**2     
        
        mm_per_in=25.4
        in_per_mm=1/mm_per_in

        m_per_in=mm_per_in/1000
        in_per_m=1/m_per_in

        dzp_in=0
        dzp_mm=0
        dpp_in=0
        dpp_mm=0        

        if(n==1):
#
           if(m==1):  # inch input
               dpp_in=amp
               dpp_mm=amp*mm_per_in       
           else:
               dpp_mm=amp
               dpp_in=amp*in_per_mm     
   
#
           dzp_in=dpp_in/2
           dzp_mm=dpp_mm/2

        if(n==2):

           if(m==1):  # inch input
               dzp_in=amp
               dzp_mm=amp*mm_per_in       
           else:
               dzp_mm=amp
               dzp_in=amp*in_per_mm     
   
        if(n==3):

           if(m==1):  # in/sec input
               v_ips=amp
               v_mps=amp*m_per_in  

           else:  # m/sec
              v_mps=amp 
              v_ips=amp*in_per_m

           dzp_in=v_ips/omega
           dzp_mm=(v_mps/omega)*1000
           
        if(n==4):

           if(m==1):  # G input
             a_g=amp
             a_mps2=amp*9.81 

           else:  # m/sec
             a_mps2=amp 
             a_g=amp/9.81
   
           dzp_in=(a_g/om2)*386
           dzp_mm=(a_mps2/om2)*1000

        if(n!=1):
           dpp_in=dzp_in*2
           dpp_mm=dzp_mm*2

        if(n!=3):
           v_ips=omega*dzp_in
           v_mps=omega*(dzp_mm)/1000

        if(n!=4):
           a_g=om2*dzp_in/386
           a_mps2=om2*dzp_mm/1000

        print ("\n")

        s0='Frequency'
        s1="%8.4g Hz" %freq
        self.tree.insert('', 'end', values=(s0,s1))
        print (s0,s1)

        s0='Displacement (peak-to-peak)'
        if(m==1):
            s1="%8.4g in" %dpp_in
        else:
            s1="%8.4g mm" %dpp_mm
        self.tree.insert('', 'end', values=(s0,s1))
        print (s0,s1)
        
        s0='Displacement (zero-to-peak)'
        if(m==1):
            s1="%8.4g in" %dzp_in
        else:
            s1="%8.4g mm" %dzp_mm
        self.tree.insert('', 'end', values=(s0,s1))
        print (s0,s1)
        
        s0='Velocity (zero-to-peak)'
        if(m==1):
            s1="%8.4g in/sec" %v_ips
        else:
            s1="%8.4g m/sec" %v_mps
        self.tree.insert('', 'end', values=(s0,s1))
        print (s0,s1)
            
        s0='Accel (zero-to-peak)'
        if(n==3 and m==2):
            s1="%8.4g m/sec^2" %a_mps2
        else:
            s1="%8.4g G" %a_g            
        self.tree.insert('', 'end', values=(s0,s1))    
        print (s0,s1)

        self.iflag=1        
Ejemplo n.º 27
0
class App(object):
    def __init__(self, root, cursor, db):
        self.frame = Frame(root)
        self.frame.configure(background='white')
        self.list_toplevel = {}
        self.cursor = cursor
        self.db = db
        self.child_toplevel = None
        self.frame.pack()
        image = Image.open("photo.jpg")
        image = image.resize((250, 250), Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)
        label = Label(self.frame, image=photo)
        label.grid(row=0, column=0, sticky=W)
        label.image = photo  # keep a reference!
        nou_registre = LabelFrame(self.frame,
                                  text="Nou registre",
                                  fg="Blue",
                                  padx=5,
                                  pady=5)
        nou_registre.configure(background='white')
        nou_registre.grid(row=0, column=1, padx=15, sticky=W)

        text_nom = Label(nou_registre, text="Nom:", fg="Blue")
        text_nom.configure(background='white')
        text_nom.grid(row=0, column=0)
        self.entry_nom = Entry(nou_registre)
        self.entry_nom.grid(row=0, column=1, sticky=W)

        text_telefon = Label(nou_registre, text="Telèfon: ", fg="Blue")
        text_telefon.configure(background='white')
        text_telefon.grid(row=1, column=0)
        self.entry_telefon = Entry(nou_registre)
        self.entry_telefon.grid(row=1, column=1)

        text_email = Label(nou_registre, text="Email: ", fg="Blue")
        text_email.configure(background='white')
        text_email.grid(row=2, column=0)
        self.entry_email = Entry(nou_registre)
        self.entry_email.grid(row=2, column=1)

        button_afegir_contacte = Button(nou_registre,
                                        text="Afegir contacte",
                                        fg="Blue",
                                        command=self.afegeix_contacte)
        button_afegir_contacte.grid(row=3, column=1, sticky=E)

        button_mostra_historic = Button(nou_registre,
                                        text="Mostra historic",
                                        fg="Blue",
                                        command=self.mostra_historic)
        button_mostra_historic.grid(row=4, column=0, sticky=W)

        mostrar_contactes = Button(self.frame,
                                   text="Mostrar contactes",
                                   fg="Blue",
                                   command=self.insert_contacts_treeview)
        mostrar_contactes.grid(sticky=W, row=3)

        self.missatge_error_confirmacio = StringVar()

        self.label_error_confirmacio = Label(
            self.frame, textvariable=self.missatge_error_confirmacio, fg="Red")
        self.label_error_confirmacio.configure(background='white')
        self.label_error_confirmacio.grid(sticky=W, row=3, column=1)

        self.agenda_contactes = Treeview(self.frame,
                                         columns=["nom", "tel"],
                                         show="headings")
        self.agenda_contactes.heading("nom", text="Nom")
        self.agenda_contactes.heading("tel", text="Telefon")
        self.agenda_contactes.column("nom",
                                     minwidth=0,
                                     width=200,
                                     stretch=NO,
                                     anchor="c")
        self.agenda_contactes.column("tel",
                                     minwidth=0,
                                     width=200,
                                     stretch=NO,
                                     anchor="c")
        self.agenda_contactes.grid(row=4, column=0, padx=0, columnspan=2)

        self.insert_contacts_treeview()
        elimina_seleccionat = Button(self.frame,
                                     text="Eliminar seleccionat",
                                     command=self.elimina_contacte,
                                     fg="Blue")
        elimina_seleccionat.grid(row=5, column=0, sticky=W)

        self.modificar_seleccionat = Button(self.frame,
                                            text="Modificar seleccionat",
                                            fg="Blue",
                                            command=self.modifica_contacte)
        self.modificar_seleccionat.grid(row=5, column=1, sticky=W)
        sortir = Button(self.frame,
                        text="Sortir",
                        fg="Blue",
                        command=self.frame.quit)
        sortir.grid(row=5, column=2, sticky=E)

    def mostra_historic(self):
        popup = Toplevel()
        agenda_historic = Treeview(
            popup,
            columns=["nom", "tel", "email", "path", "accio", "data"],
            show="headings")
        agenda_historic.heading("nom", text="Nom")
        agenda_historic.heading("tel", text="Telefon")
        agenda_historic.heading("email", text="Email")
        agenda_historic.heading("path", text="Path")
        agenda_historic.heading("accio", text="Acció")
        agenda_historic.heading("data", text="Data")
        agenda_historic.column("nom",
                               minwidth=0,
                               width=150,
                               stretch=True,
                               anchor="c")
        agenda_historic.column("tel",
                               minwidth=0,
                               width=100,
                               stretch=True,
                               anchor="c")
        agenda_historic.column("email",
                               minwidth=0,
                               width=150,
                               stretch=True,
                               anchor="c")
        agenda_historic.column("path",
                               minwidth=0,
                               width=200,
                               stretch=True,
                               anchor="c")
        agenda_historic.column("accio",
                               minwidth=0,
                               width=100,
                               stretch=True,
                               anchor="c")
        agenda_historic.column("data",
                               minwidth=0,
                               width=150,
                               stretch=True,
                               anchor="c")
        agenda_historic.grid(row=0, column=0, padx=5, pady=5)
        self.cursor.execute("select * from HISTORIC ORDER BY data DESC;")
        dades = self.cursor.fetchall()
        for data_usuari in dades:
            agenda_historic.insert('', 'end', values=data_usuari)

    def insert_contacts_treeview(self):
        self.cursor.execute("select * from CONTACTES order by nom ASC;")
        self.agenda_contactes.delete(*self.agenda_contactes.get_children())
        for i in self.cursor.fetchall():
            self.agenda_contactes.insert('', 'end', values=i[:2])

    def show_image(self, imatge_label, path_imatge=''):
        file_per_default = 'avatar.jpeg'
        if path_imatge == '':

            image = Image.open(file_per_default)
        else:
            if os.path.exists(path_imatge):
                try:
                    image = Image.open(path_imatge)
                except:
                    print "Error al mostrar imatge!"
                    return False
            else:
                image = Image.open(file_per_default)

        image = image.resize((120, 120), Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)
        imatge_label.configure(image=photo)
        imatge_label.image = photo
        return True

    def edit_image(self, imatge_label, path_imatge, nom, telefon):
        if os.path.isfile(path_imatge):
            try:
                image = Image.open(path_imatge)
            except:
                self.missatge_error_confirmacio.set("Imatge incorrecte!")

            else:
                try:
                    self.cursor.execute(
                        "UPDATE CONTACTES SET foto=:pathfoto where nom=:nom and telf=:telf",
                        {
                            'pathfoto': path_imatge,
                            'nom': nom,
                            'telf': str(telefon)
                        })
                    self.db.commit()
                except:
                    self.missatge_error_confirmacio.set(
                        "Error actualitzant la imatge!")
                    return False

        self.show_image(imatge_label, path_imatge)

    def demana_imatge(self, imatge_label, nom, telefon):
        t = tkFileDialog.askopenfilename(title="Selecciona foto",
                                         filetypes=(("jpg files", "*.jpg"),
                                                    ("jpeg files", "*.jpeg"),
                                                    ("all files", "*.*")))
        if t:
            self.edit_image(imatge_label, t, nom, telefon)

    def modificar_contacte(self, entries_fixed, entries_variable,
                           treeview_seleccionat):
        #print dades_usuari
        nom_fixed = entries_fixed[0]
        telefon_fixed = entries_fixed[1]
        email_fixed = entries_fixed[2]

        telefon_variable = entries_variable[0]
        email_variable = entries_variable[1]

        valor_text_telefon_antic = entries_fixed[3]
        valor_text_email_antic = entries_fixed[4]

        changed_email = False
        changed_tel = False
        if email_variable.get() != '':
            try:
                self.check_email(email_variable.get())
            except:
                self.missatge_error_confirmacio.set("El mail no és correcte!")
            else:
                self.cursor.execute(
                    "UPDATE CONTACTES SET email=:email where nom=:nom and telf=:telf",
                    {
                        'email': email_variable.get(),
                        'nom': nom_fixed.get(),
                        'telf': str(telefon_fixed.get())
                    })
                valor_text_email_antic.set(email_variable.get())
                changed_email = True

        if telefon_variable.get() != '':
            try:
                assert int(telefon_variable.get()) >= 600000000
            except:
                self.missatge_error_confirmacio.set("Error en el telefon!")
            else:
                try:
                    self.cursor.execute(
                        "UPDATE CONTACTES SET telf=:nou_telf where nom=:nom and telf=:telf",
                        {
                            'nou_telf': telefon_variable.get(),
                            'nom': nom_fixed.get(),
                            'telf': str(telefon_fixed.get())
                        })
                except sqlite3.IntegrityError:
                    self.missatge_error_confirmacio.set(
                        "El telèfon ja està registrat!")
                else:
                    changed_tel = True
                    self.agenda_contactes.item(treeview_seleccionat,
                                               values=(nom_fixed.get(),
                                                       telefon_variable.get()))
                    valor_text_telefon_antic.set(telefon_variable.get())

        self.db.commit()
        if changed_email & changed_tel:
            self.missatge_error_confirmacio.set(
                "Dades modificades correctament!")
        elif changed_email:
            self.missatge_error_confirmacio.set(
                "Email modificat correctament!")
        elif changed_tel:
            self.missatge_error_confirmacio.set(
                "Telefon modificat correctament!")

    def modifica_contacte(self):
        if self.child_toplevel is not None:
            self.child_toplevel.destroy()

        element_a_modificar = self.agenda_contactes.focus()
        valor_usuari = self.agenda_contactes.item(
            element_a_modificar)['values']
        self.cursor.execute("select * from CONTACTES where nom=? and telf=?;",
                            tuple(valor_usuari))
        dades = self.cursor.fetchone()
        t = Toplevel()
        self.child_toplevel = t

        label_imatge = Label(t)
        label_imatge.configure(background='white')
        label_imatge.pack(side="left", fill="both", expand=True)
        self.show_image(label_imatge, dades[3])
        frame_info = Frame(t)
        frame_info.pack(side="right", fill="both", expand=False)
        frame_info.configure(background='white')
        label_nom = Label(frame_info, text="Nom: ")
        label_nom.configure(background='white')
        label_nom.grid(row=0, column=0)
        entry_nom = Entry(frame_info,
                          textvariable=StringVar(frame_info, value=dades[0]),
                          width=20,
                          state='disabled')
        entry_nom.grid(row=0, column=1)
        label_telefon = Label(frame_info, text="Telefon antic: ")
        label_telefon.configure(background='white')
        label_telefon.grid(row=1, column=0)
        text_telefon = StringVar(frame_info, value=dades[1])
        entry_telefon = Entry(frame_info,
                              textvariable=text_telefon,
                              width=20,
                              state='disabled')
        entry_telefon.grid(row=1, column=1)

        label_telefon_nou = Label(frame_info, text="Telefon nou: ")
        label_telefon_nou.configure(background='white')
        label_telefon_nou.grid(row=2, column=0)
        entry_telefon_nou = Entry(frame_info, width=20)
        entry_telefon_nou.grid(row=2, column=1)

        label_email = Label(frame_info, text="Email: ")
        label_email.configure(background='white')
        label_email.grid(row=3, column=0)
        text_email = StringVar(frame_info, value=dades[2])  #-----
        entry_email = Entry(frame_info,
                            width=20,
                            textvariable=text_email,
                            state='disabled')
        entry_email.grid(row=3, column=1)
        label_email_nou = Label(frame_info, text="Email nou:")
        label_email_nou.configure(background='white')
        label_email_nou.grid(row=4, column=0)
        entry_email_nou = Entry(frame_info, width=20)
        entry_email_nou.grid(row=4, column=1)

        selecciona_imatge = Button(
            frame_info,
            text="Edita foto",
            command=lambda: self.demana_imatge(label_imatge, dades[0],
                                               text_telefon.get()))
        selecciona_imatge.grid(row=5)
        button_modifica_contacte = Button(
            frame_info,
            text="Modificar contacte",
            fg="Blue",
            command=lambda: self.modificar_contacte([
                entry_nom, entry_telefon, entry_email, text_telefon, text_email
            ], [entry_telefon_nou, entry_email_nou], element_a_modificar))
        button_modifica_contacte.grid(row=6, column=1, sticky=E)

    def check_email(self, email):
        if re.match("(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)",
                    email):
            return True
        else:
            raise "Mail no vàlid!"

    def elimina_contacte(self):
        element_seleccionat = self.agenda_contactes.focus()
        if element_seleccionat != '':
            informacio_contacte = self.agenda_contactes.item(
                element_seleccionat)['values']
            self.cursor.execute("DELETE from CONTACTES where nom=? and telf=?",
                                tuple(informacio_contacte))
            self.db.commit()
            self.agenda_contactes.delete(element_seleccionat)
            self.missatge_error_confirmacio.set("Borrat correctament")
            if self.child_toplevel is not None:
                self.child_toplevel.destroy()
            #print self.agenda_contactes.focus()
            #print self.agenda_contactes.selection()
        else:
            self.missatge_error_confirmacio.set("Selecciona un usuari!")
            print "Selecciona element"

    def afegeix_contacte(self):
        try:
            Nom = self.entry_nom.get()
            assert Nom != ''
            Telef = int(self.entry_telefon.get())
            assert Telef > 600000000
            Email = self.check_email(self.entry_email.get())

        except:
            self.missatge_error_confirmacio.set(
                "Introdueix les dades correctament!")
        else:
            try:
                self.cursor.execute(
                    """INSERT INTO CONTACTES values (?,?,?,'');""",
                    (Nom.title(), Telef, self.entry_email.get()))
                self.db.commit()
            except sqlite3.IntegrityError:
                self.missatge_error_confirmacio.set("Contacte ja existent!")

            else:
                self.insert_contacts_treeview()
                self.missatge_error_confirmacio.set(
                    "Afegit contacte correctament")
class wine_DB_manager:  #Class for wrapping TKinter widgets
    def __init__(self, master):  #Initilize the attributes of the class

        master.minsize(width=600, height=700)  #Set window size and title
        master.title("Member and Store Manager")

        master.grid_columnconfigure(
            0, weight=1
        )  #Configure first and last columns for centering columns 1-5
        master.grid_columnconfigure(6, weight=1)
        master.grid_rowconfigure(
            12, weight=1
        )  #Configure last row for filling left over space at the bottom

        self.imp_store_label = Label(
            master, text="Import Store Information (.CSV)"
        )  #Initilize lable, entry, and buttons for importing stores
        self.imp_store_entry = Entry(master, width=70)
        self.imp_store_browse_button = Button(
            master,
            text="Browse",
            command=lambda: self.browse_for_CSV("store"))
        self.imp_store_import_button = Button(
            master,
            text="Import",
            command=lambda: self.import_to_DB(self.imp_store_entry.get(),
                                              "store"))

        self.imp_member_label = Label(
            master, text="Import Member Information (.CSV)"
        )  #Initilize lable, entry, and buttons for importing members
        self.imp_member_entry = Entry(master, width=70)
        self.imp_member_browse_button = Button(
            master,
            text="Browse",
            command=lambda: self.browse_for_CSV("member"))
        self.imp_member_import_button = Button(
            master,
            text="Import",
            command=lambda: self.import_to_DB(self.imp_member_entry.get(),
                                              "member"))

        self.horz_divider = Frame(
            master, height=1, width=500, bg="black"
        )  #Initilize a frame shaped as a horizonal line as a divider

        self.view_all_members_button = Button(
            master,
            text="View All Members",
            width=17,
            command=lambda: self.select_all_members()
        )  #Initilize button for selecting all members and displaying them in tree

        self.zip_label = Label(
            master, text="Zip Code"
        )  #Initilize lable, entry, combobox, and buttons for
        self.zip_entry = Entry(
            master,
            width=10)  #finding who paid dues by zip code and month paid
        self.month_label = Label(master, text="Month")
        self.month_combobox = Combobox(master, width=10)
        self.month_combobox['values'] = ('January', 'February', 'March',
                                         'April', 'May', 'June', 'July',
                                         'August', 'September', 'October',
                                         'November', 'December')
        self.find_users_that_paid = Button(
            master,
            text="Current Paid Users",
            width=20,
            command=lambda: self.select_paid_dues_month(
                self.zip_entry.get(), self.month_combobox.current()))

        self.state_label = Label(
            master,
            text="State")  #Initilize lable, entry, combobox, and buttons for
        self.state_combobox = Combobox(
            master,
            width=3)  #finding users who have joined the club since a date
        self.state_combobox['values'] = ('MD', 'NC', 'PA', 'VA', 'WV'
                                         )  #and belong to a specific state
        self.date_label = Label(master, text="Date (YYYY-MM-DD)")
        self.date_entry = Entry(master, width=10)
        self.find_users_that_joined = Button(
            master,
            text="Users Joined Since",
            width=20,
            command=lambda: self.select_users_joined_since(
                self.state_combobox.get(), self.date_entry.get()))

        self.users_that_love_total_wine = Button(
            master,
            text="Users that Love Total Wine",
            width=20,
            command=lambda: self.select_users_love_Tot_Wine(
            ))  #Initilize button for finding users that love Total Wines

        self.users_favorite_stores = Button(
            master,
            text="User's Favorite Stores",
            width=20,
            command=lambda: self.select_users_fav_stores()
        )  #Initilize button for finding users, their favorite stores, and store locations

        self.table_tree = Treeview(
            master, selectmode="extended")  #Initilize tree for data viewing
        self.table_tree["columns"] = (
            "one", "two", "three", "four", "five", "six", "seven", "eight",
            "nine", "ten", "eleven")  #Provide max column count and identifiers
        for columns in self.table_tree[
                "columns"]:  #For loop to add all columns
            self.table_tree.column(columns, width=70, anchor=W)
        self.table_tree['show'] = 'headings'  #Remove empty identity column

        self.vert_scroll_bar = Scrollbar(
            orient="vertical",
            command=self.table_tree.yview)  #Initilize scroll bar
        self.table_tree.configure(yscrollcommand=self.vert_scroll_bar.set
                                  )  #Add scroll bar to table_tree

        self.imp_store_label.grid(
            sticky="W", row=1, column=1, padx=10,
            pady=(20, 0))  #Grid positioning for all initialized attributes
        self.imp_store_entry.grid(sticky="W",
                                  row=2,
                                  column=1,
                                  columnspan=3,
                                  padx=10)
        self.imp_store_browse_button.grid(row=2, column=4, padx=10)
        self.imp_store_import_button.grid(row=2, column=5)

        self.imp_member_label.grid(sticky="W", row=3, column=1, padx=10)
        self.imp_member_entry.grid(sticky="W",
                                   row=4,
                                   column=1,
                                   columnspan=3,
                                   padx=10)
        self.imp_member_browse_button.grid(row=4, column=4, padx=10)
        self.imp_member_import_button.grid(row=4, column=5)

        self.horz_divider.grid(row=5, column=0, columnspan=7, pady=20)

        self.view_all_members_button.grid(row=6, column=1, columnspan=5)

        self.zip_label.grid(sticky="W", row=7, column=1, pady=(15, 0))
        self.zip_entry.grid(sticky="W", row=8, column=1, pady=5)
        self.month_label.grid(sticky="W",
                              row=7,
                              column=1,
                              padx=(100, 0),
                              pady=(15, 0))
        self.month_combobox.grid(sticky="W",
                                 row=8,
                                 column=1,
                                 padx=(100, 0),
                                 pady=5)
        self.find_users_that_paid.grid(sticky="W",
                                       row=9,
                                       column=1,
                                       columnspan=3,
                                       pady=5)

        self.state_label.grid(sticky="W", row=7, column=4, pady=(15, 0))
        self.state_combobox.grid(sticky="W", row=8, column=4, pady=5)
        self.date_label.grid(sticky="W",
                             row=7,
                             column=4,
                             columnspan=3,
                             padx=(85, 0),
                             pady=(15, 0))
        self.date_entry.grid(sticky="W",
                             row=8,
                             column=4,
                             columnspan=2,
                             padx=(85, 0),
                             pady=5)
        self.find_users_that_joined.grid(sticky="W",
                                         row=9,
                                         column=4,
                                         columnspan=2,
                                         pady=5)

        self.users_that_love_total_wine.grid(sticky="W",
                                             row=10,
                                             column=1,
                                             columnspan=3,
                                             pady=(15, 0))

        self.users_favorite_stores.grid(sticky="W",
                                        row=10,
                                        column=4,
                                        columnspan=2,
                                        pady=(15, 0))

        self.table_tree.grid(sticky="NWES",
                             row=11,
                             column=0,
                             columnspan=7,
                             rowspan=2,
                             pady=10,
                             padx=(10, 0))
        self.vert_scroll_bar.grid(sticky="NWES",
                                  row=11,
                                  column=7,
                                  rowspan=2,
                                  pady=10,
                                  padx=(0, 10))

    def browse_for_CSV(
        self, CSV_type
    ):  #Class method for browse buttons. Used for passing file path to TKinter entries

        file = tkFileDialog.askopenfile(
            parent=root, mode='rb',
            title='Choose a file')  #Opens browse for file window

        if (file != None):  #If file exists read into data and close file

            data = file.read()
            file.close()

            if (
                    CSV_type == "store"
            ):  #In order to resuse code, this method works for both buttons
                self.imp_store_entry.delete(
                    0, END)  #through using a passed button identity variable
                self.imp_store_entry.insert(0, os.path.abspath(file.name))

            else:
                self.imp_member_entry.delete(0, END)  #Empties entry widget
                self.imp_member_entry.insert(
                    0, os.path.abspath(file.name)
                )  #Inserts file path into entry widget using os.path import
        else:  #Catches no file selected possibility
            tkMessageBox.showinfo("Error", "No File Selected")

        return None

    def create_DB_connection(
        self
    ):  #Class method for opening a database connection to the pythonsqlite.db file

        try:
            DB_file = "SQLite_db\pythonsqlite.db"
            conn = sqlite3.connect(DB_file)
            return conn

        except Error as e:  #Catches non-connectivity errors
            print(e)

        return None

    def import_to_DB(
        self, file_path, CSV_type
    ):  #Class method for import buttons. Used to open csv files from path string
        #in entry widgets. Then opens db connection to import data to db
        try:
            self.CSV_file = open(file_path, "r")  #Opens CSV file in read mode
        except IOError as e:  #Catches file not found error
            tkMessageBox.showinfo("Error", "File Not Found")
            return

        CSV_reader = csv.reader(
            self.CSV_file
        )  #Reads CSV file into CSV_reader using csv.reader import
        conn = self.create_DB_connection()  #Calls for DB connection to open

        cur = conn.cursor()

        if (
                CSV_type == "store"
        ):  #In order to resuse code, this method works for both buttons by passed type.
            if (next(CSV_reader)[0][0:8] !=
                    "Store id"):  #Checks CSV for proper store headings
                tkMessageBox.showinfo(
                    "CSV Type Error",
                    "Please Import a CSV file formated for store data.")
                self.CSV_file.close(
                )  #If not proper headings close file and display message
                return
            else:  #Create table Stores
                cur.execute(
                    '''CREATE TABLE IF NOT EXISTS Stores (                                                                                 
                                store_id INTEGER PRIMARY KEY, 
                                store_name VARCHAR, 
                                location VARCHAR)''')

                for row in CSV_reader:  #Insert new values for each row in CSV
                    cur.execute(
                        '''INSERT OR IGNORE INTO Stores (                                                                                  
                                    store_id, 
                                    store_name, 
                                    location) 
                                    VALUES (?, ?, ?)''', row)
                tkMessageBox.showinfo(
                    "Success!",
                    "Successfully Updated the Database")  #Display confirmation
                self.imp_store_entry.delete(0, END)  #Clear import entry

        else:
            if (next(CSV_reader)[0][0:6] !=
                    "Member"):  #Checks CSV for proper member headings
                tkMessageBox.showinfo(
                    "CSV Type Error",
                    "Please Import a CSV file formated for member data.")
                self.CSV_file.close(
                )  #If not proper headings close file and display message
                return
            else:  #Create table Members
                cur.execute('''CREATE TABLE IF NOT EXISTS Members (     
                                member_id INTEGER PRIMARY KEY, 
                                last_name VARCHAR, 
                                first_name VARCHAR, 
                                street VARCHAR, 
                                city VARCHAR, 
                                state VARCHAR, 
                                zip VARCHAR, 
                                phone VARCHAR, 
                                favorite_store INTEGER, 
                                date_joined DATE, 
                                dues_paid DATE, 
                                FOREIGN KEY(favorite_store) 
                                REFERENCES Stores(store_id))''')

                for row in CSV_reader:  #Insert new values for each row in CSV
                    cur.execute(
                        '''INSERT OR IGNORE INTO Members (
                                        member_id, 
                                        last_name, 
                                        first_name, 
                                        street, 
                                        city , 
                                        state, 
                                        zip, 
                                        phone, 
                                        favorite_store, 
                                        date_joined, 
                                        dues_paid) 
                                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
                        row)
                tkMessageBox.showinfo("Success!",
                                      "Successfully Updated the Database")
                self.imp_member_entry.delete(0, END)

        self.CSV_file.close()  #Close CSV file
        conn.commit()  #Commit DB changes
        conn.close()  #Close DB Connection

        return None

    def generate_member_column_names(
            self
    ):  #Class utility method for adding member column headers to tree

        all_member_column_names = ("Member ID", "Last Name", "First Name",
                                   "Street", "City", "State", "Zip Code",
                                   "Phone", "Favorite Store", "Date Joined",
                                   "Dues Paid")

        for index, columns in enumerate(self.table_tree["columns"]
                                        ):  #For loop to add all column headers
            self.table_tree.heading(columns,
                                    text=all_member_column_names[index])

        return None

    def select_all_members(
        self
    ):  #Class method for View All Members Buttons and outputs new data to tree

        cur = self.create_DB_connection().cursor(
        )  #Calls for DB connection to open
        cur.execute("SELECT * FROM Members ORDER BY last_name ASC"
                    )  #SQL Statement to SELECT all members and their data.

        rows = cur.fetchall()  #Fetches data into rows

        self.table_tree.delete(*self.table_tree.get_children()
                               )  #Deletes old data in tree if present

        self.generate_member_column_names(
        )  #Call utility to generate column member headers

        for index, row in enumerate(
                rows):  #Inserts sql data into tree rows for viewing
            self.table_tree.insert('', index, values=(row))

        self.create_DB_connection().close()  #Close DB Connection
        return None

    def select_paid_dues_month(
        self, zip, month
    ):  #Class method for Current Paid User Button and outputs new data to tree

        month = month + 1  #Add 1 to month index count since it range is 0-11 and months are 1-12
        if (month < 10):
            self.month_string = "0" + str(month)

        cur = self.create_DB_connection().cursor(
        )  #Calls for DB connection to open

        if (month not in range(1, 12)):  #If no month selected display message
            tkMessageBox.showinfo("Error", "No Month Selected")
            return

        if (len(zip) != 5):  #If zip not 5 digits display message
            tkMessageBox.showinfo("Error", "Enter a Zip Code")
            return

        try:
            cur.execute("SELECT * FROM Members WHERE zip = " + zip +
                        " AND strftime('%m',dues_paid) = '" +
                        self.month_string +
                        "'")  #If zip is numeric execute Select Statement
        except Error as e:  #Catches error if zip not numeric
            tkMessageBox.showinfo("Error", "Enter a Zip Code")
            return

        rows = cur.fetchall()

        self.table_tree.delete(*self.table_tree.get_children()
                               )  #Deletes old data in tree if present

        self.generate_member_column_names(
        )  #Call utility to generate column member headers

        for index, row in enumerate(
                rows):  #Inserts sql data into tree rows for viewing
            self.table_tree.insert('', index, values=(row))

        self.create_DB_connection().close()  #Close DB Connection
        return None

    def select_users_joined_since(
        self, state, the_date
    ):  #Class method for Current Paid User Button and outputs new data to tree

        cur = self.create_DB_connection().cursor(
        )  #Calls for DB connection to open

        if state == "":  #if no state selected display message
            tkMessageBox.showinfo("Error", "No State Selected")
            return

        try:  #Checks date format YYYY-MM-DD
            datetime.datetime.strptime(the_date, '%Y-%m-%d')
        except ValueError:  #Catches invalid date format
            tkMessageBox.showinfo(
                "Error", "Incorrect data format, should be YYYY-MM-DD")
            return

        cur.execute(
            "SELECT * FROM Members WHERE state = '" + state +
            "' AND date_joined > '" + the_date + "'"
        )  #Execute Select members Where state and date are what user selected.

        rows = cur.fetchall()

        self.table_tree.delete(*self.table_tree.get_children()
                               )  #Deletes old data in tree if present

        self.generate_member_column_names(
        )  #Call utility to generate column member headers

        for index, row in enumerate(
                rows):  #Inserts sql data into tree rows for viewing
            self.table_tree.insert('', index, values=(row))

        self.create_DB_connection().close()  #Close DB Connection
        return None

    def select_users_love_Tot_Wine(
        self
    ):  #Class method for Users That Love Tot Wine and outputs new data to tree

        cur = self.create_DB_connection().cursor(
        )  #Calls for DB connection to open
        #Execute Select Where, and Join on foreign key values.
        cur.execute('''SELECT Members.last_name,
                            Members.first_name, 
                            Stores.store_name 
                            FROM Members 
                            JOIN Stores 
                            ON Members.favorite_store = Stores.store_id 
                            WHERE favorite_store = '3' ''')

        rows = cur.fetchall()

        self.table_tree.delete(*self.table_tree.get_children()
                               )  #Deletes old data in tree if present

        all_member_column_names = ("Last Name", "First Name", "Favorite Store",
                                   "", "", "", "", "", "", "", "")

        for index, columns in enumerate(
                self.table_tree["columns"]
        ):  #Generate *custom* column member headers
            self.table_tree.heading(columns,
                                    text=all_member_column_names[index])

        for index, row in enumerate(
                rows):  #Inserts sql data into tree rows for viewing
            self.table_tree.insert('', index, values=(row))

        self.create_DB_connection().close()  #Close DB Connection
        return None

    def select_users_fav_stores(
        self
    ):  #Class method for Users Favorite Stores and outputs new data to tree

        cur = self.create_DB_connection().cursor(
        )  #Calls for DB connection to open
        #Execute Select Where, and Join on foreign key values.
        cur.execute('''SELECT Members.last_name,
                    Members.first_name, 
                    Stores.store_name, 
                    Stores.location
                    FROM Members 
                    JOIN Stores 
                    ON Members.favorite_store = Stores.store_id ''')

        rows = cur.fetchall()

        self.table_tree.delete(*self.table_tree.get_children()
                               )  #Deletes old data in tree if present

        all_member_column_names = ("Last Name", "First Name", "Favorite Store",
                                   "Location", "", "", "", "", "", "", "")

        for index, columns in enumerate(
                self.table_tree["columns"]
        ):  #Generate *custom* column member headers
            self.table_tree.heading(columns,
                                    text=all_member_column_names[index])

        for index, row in enumerate(
                rows):  #Inserts sql data into tree rows for viewing
            self.table_tree.insert('', index, values=(row))

        self.create_DB_connection().close()  #Close DB Connection
        return None
class Gui(Frame):
    """ Gui class for Graphical User Interface"""
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.searcher = Searcher()
        self.initUI()

    def initUI(self):
        self.pack(fill=BOTH, expand=True)
        Grid.columnconfigure(self, 0, weight=1)
        Label(self,
              text='Classroom Finder',
              font=('Arial', 20, 'bold'),
              bg='cyan',
              fg='white').grid(sticky=W + E,
                               columnspan=3)  # classroom finder header
        Label(self, text='Url:').grid(column=0, row=1, pady=10, padx=(50, 0))
        self.urlentry = Entry(self, width=100)  # url entry to get url
        self.urlentry.grid(column=1, row=1, padx=(0, 80))
        self.color_label = Label(
            self, bg='red', width=10)  # color label to make red,yellow,green
        self.color_label.grid(column=0,
                              row=2,
                              sticky=E,
                              columnspan=2,
                              padx=(120),
                              pady=(0, 40))
        self.fetchbtn = Button(self,
                               text='Fetch',
                               height=2,
                               width=10,
                               command=self.dynamic)  # fetch button
        self.fetchbtn.grid(column=1,
                           row=2,
                           sticky=E,
                           padx=(0, 30),
                           pady=(10, 50))
        Label(self,
              text='Filters',
              bg='cyan',
              fg='white',
              font=('Arial', 20, 'bold'),
              width=10).grid(column=0, row=3, padx=10)
        self.frame = Frame(self, borderwidth=3,
                           relief=GROOVE)  # frame to keep filters part
        self.frame.grid(column=0,
                        row=4,
                        columnspan=3,
                        sticky=W + E + S + N,
                        pady=10,
                        padx=10)
        Label(self.frame, text='Where am I?').grid(sticky=W)
        self.where_combo = Combobox(self.frame,
                                    state='readonly')  # where am i combobox
        self.where_combo.grid(column=1, row=0, pady=20)
        self.where_combo.bind(
            '<<ComboboxSelected>>',
            self.change_build)  # to update room button wrt where combo
        Label(self.frame, text='Room').grid(sticky=W)
        self.room_combo = Combobox(self.frame,
                                   state='readonly')  # rooms combobox
        self.room_combo.grid(column=1, row=1)
        Label(self.frame, text='Start').grid(sticky=W)
        self.start_combo = Combobox(self.frame, state='readonly',
                                    width=7)  # start time combobox
        self.start_combo.grid(column=1, row=2, pady=20, sticky=W)
        Label(self.frame, text='End').grid(column=2, row=2, sticky=W)
        self.end_combo = Combobox(self.frame, state='readonly',
                                  width=7)  # end time combobox
        self.end_combo.grid(column=3, row=2, sticky=W)
        Label(self.frame, text='Day').grid(sticky=W)
        self.day_combo = Combobox(self.frame,
                                  state='readonly')  # days combobox
        self.day_combo.grid(column=1, row=3, pady=(0, 20))
        self.search = Button(self.frame,
                             text='Search',
                             width=10,
                             height=2,
                             command=self.add_treeview)  # seach button
        self.search.grid(padx=(0, 50), columnspan=2)
        Label(self.frame, text='Classroom results', bg='gray',
              fg='white').grid(sticky=N + E + W,
                               column=4,
                               row=0,
                               rowspan=5,
                               padx=(55, 0))
        self.scroll = Scrollbar(
            self.frame, orient='vertical')  # vertical scrollbar for treeview
        self.tree = Treeview(self.frame,
                             columns=('', '', '', '', ''),
                             selectmode='extended',
                             show='headings')
        listofcolumn = [
            'Room', 'Traffic', 'Availability %', 'Closeness', 'Overall Score'
        ]  # colums to treeview
        counter = 1
        for column in listofcolumn:
            self.tree.column('#' + str(counter), width=90)  # to resize columns
            self.tree.heading('#' + str(counter), text=column,
                              anchor=CENTER)  # to set headings
            counter += 1
        self.scroll.config(command=self.tree.yview)
        self.tree.config(yscrollcommand=self.scroll.set)
        self.tree.grid(column=4, row=0, rowspan=5, padx=(40, 0), pady=(30, 0))
        self.scroll.grid(column=5,
                         row=0,
                         rowspan=5,
                         sticky=N + S,
                         pady=(30, 0))
        self.urlentry.insert(
            0,
            'https://www.sehir.edu.tr/en/announcements/2018-2019-bahar-donemi-ders-programi'
        )

    def dynamic(self):
        self.color_label.configure(
            bg='yellow'
        )  # make color label yellow at the beginning of the process
        self.update_idletasks()
        self.searcher.fetch(self.urlentry.get(
        ))  # to call fetch method in searcher class to start process
        self.color_label.configure(bg='green')
        room_num = [
            room.room_num
            for room in self.searcher.buildings['ACAD BUILD 1'].classrooms
        ]
        self.where_combo.configure(
            values=[build for build in sorted(self.searcher.buildings)])
        self.where_combo.current(
            0)  # to get values in combobox and set value 0 as a default
        self.room_combo.configure(values=[room for room in sorted(room_num)])
        self.room_combo.current(0)
        self.start_combo.configure(
            values=["{}:00".format(time) for time in range(9, 20)])
        self.start_combo.current(
            0)  # start and end combo both have the same interval from 9 to 19
        self.end_combo.configure(
            values=["{}:00".format(time) for time in range(9, 20)])
        self.end_combo.current(len(self.end_combo['values']) - 1)
        self.day_combo.configure(
            values=["Monday", 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
        self.day_combo.current(0)

    def change_build(
            self, event
    ):  # when where am i combobox chance, room combobox also chance
        building = self.where_combo.get()
        room_num = [
            room.room_num
            for room in self.searcher.buildings[building].classrooms
        ]
        self.room_combo.configure(values=[room for room in sorted(room_num)])
        self.room_combo.current(0)

    def add_treeview(self):  # to add scores in treeview
        self.tree.delete(*self.tree.get_children())
        self.overall_scores = self.searcher.search(
            self.day_combo.get(),
            self.where_combo.get(), self.room_combo.get(),
            self.start_combo.get(), self.end_combo.get()
        )  # key operator for the sorted dict by values which overall score
        for item, score in sorted(self.overall_scores.items(),
                                  key=operator.itemgetter(1),
                                  reverse=True):
            if item.availability_score == 0:  # to avoid from availability score 0
                continue
            room = str(item.classroom.building_num) + str(
                item.classroom.room_num)
            self.tree.insert('',
                             'end',
                             values=(room, item.traffic_score,
                                     item.availability_score,
                                     item.closeness_score, score))
Ejemplo n.º 30
0
class vb_psd_rms:
    def __init__(self, parent):

        self.master = parent  # store the parent
        top = tk.Frame(parent)  # frame for all class widgets
        top.pack(side='top')  # pack frame in parent's window

        self.master.minsize(400, 500)
        self.master.geometry("550x600")
        self.master.title("vb_psd_rms_gui.py ver 1.7  by Tom Irvine")

        ###############################################################################

        crow = 0

        self.hwtext3 = tk.Label(
            top, text='This script calculates the overall level of a PSD.')
        self.hwtext3.grid(row=crow,
                          column=0,
                          columnspan=2,
                          pady=6,
                          sticky=tk.W)

        crow = crow + 1

        self.hwtext3 = tk.Label(
            top,
            text=
            'The input file must have two columns: Freq(Hz) & Accel(G^2/Hz)')
        self.hwtext3.grid(row=crow,
                          column=0,
                          columnspan=2,
                          pady=6,
                          sticky=tk.W)

        crow = crow + 1

        self.hwtext4 = tk.Label(top, text='Select Output Units')
        self.hwtext4.grid(row=crow,
                          column=1,
                          columnspan=1,
                          pady=6,
                          sticky=tk.S)

        crow = crow + 1

        self.acc_psdutton_read = tk.Button(top,
                                           text="Read Input File",
                                           command=self.read_data)
        self.acc_psdutton_read.config(height=3, width=15)
        self.acc_psdutton_read.grid(row=crow,
                                    column=0,
                                    columnspan=1,
                                    padx=0,
                                    pady=2,
                                    sticky=tk.N)

        self.Lb1 = tk.Listbox(top, height=2, exportselection=0)
        self.Lb1.insert(1, "G, in/sec, in")
        self.Lb1.insert(2, "G, m/sec, mm")
        self.Lb1.grid(row=crow, column=1, pady=2, sticky=tk.N)
        self.Lb1.select_set(0)

        crow = crow + 1

        self.hwtext5 = tk.Label(top, text='Results, Overall Levels')
        self.hwtext5.grid(row=crow,
                          column=0,
                          columnspan=2,
                          pady=20,
                          sticky=tk.S)

        crow = crow + 1

        self.tree = Treeview(top,
                             selectmode="extended",
                             columns=("A", "B"),
                             height=6)
        self.tree.grid(row=crow,
                       column=0,
                       columnspan=2,
                       padx=10,
                       pady=1,
                       sticky=tk.N)

        self.tree.heading('#0', text='')
        self.tree.heading('A', text='Parameter')
        self.tree.heading('B', text='Value')

        self.tree.column('#0', minwidth=0, width=1)
        self.tree.column('A', minwidth=0, width=90, stretch=tk.YES)
        self.tree.column('B', minwidth=0, width=140)

        crow = crow + 1

        self.hwtext10 = tk.Label(top, text='Minimum Plot Freq (Hz)')
        self.hwtext10.grid(row=crow,
                           column=0,
                           columnspan=1,
                           pady=10,
                           sticky=tk.S)

        self.hwtext11 = tk.Label(top, text='Maximum Plot Freq (Hz)')
        self.hwtext11.grid(row=crow,
                           column=1,
                           columnspan=1,
                           pady=10,
                           sticky=tk.S)

        crow = crow + 1

        self.fminr = tk.StringVar()
        self.fminr.set('')
        self.fmin_entry = tk.Entry(top, width=12, textvariable=self.fminr)
        self.fmin_entry.grid(row=crow, column=0, padx=14, pady=1, sticky=tk.N)

        self.fmaxr = tk.StringVar()
        self.fmaxr.set('')
        self.fmax_entry = tk.Entry(top, width=12, textvariable=self.fmaxr)
        self.fmax_entry.grid(row=crow, column=1, padx=14, pady=1, sticky=tk.N)

        crow = crow + 1

        root = self.master

        self.acc_psdutton_replot = tk.Button(top,
                                             text="Replot",
                                             command=self.plot_psd_replot)
        self.acc_psdutton_replot.config(height=2, width=15)
        self.acc_psdutton_replot.grid(row=crow, column=0, pady=8, sticky=tk.S)

        self.acc_psdutton_quit = tk.Button(
            top, text="Quit", command=lambda root=root: quit(root))
        self.acc_psdutton_quit.config(height=2, width=15)
        self.acc_psdutton_quit.grid(row=crow, column=1, pady=8, sticky=tk.S)

###############################################################################

    def plot_psd_replot(self):
        self.plot_psd_m(self)

    @classmethod
    def plot_psd_m(cls, self):

        if not self.fminr.get():  #do something
            self.f1 = min(self.freq)
        else:
            fminp = float(self.fminr.get())
            self.f1 = fminp

        if not self.fmaxr.get():  #do something
            self.f2 = max(self.freq)
        else:
            fmaxp = float(self.fmaxr.get())
            self.f2 = fmaxp

        xlab = 'Frequency (Hz)'

        fig_num = 1

        #       Displacement

        if (self.iunit == 0):
            title_string = 'Displacement PSD   ' + str(
                "%6.3g" % self.drms) + ' in RMS Overall '

            ylab = 'Disp (in^2/Hz)'

        else:
            title_string = 'Displacement PSD   ' + str(
                "%6.3g" % self.drms) + ' mm RMS Overall '

            ylab = 'Disp (in^2/Hz)'

        fig_num = loglog_plot(self.freq, self.vpsd, xlab, ylab, self.f1,
                              self.f2, title_string, fig_num)

        #       Velocity

        if (self.iunit == 0):
            title_string = 'Velocity PSD   ' + str(
                "%6.3g" % self.vrms) + ' in/sec RMS Overall '

            ylab = 'Vel ((in/sec)^2/Hz)'

        else:
            title_string = 'Velocity PSD   ' + str(
                "%6.3g" % self.vrms) + ' m/sec RMS Overall '

            ylab = 'Vel ((m/sec)^2/Hz)'

        fig_num = loglog_plot(self.freq, self.vpsd, xlab, ylab, self.f1,
                              self.f2, title_string, fig_num)

        #       acceleration

        ylab = 'Accel (G^2/Hz)'

        title_string = 'Acceleration PSD   ' + str(
            "%6.3g" % self.grms) + ' GRMS Overall '

        fig_num = loglog_plot(self.freq, self.acc_psd, xlab, ylab, self.f1,
                              self.f2, title_string, fig_num)

###############################################################################

    def read_data(self):
        """
        a = frequency column
        b = PSD column
        num = number of coordinates
        slope = slope between coordinate pairs    
        """

        map(self.tree.delete, self.tree.get_children())

        print(" ")
        print(
            " The input file must have two columns: freq(Hz) & accel(G^2/Hz)")

        a, b, num = read_two_columns_from_dialog('Select Input File',
                                                 self.master)

        print("\n samples = %d " % num)

        a = array(a)
        b = array(b)

        if (a[0] < 1.0e-20 or b[0] < 1.0e-20):
            a = delete(a, 0)
            b = delete(b, 0)
            num = num - 1

        nm1 = num - 1

        slope = zeros(nm1, 'f')

        ra = 0

        for i in range(0, int(nm1)):
            #
            s = log(b[i + 1] / b[i]) / log(a[i + 1] / a[i])

            slope[i] = s
            #
            if s < -1.0001 or s > -0.9999:
                ra += (b[i + 1] * a[i + 1] - b[i] * a[i]) / (s + 1.)
            else:
                ra += b[i] * a[i] * log(a[i + 1] / a[i])

        omega = 2 * pi * a

        ##
        df = 0.1

        aint, bint = interpolate_psd(a, b, slope, df)

        m0, m1, m2, m4, vo, vp = spectral_moments_constant_df(aint, bint, df)

        ##
        bv = zeros(num, 'f')
        bd = zeros(num, 'f')

        vpsd = zeros(num, 'f')
        dpsd = zeros(num, 'f')

        for i in range(0, int(num)):
            bv[i] = b[i] / omega[i]**2
            bd[i] = b[i] / omega[i]**4

        bv = bv * 386**2
        vpsd = bv

        bd = bd * 386**2
        dpsd = bd

        rv = 0

        for i in range(0, int(nm1)):
            #
            s = log(bv[i + 1] / bv[i]) / log(a[i + 1] / a[i])
            #
            if s < -1.0001 or s > -0.9999:
                vv = (bv[i + 1] * a[i + 1] - bv[i] * a[i]) / (s + 1.)
                rv += vv
            else:
                vv = bv[i] * a[i] * log(a[i + 1] / a[i])
                rv += vv

        rd = 0

        for i in range(0, int(nm1)):
            #
            s = log(bd[i + 1] / bd[i]) / log(a[i + 1] / a[i])
            #
            if s < -1.0001 or s > -0.9999:
                rd += (bd[i + 1] * a[i + 1] - bd[i] * a[i]) / (s + 1.)
            else:
                rd += bd[i] * a[i] * log(a[i + 1] / a[i])

        m = int(self.Lb1.curselection()[0])

        rms = sqrt(ra)
        three_rms = 3 * rms

        print(" ")
        print(" *** Input PSD *** ")
        print(" ")

        print(" Acceleration ")
        print("   Overall = %10.3g GRMS" % rms)
        print("           = %10.3g 3-sigma" % three_rms)

        grms = rms

        vrms = sqrt(rv)

        if (m == 1):
            scale = (9.81 / 386.)
            vrms = scale * vrms
            vpsd = scale**2 * vpsd

        vthree_rms = 3 * vrms

        print(" ")
        print(" Velocity ")

        if (m == 0):
            print("   Overall = %10.3g in/sec rms" % vrms)
            print("           = %10.3g in/sec 3-sigma" % vthree_rms)
        else:
            print("   Overall = %10.3g m/sec rms" % vrms)
            print("           = %10.3g m/sec 3-sigma" % vthree_rms)

        drms = sqrt(rd)

        if (m == 1):
            scale = (9.81 / 386.) * 1000
            drms = scale * drms
            dpsd = scale**2 * dpsd

        dthree_rms = 3 * drms

        print(" ")
        print(" Displacement ")

        if (m == 0):
            print("   Overall = %10.3g in rms" % drms)
            print("           = %10.3g in 3-sigma" % dthree_rms)
        else:
            print("   Overall = %10.3g mm rms" % drms)
            print("           = %10.3g mm 3-sigma" % dthree_rms)

########

        s0 = 'Acceleration'
        s1 = "%8.3g GRMS" % grms
        self.tree.insert('', 'end', values=(s0, s1))

        s0 = ' '
        s1 = "%8.3g 3-sigma" % three_rms
        self.tree.insert('', 'end', values=(s0, s1))

        s0 = 'Velocity'
        if (m == 0):
            s1 = "%8.3g in/sec rms" % vrms
        else:
            s1 = "%8.3g m/sec rms" % vrms
        self.tree.insert('', 'end', values=(s0, s1))

        s0 = ' '
        if (m == 0):
            s1 = "%8.3g in/sec 3-sigma" % vthree_rms
        else:
            s1 = "%8.3g m/sec 3-sigma" % vthree_rms
        self.tree.insert('', 'end', values=(s0, s1))

        s0 = 'Displacement'
        if (m == 0):
            s1 = "%8.3g in rms" % drms
        else:
            s1 = "%8.3g mm rms" % drms
        self.tree.insert('', 'end', values=(s0, s1))

        s0 = ' '
        if (m == 0):
            s1 = "%8.3g in 3-sigma" % dthree_rms
        else:
            s1 = "%8.3g mm 3-sigma" % dthree_rms
        self.tree.insert('', 'end', values=(s0, s1))

        print('\n Rate of Up-zero crossings = %7.4g Hz' % vo)
        print('             Rate of peaks = %7.4g Hz' % vp)

        self.iunit = m

        self.freq = a
        self.acc_psd = b
        self.grms = rms

        self.vrms = vrms
        self.vpsd = vpsd

        self.drms = drms
        self.dpsd = dpsd

        self.plot_psd_m(self)
Ejemplo n.º 31
0
    def show(frame, iterator):
        """Выводит на экран выборку, заданную в iterator"""

        scrollbar = Scrollbar(frame)
        tree = Treeview(frame, selectmode='none', padding=3,
                                    style='Custom.Treeview', height=REPORT_HEIGHT,
                                    yscrollcommand=scrollbar.set)
        tree.pack(side=LEFT, fill=BOTH, expand=YES)
        scrollbar.config(command=tree.yview)
        scrollbar.pack(side=LEFT, fill=Y)

        tree.tag_configure('1', font=('Verdana', FONT_SIZE_REPORT))
        tree.tag_configure('2', font=('Verdana', FONT_SIZE_REPORT),
                                                           background='#f5f5ff')
        tree.tag_configure('red1', font=('Verdana', FONT_SIZE_REPORT),
                                                               foreground='red')
        tree.tag_configure('red2', font=('Verdana', FONT_SIZE_REPORT),
                                         background='#f5f5ff', foreground='red')
        tree.tag_configure('grey1', font=('Verdana', FONT_SIZE_REPORT),
                                                              foreground='#dddddd')
        tree.tag_configure('grey2', font=('Verdana', FONT_SIZE_REPORT),
                                        background='#f5f5ff', foreground='#dddddd')

        Style().configure('Custom.Treeview', rowheight=FONT_SIZE_REPORT*2)

        columns = ['#' + str(x + 1) for x in range(4)]
        tree.configure(columns=columns)

        for q in range(len(header)):
            tree.heading('#%d' % (q + 1), text=header[q], anchor='w')
            tree.column('#%d' % (q + 1), width=REPORT_SCALE * col_width[q + 1],
                                                                     anchor='w')
        tree.heading('#0', text='', anchor='w')
        tree.column('#0', width=0, anchor='w', minwidth=0)

        flag = True
        for item in iterator:
            if not item.calculation:
                col = []
                col.append(add_s(item.cathegory.name if item.cathegory
                                                                 else u'-Нет-'))
                col.append(add_s(item.name))
                storage = queries.items_in_storage(item)
                col.append(add_s(storage))
                col.append(add_s(item.measure))
                if int(storage) > 0:
                    flag = not flag
                    if flag:
                        tree.insert('', 'end', text='', values=col, tag='2')
                    else:
                        tree.insert('', 'end', text='', values=col, tag='1')
                elif storage == '0':
                    flag = not flag
                    if flag:
                        tree.insert('', 'end', text='', values=col, tag='grey2')
                    else:
                        tree.insert('', 'end', text='', values=col, tag='grey1')
                else:
                    flag = not flag
                    if flag:
                        tree.insert('', 'end', text='', values=col, tag='red2')
                    else:
                        tree.insert('', 'end', text='', values=col, tag='red1')
Ejemplo n.º 32
0
class SDCard: 
	def __init__(self, root, prtr, settings, log):
		self.app = root
		self.printer = prtr
		self.settings = settings
		self.log = log
		self.top = None

	def isActive(self):
		return self.top != None

	def start(self):
		self.app.sdchecking = True
		self.printer.send_now("M21")
		
	def sdCheckComplete(self, ready):
		if not ready:
			self.log.logMsg("Error initializing SD card")
		else:
			self.app.sdlisting = True
			self.printer.send_now("M20")
			
	def refresh(self):
		self.top.destroy()
		self.app.sdlisting = True
		self.printer.send_now("M20")
			
	def sdListComplete(self, sdlist):
		top = self.top = Toplevel(self.app) 
		top.title("SD Card Control")
		top.protocol('WM_DELETE_WINDOW', self.delTop)
		f = Frame(top, height=150, width=150)
		f.grid(row=1, column=1);
		self.tree = Treeview(f, height=12, selectmode='browse') 
		self.tree.column("#0", minwidth=100)
		self.tree.bind("<<TreeviewSelect>>", self.treeSelect)
		self.sb = Scrollbar(f)
		self.sb.config(command=self.tree.yview)
		self.tree.config(yscrollcommand=self.sb.set)
			
		self.sb.pack(side=RIGHT, fill=Y)
		self.tree.pack(side=LEFT, fill=BOTH, expand=1)

		SDroot = SDDir('')
		for item in sdlist:
			if item.startswith('/'):
				cd = SDroot
				l = item[1:].split('/')
				for d in l[:-1]:
					ncd = cd.getDir(d)
					if ncd == None:
						ncd = cd.addDir(d)
			
					cd = ncd
				cd.addFile(l[-1], fqn=item)
					
			else:
				SDroot.addFile(item)
				
		SDroot.sortAll()
		
		self.fileMap = {}
		self.startFile = None
		self.loadDir(SDroot, '')
		bf = Frame(top, width=50)
		bf.grid(column=3, row=1)
		
		blf = LabelFrame(bf, text="Print from SD Card", width=48, height=40)
		
		self.bPrint = Button(blf, text='Print', command=self.doPrint, width = 6) 
		self.bPrint.pack()
		blf.pack(fill='x')
		
		blf = LabelFrame(bf, text="Delete from SD Card", width=48, height=40)
		
		self.bDelete = Button(blf, text="Delete", command=self.doDelete, width=6)
		self.bDelete.pack()
		blf.pack(fill='x')
		
		blf = LabelFrame(bf, text="Upload to SD Card", width=48, height=180)

		self.upDir = Label(blf, text="Dir:", justify=LEFT)
		self.upDir.pack()

		ef = Frame(blf)

		l = Label(ef, text="File:", justify=LEFT)
		l.pack(side=LEFT)

		self.entry = Entry(ef, width=12)
		self.entry.pack(side=LEFT)
		fn = 'untitled.g'
		if self.app.GCodeFile:
			fn = os.path.basename(self.app.GCodeFile)
			if len(fn) > 8:
				fn = fn[0:8]
			fn += ".g"
		self.entry.delete(0, END)
		self.entry.insert(0, fn)
		ef.pack()
		
		self.bUpload = Button(blf, text="Upload", command=self.doUpload, width=6)
		self.bUpload.pack()

		blf.pack(fill='x')
		
		if self.app.printing or self.app.sdprinting:
			self.bPrint.config(state=DISABLED)
			self.bUpload.config(state=DISABLED)
			
		if not self.app.GCodeFile:
			self.bUpload.config(state=DISABLED)
			
		blf = Frame(bf)
		self.bExit = Button(blf, text='Exit', command=self.doExit, width=6) 
		self.bExit.pack()
		blf.pack()

		if self.startFile:
			self.tree.selection_set(self.startFile)
			
		self.top.geometry("360x300+100+100")

	def delTop(self):
		self.top.destroy()
		self.top = None
	
	def treeSelect(self, *arg):
		s = self.tree.selection()[0]
		
		try:
			d = s.split(':')[0]
		except:
			d = ""
			
		if len(d) == 0:
			d = '(root)'
			
		self.upDir.config(text="Dir: " + d)
		
		if self.app.printing or self.app.sdprinting or not self.app.GCodeFile:
			self.bUpload.config(state=DISABLED)
		else:
			self.bUpload.config(state=NORMAL)
			
		if ':' in s: # a file is chosen
			if self.app.printing or self.app.sdprinting:
				self.bPrint.config(state=DISABLED)
			else:
				self.bPrint.config(state=NORMAL)
			self.bDelete.config(state=NORMAL)
			
		else: # a directory is chosen
			self.bPrint.config(state=DISABLED)
			self.bDelete.config(state=DISABLED)


	def loadDir(self, d, did):
		d.resetDir()
		nd = d.nextDir()
		while (nd):
			myid = did + '/' + nd.dirName()
			self.tree.insert(did, 'end', myid, text=nd.dirName())
			self.loadDir(nd, myid)
			nd = d.nextDir()
			
		d.resetFile()
		f = d.nextFile()
		while (f):
			myid = did + ':' + f[0]
			self.fileMap[myid] = f[1]
			self.tree.insert(did, 'end', myid, text=f[0])
			if self.startFile == None:
				self.startFile = myid
			f = d.nextFile()		
		
	def doExit(self): 
		self.top.destroy()
		self.top = None

	def doPrint(self): 
		s = self.tree.selection()[0]
		if s in self.fileMap:
			fn = self.fileMap[s].lower()
			self.log.logMsg("Starting print of SD file %s" % fn)
			self.printer.send_now("M23 %s" % fn)  # select the file
			self.printer.send_now("M24") # start the print
			self.app.sdprinting = True
			self.app.setToolbarSDPrint()
			self.top.destroy()
			self.top = None
		
	def doDelete(self):
		s = self.tree.selection()[0]
		if s in self.fileMap:
			fn = self.fileMap[s].lower()
			self.log.logMsg("Deleting file %s" % fn)
			self.printer.send_now("M30 %s" % fn)
			self.refresh()
		
	def doUpload(self):
		bn = self.entry.get()

		try:		
			d = self.tree.selection()[0].split(':')[0]
		except:
			d = ""
			
		if len(d) != 0:
			d += '/'
		
		fn = (d + bn).lower()
		self.log.logMsg("Starting upload to SD file %s" % fn)
		self.printer.send_now("M28 %s" % fn)  # select the file
		self.app.startUpload()
		self.top.destroy()
		self.top = None
Ejemplo n.º 33
0
class Example(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.style = Style()
        self.style.theme_use("default")
        self.master.title("Log viewer")
        self.pack(fill=BOTH, expand=True)

        self.used = []  # List of currently plotted series ([str])
        self.series = {}  # List of all series ({str -> [number]})
        self.names = []  # List of all nodes in tree view ([str])
        self.queues = [] # List of all queues ([str])
        self.logs = {} # List of all text logs ({str -> [str]})

        self.rowconfigure(1, weight=1)
        self.columnconfigure(6, weight=3)
        self.columnconfigure(11, weight=1)

        # Series selection takes row 1-2, col 0-2
        self.series_ui = Treeview(self)
        self.series_ui.grid(row=1, column=0, columnspan=2, rowspan=2, sticky=N+S)
        self.series_ui.configure(show="tree")
        self.series_ui.bind("<Double-Button-1>", self.onselect)
        self.series_ui.tag_configure("graphall", foreground="#070")
        self.series_ui.tag_configure("graphnone", foreground="#000")
        self.series_ui.tag_configure("graphsome", foreground="#007")
        series_ui_scroll = Scrollbar(self, command=self.series_ui.yview, orient=VERTICAL)
        series_ui_scroll.grid(row=1, column=2, rowspan=2, sticky=N+S)
        self.series_ui["yscrollcommand"] = series_ui_scroll.set

        # The plot takes row 1-2, col 3-6
        move_mode = StringVar()
        move_mode.set("pan")
        show_path = IntVar()
        show_path.set(0)
        event_bars = IntVar()
        event_bars.set(1)
        show_debug = IntVar()
        show_debug.set(1)
        show_error = IntVar()
        show_error.set(1)
        show_warning = IntVar()
        show_warning.set(1)
        show_info = IntVar()
        show_info.set(1)
        self.plot = HackPlot(self, move_mode, show_path, event_bars,
                [(show_debug, "[DEBUG]"), (show_error, "[ERROR]"), (show_warning, "[WARNING]"), (show_info, "[INFO]")])
        self.plot.canvas.grid(row=1, column=3, columnspan=4, rowspan=2, sticky=N+S+E+W)
        # Text logs take row 1-2, col 7-12
        self.plot.listbox.grid(row=1, column=7, columnspan=5, sticky=N+S+E+W)
        listbox_yscroll = Scrollbar(self, command=self.plot.listbox.yview, orient=VERTICAL)
        listbox_yscroll.grid(row=1, column=12, sticky=N+S)
        self.plot.listbox["yscrollcommand"] = listbox_yscroll.set
        listbox_xscroll = Scrollbar(self, command=self.plot.listbox.xview, orient=HORIZONTAL)
        listbox_xscroll.grid(row=2, column=7, columnspan=5, sticky=E+W)
        self.plot.listbox["xscrollcommand"] = listbox_xscroll.set


        # Controls take row 0, col 0-12
        Button(self, text="Load Directory", command=self.loaddir).grid(row=0, column=0)
        Button(self, text="Load File", command=self.loadfile).grid(row=0, column=1)
        Button(self, text="Fit X", command=self.plot.fit_x).grid(row=0, column=3, sticky=W)
        Button(self, text="Fit Y", command=self.plot.fit_y).grid(row=0, column=4, sticky=W)
        Button(self, text="Fit Auto", command=self.plot.fit_auto).grid(row=0, column=5, sticky=W)
        Button(self, text="Fit Tele", command=self.plot.fit_tele).grid(row=0, column=6, sticky=W)
        # Plot controls in a subframe to manage padding so it doesn't look awful
        move_mode_control = Frame(self, padx=10)
        Radiobutton(move_mode_control, text="Pan", value="pan", variable=move_mode).grid(row=0, column=0, sticky=W)
        Radiobutton(move_mode_control, text="Zoom In", value="zoomin", variable=move_mode).grid(row=0, column=1, sticky=W)
        Radiobutton(move_mode_control, text="Zoom Out", value="zoomout", variable=move_mode).grid(row=0, column=2, sticky=W)
        move_mode_control.grid(row=0, column=7, sticky=W)
        Checkbutton(self, text="Event Bars", variable=event_bars, command=self.plot.show_textlogs).grid(row=0, column=8, sticky=W)
        Checkbutton(self, text="Debug", variable=show_debug, command=self.plot.show_textlogs).grid(row=0, column=9, sticky=W)
        Checkbutton(self, text="Error", variable=show_error, command=self.plot.show_textlogs).grid(row=0, column=10, sticky=W)
        Checkbutton(self, text="Warning", variable=show_warning, command=self.plot.show_textlogs).grid(row=0, column=11, sticky=W)
        Checkbutton(self, text="Info", variable=show_info, command=self.plot.show_textlogs).grid(row=0, column=12, sticky=W)
        Checkbutton(self, text="Directories", variable=show_path, command=self.plot.show_textlogs).grid(row=0, column=13, sticky=E)

    # Open Directory button clicked
    def loaddir(self):
        dirname = tkFileDialog.askdirectory(initialdir=log_dir)
        if dirname != "" and dirname != (): # Cancel and (x) not pressed
            # Empty the data
            self.used = []
            self.series = {}
            self.names = []
            self.queues = []
            self.logs = {}
            self.plot.reset()
            for node in self.series_ui.get_children():
                self.series_ui.delete(node)
            # For every csv file in the directory, checking recursively and alphabetically
            for subdirname, subsubdirnames, filenames in os.walk(dirname):
                subsubdirnames.sort()
                filenames.sort()
                for filename in filenames:
                    if filename.endswith(".csv") or filename.endswith(".log"):
                        # The name of the directory without the name of the directory selected,
                        # and the name of the file without the extension, separated by "."s
                        # For example if directory selected is /tmp/logs, subdirname is /tmp/logs/beta/666,
                        # and filename is foo.csv, nodeprefix is "beta.666.foo".
                        nodeprefix = ".".join(subdirname[len(dirname)+1:].split("/") + [filename[:-4]])
                        if nodeprefix.startswith("."):
                            nodeprefix = nodeprefix[1:]
                        # Add the file's data
                        self.readfile(subdirname + "/" + filename, nodeprefix)
            for name in self.names:
                # Add name to (name with everything after last dot removed), as the last child,
                # with text (everything after last dot of name) and tags graphnone and (whether name represents data)
                self.series_ui.insert(".".join(name.split(".")[0:-1]), "end", name,
                        text=name.split(".")[-1], tags=["graphnone"])

    # Open File button clicked
    def loadfile(self):
        filename = tkFileDialog.askopenfilename(filetypes=[("CSV Files", "*.csv"), ("Text log file", "*.log")], initialdir=log_dir)
        if filename != "" and filename != (): # Cancel and (x) not pressed
            # Empty the data
            self.used = []
            self.series = {}
            self.names = []
            self.queues = []
            self.logs = {}
            self.plot.reset()
            for node in self.series_ui.get_children():
                self.series_ui.delete(node)
            # Add the file's data
            self.readfile(filename, "")
            for name in self.names:
                # Add name to (name with everything after last dot removed), as the last child,
                # with text (everything after last dot of name) and tags graphnone and (whether name represents data)
                self.series_ui.insert(".".join(name.split(".")[0:-1]), "end", name,
                        text=name.split(".")[-1], tags=["graphnone"])

    # Add a file's data
    # nodeprefix is a string to add before every name in the file, represents file's name in the tree
    def readfile(self, filename, nodeprefix):
        try:
            if filename.endswith(".csv"):
                # For csv files this will always be concatenated with something
                if nodeprefix != "":
                    nodeprefix += "."
                csvfile = open(filename, "rb")
                reader = csv.DictReader(csvfile)
                series = {}
                self.queues.append(nodeprefix[:-1])
                for name in reader.fieldnames:
                    # Add ancestor_names to names, without creating duplicates
                    self.names = list(OrderedDict.fromkeys(self.names + ancestor_names(nodeprefix + name)))
                    # Create a series for this field
                    series[nodeprefix + name] = []
                for row in reader:
                    for name in reader.fieldnames:
                        try:
                            # Add cell to series if it represents a number
                            series[nodeprefix + name].append(float(row[name]))
                        except ValueError:
                            # Not a number, no problem, could be game_specific_string or something
                            pass
                self.series.update(series)
            else:
                self.names.append(nodeprefix)
                self.logs[nodeprefix] = open(filename, "r").readlines()
        except IOError:
            tkMessageBox.showerror(message="Could not open file: " + str(filename))

    # Tree element was double clicked
    def onselect(self, _):
        series = self.series_ui.focus()
        # Set it to graph if no children are graphed, and not to graph if all or some are
        self.setgraphed(series, self.series_ui.tag_has("graphnone", series))
        self.checkgraphed(series)

    # Set a node and its children to be either all or none graphed
    def setgraphed(self, node, shouldgraph):
        if shouldgraph:
            self.series_ui.item(node, tags=["graphall"])
            # If the node represents data and it isn't already graphed, graph it
            if node in self.series and node not in self.used:
                self.used.append(node)
                # Timestamp is queue that contains node + ".timestamp"
                timestamp_name = [queue for queue in self.queues if node.startswith(queue)][0] + ".timestamp"
                self.plot.add_plot(self.series[timestamp_name], self.series[node], node)
            if node in self.logs and node not in self.used:
                self.used.append(node)
                self.plot.add_textlog(self.logs[node], node)
            # If nothing else is plotted, fit the plot to this
            if len(self.used) == 1:
                self.plot.fit_x()
                self.plot.fit_y()
            for child in self.series_ui.get_children(node):
                self.setgraphed(child, True)
        else:
            # Set tags to be (whether node represents data) and graphnone
            self.series_ui.item(node, tags=["graphnone"])
            if node in self.used:
                self.used.remove(node)
                if node in self.logs:
                    self.plot.remove_textlog(node)
                if node in self.series:
                    self.plot.remove_plot(node)
            for child in self.series_ui.get_children(node):
                self.setgraphed(child, False)

    # Update the tags (and color) on a node and its ancestors, should always be called after setgraphed
    def checkgraphed(self, node):
        # Top level nodes are children of ""
        if node == "":
            return
        # True unless a child doesn't share this tag or there are no children
        graphall = True
        graphnone = True
        for child in self.series_ui.get_children(node):
            if not self.series_ui.tag_has("graphall", child):
                graphall = False
            if not self.series_ui.tag_has("graphnone", child):
                graphnone = False
        graphtag = ""
        if graphall and graphnone:
            # There are no children, check the used list instead
            graphtag = "graphall" if node in self.used else "graphnone"
        elif graphall:
            graphtag = "graphall"
        elif graphnone:
            graphtag = "graphnone"
        else:
            graphtag = "graphsome"
        # Set tags to be (whether node represents data) and the computed status
        self.series_ui.item(node, tags=[graphtag])
        # Now that the status of this node is known, check the parent
        self.checkgraphed(self.series_ui.parent(node))
Ejemplo n.º 34
0
class App:
    def __init__(self,master):
        self.master = master
        self.master.resizable(0,0)
        self.master.update_idletasks()
        self.master.overrideredirect(1)
        self.master.attributes("-topmost",True)
        self.master.title("New Graph")
        self.master.lift()
        self.menubar = Menu(self.master)
        self.master.config(menu=self.menubar)
        self.default_color = self.master.cget("bg")
        self.active_edit_flag = 0
        self.modify_flag = 0
        self.graph_types = ['Default','Maelstrom','Rankine Half-Body','Rankine Oval', 'Cylinder','Stagnation & Vortex']
       #-----------------------------------------------------------------------
        self.file_menu = Menu(self.menubar)
        
        self.Fig = matplotlib.figure.Figure(figsize=(2.148,1.777),dpi=100,tight_layout=True)
        self.FigSubPlot = self.Fig.add_subplot(111)     
        frame = Frame(master,bg='#%02x%02x%02x' % (231, 231, 231))
        frame.pack(fill=BOTH, expand=1)
        frame2 = Frame(frame,bg='#%02x%02x%02x' % (221, 221, 221))
        frame2.pack(fill=BOTH, expand=1,padx=20,pady=23)
        self.frame3 = Frame(frame2, bg='#%02x%02x%02x' % (221, 221, 221))
        self.frame3.pack(fill=BOTH, padx=17,pady=17,expand=1)
        self.radio_frame = Frame(self.frame3,bg='#%02x%02x%02x' % (221, 221, 221))
      
        #self.listbox = Listbox(self.frame3)
        self.radio_var = StringVar()
        self.radio_var.set('Default')
        for key in self.graph_types:
            b = Radiobutton(self.radio_frame,text=key,variable=self.radio_var,value = key,bg='#%02x%02x%02x' % (221, 221, 221),indicatoron=1)
            b.pack(anchor=W)
#        for key_num in range(0,len(self.graph_types)):
#            self.listbox.insert(END,self.graph_types[key_num])
#        self.listbox.select_set(0)
#        self.listbox.bind('<<ListboxSelect>>',self.changegraph)
        self.radio_var.trace('w',self.changegraph)
#        self.old = self.listbox.get(self.listbox.curselection())
        self.blankc = Canvas(self.frame3,width=225,height=188)
        self.canvas = FigureCanvasTkAgg(self.Fig, master=self.frame3)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side=RIGHT,padx=0,pady=5)
        self.radio_frame.pack(side=LEFT,anchor=W,padx=8,pady=5,fill=BOTH,expand=1) 
        #self.listbox.pack(side=LEFT,anchor=W,padx=8,pady=5,fill=BOTH,expand=1)   
        self.button_frame = Frame(frame,bg='#%02x%02x%02x' % (231, 231, 231))
        self.button_frame.pack(side=RIGHT)
        self.buffer_frame = Frame(self.button_frame,bg='#%02x%02x%02x' % (231, 231, 231))
        self.buffer_frame.pack(side=BOTTOM,pady=8)
        self.buffer_frame2 = Frame(self.button_frame,bg='#%02x%02x%02x' % (231, 231, 231))
        self.buffer_frame2.pack(side=RIGHT,padx=11)
        self.button_c = Button(self.button_frame,width=9, text='Choose',bg='#%02x%02x%02x' % (231, 231, 231),command=self.Continue)
        self.button_x = Button(self.button_frame,text='Cancel',bg='#%02x%02x%02x' % (231, 231, 231),width=9,command=self.quit)
        self.button_c.focus()
        self.button_c.pack(side=RIGHT)
        self.button_x.pack(side=RIGHT,padx=14)
        self.line_color = StringVar()
        self.line_color.set('#000000')
        self.wt_var = StringVar()
        self.wt_var.set('- WT:')
        self.wt_var.trace('w',self.wt_update)
        self.linet_var = StringVar()
        self.linet_var.set('-')
        self.linet_var.trace('w',self.line_style_update)
        self.line_var = IntVar()
        self.line_var.set(25)
        self.line_val = 25
        self.div_check_var = IntVar()
        self.div_check_var.set(50)
        self.div_val = 50
        self.density_var = IntVar()
        self.density_var.set(35)
        self.density_val = 35
        self.arrow_var = IntVar()
        self.arrow_var.set(25) 
        self.arrow_val = 25
        self.div_var = IntVar()
        self.div_var.set(0)
        self.mark_var = IntVar()
        self.mark_var.set(0)
        self.lock_var = IntVar()
        self.lock_var.set(1)
        self.active_numbers = {'s':0,'v':0,'u':0,'d':0,'n':0}
        self.sel_point = None
        self.selected = None
    def changegraph(self,*args):
        self.xlim = [-5.0,5.0]
        self.ylim = [-5.0,5.0]
        Y, X = mgrid[-5:5:100j, -5:5:100j]
        self.X,self.Y = X,Y
        self.FigSubPlot.clear()
        #if self.listbox.get(self.listbox.curselection()) == 'Default':
        if self.radio_var.get() == 'Default':
            self.U = 0*X
            self.V = 0*X
            self.FigSubPlot.streamplot(X,Y,self.U,self.V)
        #elif self.listbox.get(self.listbox.curselection()) == 'Maelstrom':
        elif self.radio_var.get() == 'Maelstrom':    
            self.U = self.source(X,Y,1)[0]+self.vortex(X,Y,1)[0]
            self.V = self.source(X,Y,1)[1]+self.vortex(X,Y,1)[1]
            self.FigSubPlot.streamplot(X,Y,self.U,self.V, color='k', linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle='-')
        #elif self.listbox.get(self.listbox.curselection()) == 'Rankine Half-Body':
        elif self.radio_var.get() == 'Rankine Half-Body':
            self.U = self.source(X,Y,10)[0]+self.uniform(X,Y,1,1,0)[0]
            self.V = self.source(X,Y,10)[1]+self.uniform(X,Y,1,1,0)[1]
            self.FigSubPlot.streamplot(X, Y,self.U,self.V, color='k', linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle='-')
        #elif self.listbox.get(self.listbox.curselection()) == 'Rankine Oval':
        elif self.radio_var.get() == 'Rankine Oval':
            self.U = self.source(X+2,Y,10)[0]+self.source(X-2,Y,-10)[0]+self.uniform(X,Y,1,1,0)[0]
            self.V = self.source(X+2,Y,10)[1]+self.source(X-2,Y,-10)[1]+self.uniform(X,Y,1,1,0)[1]
            self.FigSubPlot.streamplot(X, Y,self.U,self.V, color='k', linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle='-')
        #elif self.listbox.get(self.listbox.curselection()) == 'Cylinder':
        elif self.radio_var.get() == 'Cylinder':
            self.U = self.doublet(X,Y,25)[0]+self.uniform(X,Y,1,1,0)[0]
            self.V = self.doublet(X,Y,25)[1]+self.uniform(X,Y,1,1,0)[1]
            self.FigSubPlot.streamplot(X, Y,self.U,self.V, color='k', linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle='-')
        #elif self.listbox.get(self.listbox.curselection()) == 'Stagnation & Vortex':
        elif self.radio_var.get() == 'Stagnation & Vortex':
            self.U = self.vortex(X,Y,25)[0]+self.corner(X,Y,'2,1')[0]
            self.V = self.vortex(X,Y,25)[1]+self.corner(X,Y,'2,1')[1]
            self.FigSubPlot.streamplot(X, Y,self.U,self.V, color='k', linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle='-')
        self.FigSubPlot.set_xlim(self.xlim)
        self.FigSubPlot.set_ylim(self.ylim)
        self.canvas.draw()
#        self.old = self.listbox.get(self.listbox.curselection())
    def source(self,X,Y,l):
        l = float(l)
        U = (l/(2*pi))*X/(X*X + Y*Y)
        V = (l/(2*pi))*Y/(X*X + Y*Y)
        return (U,V)
    def vortex(self,X,Y,g):
        g = float(g)
        U = (g/(2*pi))*Y/(X*X + Y*Y)
        V = (g/(2*pi))*-X/(X*X + Y*Y)
        return (U,V)
    def uniform(self,X,Y,v_0,x_0,y_0):
        v_0 = float(v_0)
        x_0 = float(x_0)
        y_0 = float(y_0)
        U = v_0*x_0/(x_0*x_0+y_0*y_0)**0.5
        V = v_0*y_0/(x_0*x_0+y_0*y_0)**0.5
        return (U,V)
    def doublet(self,X,Y,k):
        k = float(k)
        U = (k/(2*pi))*((2*Y*Y/((X*X+Y*Y)*(X*X+Y*Y)))-(1/(X*X+Y*Y)))
        V = -(k/(2*pi))*(2*X*Y/((X*X+Y*Y)*(X*X+Y*Y)))
        return (U,V)
    def corner(self,X,Y,tup):
        comma_flag = 0
        A = ''
        n = ''
        for char in tup:
            if char == ',':
                comma_flag = 1
            elif comma_flag == 0:
                n += char
            elif comma_flag == 1:
                A += char
        A = float(A)
        n = float(n)
        R = (X*X+Y*Y)**0.5
        t = arctan2(-Y,-X)
        U = -A*n*R**(n-1)*(cos(n*t)*cos(t)+sin(n*t)*sin(t))
        V = -A*n*R**(n-1)*(cos(n*t)*sin(t)-sin(n*t)*cos(t))
        return (U,V)
    def stream_source(self,X,Y,l):
        l = float(l)
        stream = (l/(2*pi))*arctan2(-Y,-X)
        return stream
    def stream_vortex(self,X,Y,g):
        g = float(g)
        stream = (g/(2*pi))*log((X*X + Y*Y)**0.5)
        return stream
    def stream_uniform(self,X,Y,v_0,x_0,y_0):
        v_0 = float(v_0)
        x_0 = float(x_0)
        y_0 = float(y_0)
        stream = (v_0*Y*x_0/(x_0*x_0+y_0*y_0)**0.5)-(v_0*X*y_0/(x_0*x_0+y_0*y_0)**0.5)
        return stream
    def stream_doublet(self,X,Y,k):
        k = float(k)
        stream = -(k/(2*pi))*Y/(X*X+Y*Y)
        return stream
    def stream_corner(self,X,Y,tup):
        comma_flag = 0
        A = ''
        n = ''
        for char in tup:
            if char == ',':
                comma_flag = 1
            elif comma_flag == 0:
                n += char
            elif comma_flag == 1:
                A += char
        A = float(A)
        n = float(n)
        stream = A*(X*X+Y*Y)**(n*0.5)*sin(n*arctan2(-Y,-X))
        return stream
    def quit(self):
        self.master.destroy()    
    def Continue(self):
        self.master.withdraw()
        self.main = Toplevel(self.master)
        self.main.geometry("%dx%d+%d+%d" % (1038-206, 
                               694,
                               int((500.0/2560.0)*screen_resolution[0]), 
                               int((60.0/1440.0)*screen_resolution[1])))
        self.main.minsize(376,227)                      
        self.interior = PanedWindow(self.main,sashwidth=5)
        self.interior.pack(fill=BOTH, expand=1)

        self.elements_frame = Frame(self.interior, height=1038, width=212,relief=RIDGE,borderwidth=0)
        self.interior.add(self.elements_frame) 
        self.interior.paneconfig(self.elements_frame,minsize=130)
        self.graph_frame = Frame(self.interior)
        self.interior.add(self.graph_frame)
        self.interior.paneconfig(self.graph_frame,minsize=130)

        self.main.bind("<ButtonRelease-1>",self.pan_update)
        self.main.bind("<ButtonRelease-3>",self.pan_update)
        self.main.bind("<Button-3>",self.right_menu)
        
        self.edit_frame = Frame(self.graph_frame)
        self.edit_frame.pack(side=TOP,fill=X,padx=10)
        self.canvas = FigureCanvasTkAgg(self.Fig, master=self.graph_frame)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(fill=BOTH,expand=1)
        self.nav_frame = Frame(self.edit_frame)
        self.nav_frame.pack(side=LEFT,anchor=W)
        self.toolbar = NavigationToolbar(self.canvas, self.nav_frame)
        
        self.main.protocol('WM_DELETE_WINDOW',self.master.destroy) 
        self.elements = Treeview(self.elements_frame,columns=("values","xlocations","ylocations"),selectmode=BROWSE)
        self.elements.heading("#0",text="Components")
        self.elements.heading("values",text="Str")
        self.elements.heading("xlocations",text="X")
        self.elements.heading("ylocations",text="Y")
        self.elements.column("#0",width=90,anchor=CENTER)
        self.elements.column("values",width=45,anchor=CENTER)
        self.elements.column("xlocations",width=26,anchor=CENTER)
        self.elements.column("ylocations",width=26,anchor=CENTER)
        self.elements.pack(fill=BOTH,expand=1)
        
        self.as_button_frame = Frame(self.elements_frame)
        self.add_button = Button(self.as_button_frame,text = '+',width=2,command=self.add)       
        self.sub_button = Button(self.as_button_frame,text = '-',width=2,command=self.subtract) 
        self.options_button = Button(self.as_button_frame,text='Options',command=self.options)
        self.as_button_frame.pack(side=BOTTOM,anchor=W)
        self.options_button.pack(side=RIGHT)
        self.sub_button.pack(side=RIGHT,anchor=W)
        self.add_button.pack(side=LEFT,anchor=W)
        self.addsub_menu = Menu(self.as_button_frame,tearoff=0)
        self.addsub_menu.add_command(command=self.add_source,label='Source')
        self.addsub_menu.add_command(command=self.add_vortex,label='Vortex')
        self.addsub_menu.add_command(command=self.add_uniform,label='Uniform')
        self.addsub_menu.add_command(command=self.add_doublet,label='Doublet')
        self.addsub_menu.add_command(command=self.add_corner,label='Corner')
        

        #if self.listbox.get(self.listbox.curselection()) == 'Default':
        if self.radio_var.get() == 'Default':
            self.active_components = []
            self.active_calls = {} 
            pass
        #elif self.listbox.get(self.listbox.curselection()) == 'Maelstrom':
        elif self.radio_var.get() == 'Maelstrom':
            self.elements.insert("",0,"M",text="Maelstrom",open=TRUE)
            self.active_components = ['M']
            self.elements.insert("M",0,iid='s%s'%self.active_numbers['s'],text="Source",values=("%s"%1,0,0))
            self.elements.insert("M",0,iid='v%s'%self.active_numbers['v'],text="Vortex",values=("%s"%1,0,0))
            self.active_calls = {'s%s'%self.active_numbers['s']:("s",self.elements.item('s%s'%self.active_numbers['s'],"values")),
                                 'v%s'%self.active_numbers['v']:("v",self.elements.item('v%s'%self.active_numbers['v'],"values"))}
            self.active_numbers['s'] += 1
            self.active_numbers['v'] += 1
        elif self.radio_var.get() == 'Rankine Half-Body':
            self.elements.insert("",0,"RHF",text="Rankine Half-Body",open=TRUE)
            self.active_components = ['RHF']
            self.elements.insert("RHF",0,iid='s%s'%self.active_numbers['s'],text="Source",values=("%s"%10,0,0))
            self.elements.insert("RHF",0,iid='u%s'%self.active_numbers['u'],text="Uniform",values=("%s"%1,1,0))
            self.active_calls = {'s%s'%self.active_numbers['s']:("s",self.elements.item('s%s'%self.active_numbers['s'],"values")),
                                 'u%s'%self.active_numbers['u']:("u",self.elements.item('u%s'%self.active_numbers['u'],"values"))}
            self.active_numbers['s'] += 1
            self.active_numbers['u'] += 1
        elif self.radio_var.get() == 'Rankine Oval':
            self.elements.insert("",0,"RO",text="Rankine Oval",open=TRUE)
            self.active_components = ['RO']
            self.elements.insert("RO",0,iid='s%s'%self.active_numbers['s'],text="Source",values=("%s"%10,-2,0))
            self.elements.insert("RO",0,iid='s%s'%(self.active_numbers['s']+1),text="Source",values=("%s"%-10,2,0))
            self.elements.insert("RO",0,iid='u%s'%self.active_numbers['u'],text="Uniform",values=("%s"%1,1,0))
            self.active_calls = {'s%s'%self.active_numbers['s']:("s",self.elements.item('s%s'%self.active_numbers['s'],"values")),
                                 's%s'%(self.active_numbers['s']+1):("s",self.elements.item('s%s'%(self.active_numbers['s']+1),"values")),
                                 'u%s'%self.active_numbers['u']:("u",self.elements.item('u%s'%self.active_numbers['u'],"values"))}
            self.active_numbers['s'] += 2
            self.active_numbers['u'] += 1       
        elif self.radio_var.get() == 'Cylinder':
            self.elements.insert("",0,'D+U',text="Cylinder",open=TRUE)
            self.active_components = ['D+U']
            self.elements.insert('D+U',0,iid='d%s'%self.active_numbers['d'],text="Doublet",values=("%s"%25,0,0))
            self.elements.insert('D+U',0,iid='u%s'%self.active_numbers['u'],text="Uniform",values=("%s"%1,1,0))
            self.active_calls = {'d%s'%self.active_numbers['d']:("d",self.elements.item('d%s'%self.active_numbers['d'],"values")),
                                 'u%s'%self.active_numbers['u']:("u",self.elements.item('u%s'%self.active_numbers['u'],"values"))}
            self.active_numbers['d'] += 1
            self.active_numbers['u'] += 1
        elif self.radio_var.get() == 'Stagnation & Vortex':
            self.elements.insert("",0,'S+V',text="Stag+Vort",open=TRUE)
            self.active_components = ['S+V']
            self.elements.insert('S+V',0,iid='n%s'%self.active_numbers['n'],text="C (n,A)",values=("%s,%s"%(2,1),0,0))
            self.elements.insert('S+V',0,iid='v%s'%self.active_numbers['v'],text="Vortex",values=("%s"%25,0,0))
            self.active_calls = {'n%s'%self.active_numbers['n']:("n",self.elements.item('n%s'%self.active_numbers['n'],"values")),
                                 'v%s'%self.active_numbers['v']:("v",self.elements.item('v%s'%self.active_numbers['v'],"values"))}
            self.active_numbers['n'] += 1
            self.active_numbers['v'] += 1
        self.elements.bind("<Double-Button-1>",self.edit)
        self.elements.bind('<<TreeviewSelect>>',self.treeview_select)
        self.main.bind("<Return>",self.edit_return)
        self.main.bind("<Escape>",self.edit_return)

        
        self.rightc_menu = Menu(self.graph_frame,tearoff=0)
        self.add_menu = Menu(self.rightc_menu,tearoff=0)
        self.rightc_menu.add_cascade(label="Add",menu=self.add_menu)
        self.add_menu.add_command(command=self.addm_source,label='Source')
        self.add_menu.add_command(command=self.addm_vortex,label='Vortex')
        self.add_menu.add_command(command=self.addm_uniform,label='Uniform')
        self.add_menu.add_command(command=self.addm_doublet,label='Doublet')
        self.add_menu.add_command(command=self.addm_corner,label='Corner')
    def right_menu(self,event):
        print "event", event.x,event.y
        #print "graph", self.main.winfo_x()+self.interior.winfo_x()+self.graph_frame.winfo_x(), self.main.winfo_y()+self.interior.winfo_y()+self.graph_frame.winfo_y()
        self.plot_x,self.plot_y = self.FigSubPlot.transData.inverted().transform((event.x,event.y+20))
        self.plot_y = -self.plot_y
        self.rightc_menu.post(self.main.winfo_x()+self.interior.winfo_x()+self.graph_frame.winfo_x()+event.x+9,self.main.winfo_y()+self.graph_frame.winfo_y()+event.y+66)
        
    def treeview_select(self,event):
        if self.elements.get_children(self.elements.selection()[0]) == ():
            if self.mark_var.get() == 0 or self.selected == self.elements.selection():
                pass
            elif self.mark_var.get() == 1:
                
                #add red markers here
                
                if self.elements.selection() != '':
                    child = self.elements.selection()[0]
                    if child != '':
                        self.sel_point = (self.elements.item(child,"values")[1],self.elements.item(child,"values")[2])
                        self.graph_update()
                        self.selected = self.elements.selection()
                else:
                    pass
        else:
            if self.mark_var.get() == 0 or self.selected == self.elements.selection():
                pass
            elif self.mark_var.get() == 1:
                if self.elements.selection() != '':
                    child = self.elements.selection()[0]
                    if child != '':
                        self.sel_point = None
                        self.graph_update()
                        self.selected = self.elements.selection()
    def mark_check_fun(self):
        if self.mark_var.get() == 0:
            self.sel_point = None
            self.graph_update()
        elif self.elements.selection() != '':
            child = self.elements.selection()[0]
            self.sel_point = [self.elements.item(child,"values")[1],self.elements.item(child,"values")[2]]
            self.graph_update()
            
    def add(self):
        self.addsub_menu.post(self.main.winfo_x()+self.as_button_frame.winfo_x()+self.add_button.winfo_x(),self.main.winfo_y()+self.as_button_frame.winfo_y()+self.add_button.winfo_y()-len(self.active_numbers.keys())*14)
    def subtract(self):
        if self.active_edit_flag == 1:
            self.del_edit(self)
        child = self.elements.selection()[0]
        if child == '':
            return
        if self.elements.parent(child) == '':
            ID = child
            self.active_components.remove(child)
            self.elements.delete(child)
        else:
            ID = self.elements.parent(child)
            self.active_components.remove(ID)
            for comp in self.elements.get_children(ID):
                if comp != child:
                    self.active_components.append(comp)
                    self.elements.move(comp,"",0)
            self.elements.delete(ID)
        self.sel_point = None
        self.graph_update()
    def options(self):
        self.options_window = Toplevel(self.main)
        self.options_window.geometry("%dx%d+%d+%d" % (280, 
                                                      200+20,
                                                      self.main.winfo_x()+self.as_button_frame.winfo_x()+self.options_button.winfo_x()-272+26+72+86,
                                                      self.main.winfo_y()+self.as_button_frame.winfo_y()+self.options_button.winfo_y()-196-20))
        self.main.bind('<FocusIn>',self.close_options)
        self.options_window.title("Options")
        self.options_window.update_idletasks()
        self.options_window.bind("<ButtonRelease-1>",self.pan_update)
        self.options_frame = Frame(self.options_window)
        self.options_frame.pack(fill=BOTH,expand=1)
        self.options_window.attributes("-topmost",True)

        self.line_frame = Frame(self.options_frame,bd=2,relief=RIDGE)
        self.line_frame.grid(row=0,column=1,sticky=N+S+E+W,ipady=7)
        self.color_frame = Frame(self.options_frame,bd=2,relief=RIDGE,padx=2)
        self.color_frame.grid(row=0,column=0,sticky=N+S+E+W)
        
        self.color_button = Label(self.color_frame,bg=self.line_color.get(),text = '     ')
        self.color_button.pack(side=RIGHT)
        Label(self.color_frame,text='C:').pack(side=RIGHT)
        self.color_button.bind('<Button-1>',self.getColor)
        
        self.wt_slider = Scale(self.line_frame,from_=1,to=100,orient=HORIZONTAL,variable=self.line_var)
        if self.wt_var.get() == '-> WT:':
            self.wt_slider.config(variable=self.arrow_var)
        elif self.wt_var.get() == '- WT:':
            self.wt_slider.config(variable=self.line_var)
        elif self.wt_var.get() == 'div WT:':
            self.wt_slider.config(variable=self.div_check_var)
        self.wt_slider.pack(side=RIGHT)
        
        self.wt_menu = OptionMenu(self.line_frame,self.wt_var,'- WT:','-> WT:','div WT:')
        self.wt_menu.pack(side=RIGHT,anchor='center',fill=X,expand=1)
        self.wt_menu.config(width=8)
        self.density_frame = Frame(self.options_frame,bd=2,relief=RIDGE)
        self.density_frame.grid(row=1,column=1,sticky=N+S+E+W)
        self.density_slider = Scale(self.density_frame,from_=1,to=100,orient=HORIZONTAL,variable=self.density_var)
        self.density_slider.pack(side=RIGHT)
        Label(self.density_frame,text='Density').pack(side=LEFT,anchor=CENTER,fill=X,expand=1)
        
        self.linet_frame = Frame(self.options_frame,bd=2,relief=RIDGE)
        self.linet_frame.grid(row=1,column=0,sticky=N+S+E+W)
        Label(self.linet_frame,text='Style').pack(anchor='n')
        self.linet_menu = OptionMenu(self.linet_frame,self.linet_var,'-','->','-|>')
        self.linet_menu.pack(anchor='s',side=BOTTOM)
        self.linet_menu.config(width=5)
        
        self.div_check = Checkbutton(self.options_frame,text = 'Dividing Streamline',variable=self.div_var,onvalue=1,offvalue=0,command = self.graph_update)
        self.div_check.grid(row=2,column=1,sticky=W)
        self.mark_check = Checkbutton(self.options_frame,text = 'Selection Marker',variable=self.mark_var,onvalue=1,offvalue=0,command = self.mark_check_fun)
        self.mark_check.grid(row=3,column=1,sticky=W)
        
        self.limit_frame = Frame(self.options_frame)
        self.limit_frame.grid(row=4,column=1,sticky=W)
        #self.aspect_lock = Checkbutton(self.limit_frame,text='LK',variable = self.lock_var)
        #self.aspect_lock.grid(row=0,column=4,rowspan=2,sticky=E)
        
        Label(self.limit_frame,text='x').grid(row=0,column=0)
        self.xlimlow_var = DoubleVar()
        self.xlimlow_var.set(self.FigSubPlot.get_xlim()[0])
        self.xlimlow_entry = Entry(self.limit_frame,textvariable=self.xlimlow_var,width=5)
        self.xlimlow_entry.grid(row=0,column=1)
        Label(self.limit_frame,text='...').grid(row=0,column=2)
        self.xlimhigh_var = DoubleVar()
        self.xlimhigh_var.set(self.FigSubPlot.get_xlim()[1])
        self.xlimhigh_entry = Entry(self.limit_frame,textvariable=self.xlimhigh_var,width=5)
        self.xlimhigh_entry.grid(row=0,column=3)
        Label(self.limit_frame,text='y').grid(row=1,column=0)
        self.ylimlow_var = DoubleVar()
        self.ylimlow_var.set(self.FigSubPlot.get_ylim()[0])
        self.ylimlow_entry = Entry(self.limit_frame,textvariable=self.ylimlow_var,width=5)
        self.ylimlow_entry.grid(row=1,column=1)
        Label(self.limit_frame,text='...').grid(row=1,column=2)
        self.ylimhigh_var = DoubleVar()
        self.ylimhigh_var.set(self.FigSubPlot.get_ylim()[1])
        self.ylimhigh_entry = Entry(self.limit_frame,textvariable=self.ylimhigh_var,width=5)
        self.ylimhigh_entry.grid(row=1,column=3)
        
        
        #self.limit_frame.bind('<FocusOut>',self.limits_update)
        self.xlimhigh_var.trace('w',self.limits_update)
        self.ylimhigh_var.trace('w',self.limits_update)
        self.xlimlow_var.trace('w',self.limits_update)
        self.ylimlow_var.trace('w',self.limits_update)
        
    def limits_update(self,*args):

        if self.xlimlow_entry.get() == '' or self.ylimlow_entry.get() == '' or self.xlimhigh_entry.get() == '' or self.ylimhigh_entry.get() == '':
            pass
        elif self.xlimlow_entry.get() == '-' or self.ylimlow_entry.get() == '-' or self.xlimhigh_entry.get() == '-' or self.ylimhigh_entry.get() == '-':
            pass
        elif self.xlimlow_entry.get() == '.' or self.ylimlow_entry.get() == '.' or self.xlimhigh_entry.get() == '.' or self.ylimhigh_entry.get() == '.':
            pass
        else:
            self.xlim = [float(self.xlimlow_var.get()),float(self.xlimhigh_var.get())]
            self.ylim = [float(self.ylimlow_var.get()),float(self.ylimhigh_var.get())]

            self.FigSubPlot.set_xlim(self.xlim)
            self.FigSubPlot.set_ylim(self.ylim)
            self.graph_update()
    def getColor(self,event):
        color=askcolor(self.line_color.get())
        if color != "None":
            self.line_color.set(color[1])
            self.graph_update()
    def wt_update(self,*args):
        if self.wt_var.get() == '-> WT:':
            self.wt_slider.config(variable=self.arrow_var)
        elif self.wt_var.get() == '- WT:':
            self.wt_slider.config(variable=self.line_var)
        elif self.wt_var.get() == 'div WT:':
            self.wt_slider.config(variable=self.div_check_var)
    def line_style_update(self,*args):
        self.graph_update()
    def close_options(self,event):
        self.options_window.destroy()
    def add_source(self):
        if self.modify_flag == 0:
            self.plot_x,self.plot_y = 0,0
        self.elements.insert("",0,iid='s%s'%self.active_numbers['s'],text="Source",values=("%s"%1,self.plot_x,self.plot_y))
        self.active_calls['s%s'%self.active_numbers['s']] = ("s",self.elements.item('s%s'%self.active_numbers['s'],"values"))
        self.active_components.append('s%s'%self.active_numbers['s'])
        if self.modify_flag == 1:
            self.elements.selection_set('s%s'%self.active_numbers['s'])
            self.modify_flag = 0
        self.graph_update()
        self.active_numbers['s'] += 1
        
    def add_vortex(self):
        if self.modify_flag == 0:
            self.plot_x,self.plot_y = 0,0
        self.elements.insert("",0,iid='v%s'%self.active_numbers['v'],text="Vortex",values=("%s"%1,self.plot_x,self.plot_y))
        self.active_calls['v%s'%self.active_numbers['v']] = ("v",self.elements.item('v%s'%self.active_numbers['v'],"values"))
        self.active_components.append('v%s'%self.active_numbers['v'])

        if self.modify_flag == 1:
            self.elements.selection_set('v%s'%self.active_numbers['v'])
            self.modify_flag = 0
        self.graph_update()
        self.active_numbers['v'] += 1
    def add_uniform(self):
        if self.modify_flag == 0:
            self.plot_x,self.plot_y = 1,0
        self.elements.insert("",0,iid='u%s'%self.active_numbers['u'],text="Uniform",values=("%s"%1,self.plot_x,self.plot_y))
        self.active_calls['u%s'%self.active_numbers['u']] = ("u",self.elements.item('u%s'%self.active_numbers['u'],"values"))
        self.active_components.append('u%s'%self.active_numbers['u'])
        if self.modify_flag == 1:
            self.elements.selection_set('u%s'%self.active_numbers['u'])
            self.modify_flag = 0
        self.graph_update()
        self.active_numbers['u'] += 1
    def add_doublet(self):
        if self.modify_flag == 0:
            self.plot_x,self.plot_y = 0,0
        self.elements.insert("",0,iid='d%s'%self.active_numbers['d'],text="Doublet",values=("%s"%1,self.plot_x,self.plot_y))
        self.active_calls['d%s'%self.active_numbers['d']] = ("d",self.elements.item('d%s'%self.active_numbers['d'],"values"))
        self.active_components.append('d%s'%self.active_numbers['d'])
        if self.modify_flag == 1:
            self.elements.selection_set('d%s'%self.active_numbers['d'])
            self.modify_flag = 0
        self.graph_update()
        self.active_numbers['d'] += 1
    def add_corner(self):
        if self.modify_flag == 0:
            self.plot_x,self.plot_y = 0,0
        self.elements.insert("",0,iid='n%s'%self.active_numbers['n'],text="Corner (n,A)",values=("%s,%s"%(2,1),self.plot_x,self.plot_y))
        self.active_calls['n%s'%self.active_numbers['n']] = ("n",self.elements.item('n%s'%self.active_numbers['n'],"values"))
        self.active_components.append('n%s'%self.active_numbers['n'])
        if self.modify_flag == 1:
            self.elements.selection_set('n%s'%self.active_numbers['n'])
            self.modify_flag = 0
        self.graph_update()
        self.active_numbers['n'] += 1
    def addm_source(self):
        self.modify_flag = 1 
        self.add_source()
    def addm_vortex(self):
        self.modify_flag = 1
        self.add_vortex()
    def addm_uniform(self):
        self.modify_flag = 1
        self.add_uniform()
    def addm_doublet(self):
        self.modify_flag = 1
        self.add_doublet()
    def addm_corner(self):
        self.modify_flag = 1
        self.add_corner()
    def pan_update(self,event):
        if [self.FigSubPlot.get_xlim()[0],self.FigSubPlot.get_xlim()[1]] != self.xlim or [self.FigSubPlot.get_ylim()[0],self.FigSubPlot.get_ylim()[1]] != self.ylim or self.density_var.get() != self.density_val or self.line_var.get() != self.line_val or self.arrow_var.get() != self.arrow_val or self.arrow_var.get() != self.arrow_val or self.div_check_var.get() != self.div_val:
            self.graph_update()
            self.density_val = self.density_var.get()
            self.line_val = self.line_var.get()
            self.arrow_val = self.arrow_var.get()
            self.div_val = self.div_check_var.get()
        else:
            return
    def graph_update(self):
        self.FigSubPlot.clear()
        Y, X = mgrid[self.FigSubPlot.get_ylim()[0]:self.FigSubPlot.get_ylim()[1]:100j, self.FigSubPlot.get_xlim()[0]:self.FigSubPlot.get_xlim()[1]:100j]     
        self.xlim = [self.FigSubPlot.get_xlim()[0],self.FigSubPlot.get_xlim()[1]]
        self.ylim = [self.FigSubPlot.get_ylim()[0],self.FigSubPlot.get_ylim()[1]]
        self.U = 0*X
        self.V = 0*X      
        self.stream = 0*X
        for ID in self.active_components:
            if self.elements.get_children(ID) == ():
                child = ID
                self.active_calls[child] = (child[0],self.elements.item(child,"values"))
                if self.active_calls[child][0] == "s":
                    self.U += self.source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                    self.V += self.source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                    self.stream += self.stream_source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                elif self.active_calls[child][0] == 'v':
                    self.U += self.vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                    self.V += self.vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                    self.stream += self.stream_vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                elif self.active_calls[child][0] == 'u':
                    if self.active_calls[child][1][1] == '0' and self.active_calls[child][1][2] == '0':
                        pass
                    else:
                        self.U += self.uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])[0]
                        self.V += self.uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])[1]
                        self.stream += self.stream_uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])
                elif self.active_calls[child][0] == 'd':
                    self.U += self.doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                    self.V += self.doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                    self.stream += self.stream_doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                elif self.active_calls[child][0] == 'n':
                    self.U += self.corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                    self.V += self.corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                    self.stream += self.stream_corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
            else:
                for child in self.elements.get_children(ID):
                    self.active_calls[child] = (child[0],self.elements.item(child,"values"))
                    if self.active_calls[child][0] == "s":
                        self.U += self.source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                        self.V += self.source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                        self.stream += self.stream_source(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                    elif self.active_calls[child][0] == 'v':
                        self.U += self.vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                        self.V += self.vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                        self.stream += self.stream_vortex(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                    elif self.active_calls[child][0] == 'u':
                        if self.active_calls[child][1][1] == '0' and self.active_calls[child][1][2] == '0':
                            pass
                        else:
                            self.U += self.uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])[0]
                            self.V += self.uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])[1]
                            self.stream += self.stream_uniform(X,Y,self.active_calls[child][1][0],self.active_calls[child][1][1],self.active_calls[child][1][2])
                    elif self.active_calls[child][0] == 'd':
                        self.U += self.doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                        self.V += self.doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                        self.stream += self.stream_doublet(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])
                    elif self.active_calls[child][0] == 'n':
                        self.U += self.corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[0]
                        self.V += self.corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])[1]
                        self.stream += self.stream_corner(X-float(self.active_calls[child][1][1]),Y-float(self.active_calls[child][1][2]),self.active_calls[child][1][0])

        self.FigSubPlot.streamplot(X,Y,self.U,self.V,color=self.line_color.get(), linewidth=(2.0/71.0)*self.line_var.get()+(13.0/71.0),density=(2.0/71.0)*self.density_var.get()+(13.0/71.0),arrowstyle=self.linet_var.get(),arrowsize=(4.0/71.0)*self.arrow_var.get()+(13.0/71.0))
        if self.div_var.get() == 1:
            #self.FigSubPlot.contour(X,Y,self.stream,[-0.01,0.01],linewidths=[(4.0/71.0)*self.div_check_var.get()+(13.0/71.0),(4.0/71.0)*self.div_check_var.get()+(13.0/71.0)])
            
            self.FigSubPlot.contour(X,Y,self.stream,[0],linewidths=[(4.0/71.0)*self.div_check_var.get()+(13.0/71.0)])
        if self.mark_var.get() == 1:
            if self.sel_point != None:
                self.plot_point()
        self.FigSubPlot.set_xlim(self.xlim)
        self.FigSubPlot.set_ylim(self.ylim)
        self.canvas.draw()
    def plot_point(self):
        if self.elements.selection()[0][0] == 'u':
            norm = float(float(self.sel_point[0])*float(self.sel_point[0])+float(self.sel_point[1])*float(self.sel_point[1]))**0.5
            if norm == 0:
                norm = 1
            X,Y,U,V = 0,0, float(self.sel_point[0])/norm,float(self.sel_point[1])/norm
            self.FigSubPlot.quiver(X,Y,U,V,angles='xy',scale_units='xy',scale=1,color='g')
        else:
            self.FigSubPlot.plot([self.sel_point[0]],[self.sel_point[1]],'r^',ms=10)
    def edit(self,event):
        if self.active_edit_flag == 1 or self.elements.identify_row(event.y) == '':
            pass
        else:
            self.rowid = self.elements.identify_row(event.y)
            self.column = self.elements.identify_column(event.x)
            self.edit_var = StringVar()
            if int(self.column[-1]) == 0:
                self.edit_var.set('%s'%self.elements.item("%s"%self.elements.identify("item",event.x, event.y))['text'])

            else:
                self.edit_var.set('%s'%self.elements.item("%s"%self.elements.identify("item",event.x, event.y))['values'][int(self.column[-1])-1])

            x,y,width,height = self.elements.bbox(self.rowid, self.column)
            self.edit_entry = Entry(self.elements_frame,textvariable=self.edit_var)
            self.edit_entry.place(x=x,y=y,width=width)
            self.edit_entry.focus_force()
            self.edit_entry.bind("<FocusOut>", self.del_edit)
            self.active_edit_flag = 1
    def edit_return(self,event):
        self.main.focus()
    def del_edit(self,event):
        if self.column[-1] == '0':
            self.elements.item(self.rowid,text='%s'%self.edit_var.get())
        elif self.rowid[0] == 'n' and self.column[-1] == '1' and ',' not in self.edit_var.get():
            pass
        else:
            value = ''
            initial_value = str(self.elements.item(self.rowid)['values'][int(self.column[-1])-1])
            comma_flag = 0
            div_flag = 0
            for index in range(0,len(self.edit_var.get())):
                char = self.edit_var.get()[index]
                if char in '-0123456789.':
                    value += char
                elif self.rowid[0] == 'n' and char == ',':
                    if comma_flag == 1:
                        self.edit_entry.destroy()
                        self.active_edit_flag = 0
                        return
                    value += char
                    comma_flag = 1
                    comma_index = index
                if char == '/':
                    if div_flag == 0:
                        div_flag = 1
                        div_index = index
                    elif div_flag == 1 and comma_flag == 1:
                        div_flag = 2
                        div_index2 = index
                    elif div_flag == 1 and comma_flag == 0 or div_flag == 2:
                        self.edit_entry.destroy()
                        self.active_edit_flag = 0
                        return
                   
            if div_flag == 1:
                if comma_flag == 1:
                    if div_index < comma_index:
                        arg = int(float(value[:div_index])*100/float(value[div_index:comma_index-1]))/100.0
                        value = str(arg)+value[comma_index-1:]
                    elif div_index > comma_index:
                        arg = int(float(value[comma_index+1:div_index])*100/float(value[div_index:]))/100.0
                        value = value[:comma_index+1]+str(arg)
                else:
                    arg = int(float(value[:div_index])*100/float(value[div_index:]))/100.0
                    value = str(arg)
            elif div_flag == 2: 
                arg1 = int(float(value[:div_index])*100/float(value[div_index:comma_index-1]))/100.0
                arg2 = int(float(value[comma_index:div_index2-1])*100/float(value[div_index2-1:]))/100.0
                value = str(arg1)+','+str(arg2)
            if value == '' or value == initial_value:
                self.edit_entry.destroy()
                self.active_edit_flag = 0
                return
            
            self.elements.set(self.rowid,column=(int(self.column[-1])-1),value=value)
            if self.mark_var.get() == 1:
                self.sel_point = [self.elements.item(self.rowid,"values")[1],self.elements.item(self.rowid,"values")[2]]
            self.graph_update()
        self.edit_entry.destroy()
        self.active_edit_flag = 0
class SudokuUI(Frame):
    """
    Sudoku grid UI class.
    Adapted from: http://newcoder.io/gui/part-4/
    """
    def __init__(self, parent, board):
        self.game = board
        Frame.__init__(self, parent)
        self.parent = parent

        self.row, self.col = -1, -1
        self.new_entry = None
        self.previous_guess = None

        self.game_state = 0

        self.scores = []

        self.__initUI()

    def __initUI(self):
        """
        Initialize sudoku playing field grid and bind clicking and entry handlers."""

        self.parent.title("Sudoku")
        self.pack(fill=BOTH, expand=1)
        self.canvas = Canvas(self, width=WIDTH, height=HEIGHT)
        self.canvas.grid(row=1, column=0)

        self.__draw_grid()
        self.__draw_puzzle()
        self.__draw_scores()

        self.canvas.bind("<Button-1>", self.__cell_clicked)
        self.canvas.bind("<Key>", self.__key_pressed)

    def __draw_grid(self):
        """
        Draw Sudoku 3x3 x 3x3 grid."""

        for i in xrange(10):
            color = "blue" if i % 3 == 0 else "gray"

            x0 = MARGIN + i * SIDE
            y0 = MARGIN
            x1 = MARGIN + i * SIDE
            y1 = HEIGHT - MARGIN
            self.canvas.create_line(x0, y0, x1, y1, fill=color)

            x0 = MARGIN
            y0 = MARGIN + i * SIDE
            x1 = WIDTH - MARGIN
            y1 = MARGIN + i * SIDE
            self.canvas.create_line(x0, y0, x1, y1, fill=color)

    def __draw_puzzle(self):
        """
        Draw Sudoku solution numbers."""

        self.canvas.delete("numbers")
        for i in xrange(9):
            for j in xrange(9):
                answer = self.game.board[i][j]
                if answer != 0:
                    x = MARGIN + j * SIDE + SIDE / 2
                    y = MARGIN + i * SIDE + SIDE / 2
                    self.canvas.create_text(x, y, text=answer, tags="numbers")

    def __cell_clicked(self, event):
        """
        Handle a single cell click and highlight the clicked cell.
        :param event:
        """
        x, y = event.x, event.y
        if MARGIN < x < WIDTH - MARGIN and MARGIN < y < HEIGHT - MARGIN:
            self.canvas.focus_set()

            # get row and col numbers from x,y coordinates
            row, col = (y - MARGIN) / SIDE, (x - MARGIN) / SIDE

            # if cell was selected already - deselect it
            if (row, col) == (self.row, self.col):
                self.row, self.col = -1, -1
            elif self.game.board[row][col] == 0:
                self.row, self.col = row, col

        self.__draw_cursor()

    def __draw_cursor(self):
        """
        Draw the red outline for the selected square."""

        self.canvas.delete("cursor")
        if self.row >= 0 and self.col >= 0:
            x0 = MARGIN + self.col * SIDE + 1
            y0 = MARGIN + self.row * SIDE + 1
            x1 = MARGIN + (self.col + 1) * SIDE - 1
            y1 = MARGIN + (self.row + 1) * SIDE - 1
            self.canvas.create_rectangle(x0,
                                         y0,
                                         x1,
                                         y1,
                                         outline="green",
                                         tags="cursor")

    def __key_pressed(self, event):
        """
        Handle solution number entry."""

        if self.row >= 0 and self.col >= 0 and event.char in "123456789" and self.game_state == 1:
            self.new_entry = (self.row, self.col, int(event.char))
            self.col, self.row = -1, -1
            self.__draw_puzzle()
            self.__draw_cursor()

    def __draw_scores(self):
        self.score_list = Treeview(self, columns=('name', 'score'))
        self.score_list['show'] = 'headings'
        self.score_list.heading('name', text='Name')
        self.score_list.column('name', width=80, anchor=CENTER)
        self.score_list.heading('score', text='Score')
        self.score_list.column('score', width=80, anchor=CENTER)

        self.score_list.grid(row=1, column=1, padx=(0, 20))

    def __update_scores(self, scores):
        self.score_list.delete(*self.score_list.get_children())
        for entry in scores:
            self.score_list.insert('', 'end', values=(entry[0], entry[1]))

    def show_winner(self, score, user_id):
        if score[2] == user_id:
            winner_text = "YOU HAVE WON!"
        else:
            winner_text = "Player " + str(score[0]) + " has won!"
        tkMessageBox.showwarning("A WINNER IS FOUND", winner_text)

    def update_board(self, root, board, scores, new_game_state):
        """
        Update board during the gameplay. If all players are not connected, solution entry is not permitted.
        In case of a wrong answer the selected square is flashed red for a fraction of a second to notify
        the player about his life decisions.

        :param root:
        :param board:
        :param new_game_state:
        :return entered value:
        """
        return_val = None

        self.__update_scores(scores)

        # Check for game state, if it is "0", just return, else continue the game
        if self.game_state == 0:
            root.update()

            if new_game_state != 0:
                self.game_state = new_game_state
            return return_val

        # If previous guess was not correct flash it red
        if self.previous_guess is not None and board[self.previous_guess[0]][self.previous_guess[1]] != \
                self.previous_guess[2]:
            row, col, _ = self.previous_guess
            x0 = MARGIN + col * SIDE + 1
            y0 = MARGIN + row * SIDE + 1
            x1 = MARGIN + (col + 1) * SIDE - 1
            y1 = MARGIN + (row + 1) * SIDE - 1
            self.canvas.create_rectangle(x0,
                                         y0,
                                         x1,
                                         y1,
                                         fill="red",
                                         tags="fail")
        else:
            self.canvas.delete("fail")

        # Initiate return value to none, update the board and draw it
        self.game.update_board(board)
        self.__draw_puzzle()
        root.update()

        # If user has entered anything in between, write it into the return value and previous guess and return
        if self.new_entry is not None:
            return_val = self.new_entry
            self.previous_guess = self.new_entry
            self.new_entry = None
        else:
            self.previous_guess = None

        return return_val
Ejemplo n.º 36
0
class XML_Viwer(Frame):
    def __init__(self,
                 master,
                 xml=None,
                 heading_text=None,
                 heading_anchor=None,
                 padding=None,
                 cursor=None,
                 takefocus=None,
                 style=None):
        Frame.__init__(self, master, class_="XML_Viwer")

        self._vsb = Scrollbar(self, orient=VERTICAL)
        self._hsb = Scrollbar(self, orient=HORIZONTAL)

        kwargs = {}
        kwargs["yscrollcommand"] = lambda f, l: autoscroll(self._vsb, f, l)
        kwargs["xscrollcommand"] = lambda f, l: autoscroll(self._hsb, f, l)

        if style is not None:
            kwargs["style"] = style

        if padding is not None:
            kwargs["padding"] = padding

        if cursor is not None:
            kwargs["cursor"] = cursor

        if takefocus is not None:
            kwargs["takefocus"] = takefocus

        self._treeview = Treeview(self, **kwargs)

        if heading_text is not None:
            if heading_anchor is not None:
                self._treeview.heading("#0",
                                       text=heading_text,
                                       anchor=heading_anchor)
            else:
                self._treeview.heading("#0", text=heading_text)

        self._treeview.bind("<<TreeviewOpen>>", self._on_open)
        self._treeview.bind("<<TreeviewClose>>", self._on_close)

        # Without this line, horizontal scrolling doesn't work properly.
        self._treeview.column("#0", stretch=False)

        self._vsb['command'] = self._treeview.yview
        self._hsb['command'] = self._treeview.xview

        self._treeview.grid(column=0, row=0, sticky=N + S + W + E)
        self._vsb.grid(column=1, row=0, sticky=N + S)
        self._hsb.grid(column=0, row=1, sticky=E + W)

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        self._element_tree = None
        self._item_ID_to_element = {}

        if xml is not None:
            self.parse_xml(xml)

    def _on_open(self, event):
        item_ID = self._treeview.focus()
        if item_ID not in self._item_ID_to_element: return

        node = self._item_ID_to_element[item_ID]

        self._treeview.item(item_ID, text=self._repr_of_openning_tag(node))

    def _on_close(self, event):
        item_ID = self._treeview.focus()
        if item_ID not in self._item_ID_to_element: return

        node = self._item_ID_to_element[item_ID]

        text = self._repr_of_openning_tag(node) + self._repr_of_closing_tag(
            node)
        self._treeview.item(item_ID, text=text)

    def parse_xml(self, xml):
        self._element_tree = ET.ElementTree(ET.fromstring(xml))

        self.clear()
        self._walk_xml(self._element_tree.getroot())

    @property
    def element_tree(self):
        return self._element_tree

    @element_tree.setter
    def element_tree(self, element_tree):
        self._element_tree = element_tree

        self.clear()
        self._walk_xml(element_tree.getroot())

    def clear(self):
        self._item_ID_to_element = {}
        self._treeview.delete(*self._treeview.get_children())

    def _repr_of_openning_tag(self, node):
        text = "<" + node.tag

        attrs = node.attrib

        # list function is here necessary to provide support to Python 3
        a_names = list(attrs.keys())
        a_names.sort()

        for a_name in a_names:
            text += ' %s="' % a_name
            text += attrs[a_name]
            text += '"'

        text += ">"
        return text

    def _repr_of_closing_tag(self, node):
        return "</%s>" % node.tag

    def _walk_xml(self, node, depth=0, parent=""):
        text = self._repr_of_openning_tag(node) + self._repr_of_closing_tag(
            node)

        item = self._treeview.insert(parent, END, text=text)
        self._item_ID_to_element[item] = node

        if node.text:
            text = node.text.strip()
            if text != "":
                for line in text.splitlines():
                    self._treeview.insert(item, END, text=line)

        child_nodes = sorted(list(node), key=attrgetter('tag'))
        for child_node in node:
            self._walk_xml(child_node, depth + 1, parent=item)

        if node.tail:
            tail = node.tail.strip()
            if tail != "":
                for line in tail.splitlines():
                    self._treeview.insert(parent, END, text=line)
Ejemplo n.º 37
0
class Tree(Treeview):
    """ Класс, формирующий таблицу """
    def __init__(self, root, frame, num, logit, all_values, list_styles_names):
        Treeview.__init__(self, root)
        self.root = root
        self.num = num
        self.frame = frame
        self.name = "MOXA-%s" % str(self.num)
        self.tree = Treeview(frame, style=list_styles_names[num])
        self.tree["columns"] = ("one", "two", "three")
        self.tree.heading("#0", text="")
        self.tree.column("#0", minwidth=0, width=5, stretch=NO)
        self.tree.heading("one", text="Port")
        self.tree.column("one", minwidth=0, width=30, stretch=NO)
        self.tree.column("two", minwidth=0, width=name_column, stretch=NO)
        self.tree.heading("three", text="State")
        self.tree.column("three", minwidth=0, width=state_column, stretch=YES)
        self.tree['height'] = 32
        self.tree.tag_configure('green',
                                background='gray7',
                                foreground='green2')
        self.tree.tag_configure('red',
                                background='gray7',
                                foreground='tomato2')
        self.tree.tag_configure('blue',
                                background='gray7',
                                foreground='RoyalBlue')
        self.tree.tag_configure('yellow',
                                background='gray7',
                                foreground='yellow')
        self.tree.tag_configure('ready',
                                background='gray7',
                                foreground='white')
        self.tree.tag_configure(
            'focus',
            background='yellow',
        )
        self.tree.bind("<Motion>", self.mycallback)
        self.last_focus = None
        self.tree.pack(side=LEFT)
        self.logit = logit
        self.moxa = all_values[self.num][0]
        self.wraplength = 180
        for key in self.moxa.keys():
            self.tree.insert("",
                             "end",
                             values=(str(key), self.moxa[key], "<><><>"),
                             tags=("green", ))

    def mycallback(self, event):
        """ Функция, отображающая комментарий при наведении мыши на канал """

        _iid = self.tree.identify_row(event.y)
        if _iid != self.last_focus:
            if self.last_focus:
                try:
                    if self.tw:
                        self.tw.destroy()
                except:
                    pass

            if _iid:
                row = self.tree.item(_iid)
                key = row["values"][0]
                if os.path.isfile('comments/comment_%s_%s.txt' %
                                  (self.num, key)):
                    with open('comments/comment_%s_%s.txt' % (self.num, key),
                              'a+') as comment:
                        file_log = comment.read()
                        param = self.tree.bbox(_iid)
                        x = (param[0] + space_X) * self.num
                        y = param[1] + space_Y
                        self.tw = tk.Toplevel()
                        self.tw.wm_overrideredirect(True)
                        self.tw.wm_geometry("+%d+%d" % (x, y))
                        label = tk.Label(self.tw,
                                         text=file_log,
                                         justify='left',
                                         background="yellow2",
                                         relief='solid',
                                         borderwidth=1,
                                         wraplength=self.wraplength,
                                         font=tkFont.Font(family=main_font,
                                                          size=size_font))
                        label.pack()
                self.last_focus = _iid
class LobbyUI(Frame):
    """
    Sudoku multiplayer lobby UI class.
    In case of incorrect inputs error messages are shown.
    """
    action = None

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.row, self.col = -1, -1
        self.__initUI()

    def __initUI(self):
        """
        Initialize UI with a list and required entry fields and submit buttons."""

        self.parent.title('Multiplayer Game')
        self.pack(fill=BOTH, expand=1)

        self.lobby_list = Treeview(self, columns=('room', 'players'))
        self.lobby_list['show'] = 'headings'
        self.lobby_list.heading('room', text='Room ID')
        self.lobby_list.column('room', width=250, anchor=CENTER)
        self.lobby_list.heading('players', text='Players')
        self.lobby_list.column('players', width=100, anchor=CENTER)
        self.lobby_list.grid(row=1,
                             column=0,
                             columnspan=2,
                             rowspan=2,
                             padx=20,
                             pady=(10, 0))

        self.connect_lobby = Button(self,
                                    text='Joining Sudoku\n Solving Session',
                                    command=self.__connect_lobby)
        self.connect_lobby.grid(row=3, column=1, pady=(0, 10))

        Label(self,
              text='Creating new Sudoku\n solving session:').grid(row=4,
                                                                  column=0)

        self.max_players = Entry(self)
        self.max_players.grid(row=4, column=1)

        self.create_game = Button(self,
                                  text='Join new game',
                                  command=self.__create_game)
        self.create_game.grid(row=5, column=1)

    def __connect_lobby(self):
        """
        Handle lobby connection button."""
        LOG.debug('Lobby connect button has been pressed.')
        current_item = self.lobby_list.focus()
        selected_id = None

        if current_item is not None and current_item.strip() != '':
            # Select game column value from item values dictionary.
            selected_id = self.lobby_list.item(current_item)['values'][0]
            LOG.debug('Player wishes to join game ' + str(selected_id))

            if selected_id is not None:
                self.action = ('select', selected_id)
        else:
            tkMessageBox.showwarning(
                "Connection error",
                "Please select a game from the lobby to join.")

    def __create_game(self):
        """
        Create game with some number of max players."""
        max_ok = False

        try:
            max_count = int(self.max_players.get())
        except (ValueError, TypeError):
            max_count = -1
            tkMessageBox.showwarning("Input error",
                                     "Max player count has to be an integer.")

        if isinstance(max_count, int):
            if max_count >= 2:
                max_ok = True
                LOG.debug('Ok max player count.')
            else:
                tkMessageBox.showwarning(
                    "Input error", "Max player count has to be larger than 2.")
                LOG.error('Bad max count.')

        if max_ok:
            self.action = ('create', max_count)

    def populate_list(self, games):
        """
        Method to re-populate the lobby list every poll.
        Additionally retains the focused line during polling.
        :param games:
        """
        previous_selection = self.lobby_list.selection()
        prev_item = None
        if len(previous_selection) > 0:
            prev_item = self.lobby_list.item(previous_selection[0])

        self.lobby_list.delete(*self.lobby_list.get_children())
        for game in games:
            self.lobby_list.insert('',
                                   'end',
                                   values=(str(game[0]),
                                           str(game[1]) + '/' + str(game[2])))

        if prev_item is not None:
            for item in self.lobby_list.get_children():
                if self.lobby_list.item(item) == prev_item:
                    self.lobby_list.selection_set(item)
                    self.lobby_list.focus(item)
Ejemplo n.º 39
0
class Display:
    def __init__(self, controller):
        self.controller = controller

        self.currIndex = 0

        # initialize the GUI
        self.app = Tk()
        self.app.title('Jack Magee\'s Pub')

        self.tree = Treeview(self.app, height=30)
        
        # name the tree columns, not sure if they have to be named numbers but that's how the example did it
        self.tree["columns"]=("one", "two", "three", "four")
        
        # set the column widths
        self.tree.column("one", width=200)
        self.tree.column("two", width=300)
        self.tree.column("three", width=200)
        self.tree.column("four", width=200)

        # set the column headings
        self.tree.heading("#0", text= "ID")
        self.tree.heading("one", text="Name")
        self.tree.heading("two", text="Order")
        self.tree.heading("three", text="Price")
        self.tree.heading("four", text="Respond (double-click)")

        self.tree.pack()
        
        # register handler for double-clicks
        self.tree.bind("<Double-1>", self.OnDoubleClick)

    def mainloop(self):
        self.app.mainloop()

    # this is like making tree entries buttons
    def OnDoubleClick(self, event):
        # get the pressed item
        item = self.tree.selection()[0]
        # get the item's text
        response =  self.tree.item(item,"text")

        # this is the only response we are sending for now
        if response == 'rdy':
            # get the parent directory whose text is the customer id
            parent = self.tree.parent(item)
            customer_id = self.tree.item(parent,"text")
            # remove it from the tree
            self.tree.delete(parent)
            # send the message to the customer
            self.controller.send_msg(customer_id, response)

    # add a new order to the tree
    def takeOrder(self, customer_id, name, order, price):
        # just a row identifier
        thisRow = str(self.currIndex)

        # insert the i.d. and name at the top level
        self.tree.insert("", self.currIndex, thisRow, text=customer_id, values=(name, "", "", ""))
        # insert the "button" for sending notification to clients
        self.tree.insert(thisRow, 0, text='rdy', values=("", "", "", "Ready For Pick Up"))

        # this is a hacky solution to get multiline orders to appear because treeviews will 
        # crop anything more than 1 line so I just make a new entry for every line
        multiline_order = order.split('\n')
        this_line = 1
        for line in multiline_order[:-1]:   # exclude the last end line
            if this_line == 1:  # the first line has the name of the order and it's price
                self.tree.insert(thisRow, 1, text="order",values=("", order, price, ""))
            else: # just keep printing the extra options, sides, and add ons
                self.tree.insert(thisRow, this_line, text="order",values=("", line, "", ""))
            this_line += 1

        self.currIndex += 1
Ejemplo n.º 40
0
class CommSearch(Frame):
  
    def __init__(self, parent):
        Frame.__init__(self, parent)   
         
        self.parent = parent        
        self.initUI()
        
    def initUI(self):

        self.entries_found = []

        self.parent.title("Search your command cards")
        self.style = Style()
        self.style.theme_use("default")        
        self.pack()
        
        self.input_title = Label(self, text="Enter your command below")
        self.input_title.grid(row=0, columnspan=2)
        self.input_box = Entry(self, width=90)
        self.input_box.grid(row=1, column=0)
        self.input_box.focus()
        self.input_box.bind("<Key>", self.onUpdateSearch)
        self.search_btn = Button(self, text="Search", command=self.onSearch)
        self.search_btn.grid(row=1, column=1)
        self.output_box = Treeview(self, columns=("Example"))
        ysb = Scrollbar(self, orient='vertical', command=self.output_box.yview)
        xsb = Scrollbar(self, orient='horizontal', command=self.output_box.xview)
        self.output_box.configure(yscroll=ysb.set, xscroll=xsb.set)
        self.output_box.heading('Example', text='Example', anchor='w')
        self.output_box.column("#0",minwidth=0,width=0, stretch=NO)
        self.output_box.column("Example",minwidth=0,width=785)
        self.output_box.bind("<Button-1>", self.OnEntryClick)
        self.output_box.grid(row=3, columnspan=2)
        self.selected_box = Text(self, width=110, height=19)
        self.selected_box.grid(row=4, columnspan=2)
        self.gotoadd_btn = Button(self, text="Go to Add", command=self.onGoToAdd)
        self.gotoadd_btn.grid(row=5)

    def OnEntryClick(self, event):
        try:
            item = self.output_box.selection()[0]
        except IndexError:
            pass
        entry_title = self.output_box.item(item,"value")
        for item in self.entries_found:
            if str(entry_title) == str("('" + item.title.strip('\n') + "',)"):
                self.selected_box.delete(0.1, END)
                self.selected_box.insert(END, item.text + '\n')

    def onUpdateSearch(self, key):
    # Somehow calling self.onSearch() does not register last key
    # And we need to correct "special chars"
        global entries, entries_map
        text_entries = ""
        for item in self.output_box.get_children():
            self.output_box.delete(item)		
    # ...like, for instance, deleting last character
        if key.char == '\b':
            search_terms = str(self.input_box.get()[:-1])
        else: 
            search_terms = str(self.input_box.get() + key.char)
        self.entries_found = []
        self.entries_found = data.Search(search_terms,entries,entries_map)
        for item in range(len(self.entries_found)):
            aux = self.output_box.insert('', 'end', '', value=[self.entries_found[item].title.split('\n')[0]])

			
    def onSearch(self):
        global entries, entries_map
        text_entries = ""
        for item in self.output_box.get_children():
            self.output_box.delete(item)
        search_terms = str(self.input_box.get())
        for item in data.Search(search_terms,entries,entries_map):
            self.output_box.insert('', 'end', '', value=[self.entries_found[item].title.split('\n')[0]])
			
    def onGoToAdd(self):
        newroot = Tk()
        newcomm = CommAdd(newroot)
        newroot.geometry("800x600+0+0")
        newroot.mainloop()
Ejemplo n.º 41
0
class App:
    def __init__(self, window):
        self.window = window
        self.mainDaemonAlive = False
        self.reportServerAlive = False
        self.reportServerBut = None
        self.progressbarRunning = False
        self.modelTree = None
        self.nsListStr = StringVar(self.window)
        self.filterStatusStr = StringVar(self.window)
        self.reportClientStatusStr = StringVar(self.window)
        self.playModeStr = StringVar(self.window, PLAY_MODES[0])
        self.pktCopyMaxSize = StringVar(self.window, "60")
        self.netInterfaceStr = StringVar(self.window, NET_INTERFACES[0])
        self.servicePortsStr = StringVar(self.window, "DNS")
        self.debugLevelStr = StringVar(self.window, DEBUG_LEVELS[0])
        self.filterControlButStr = StringVar(self.window, "START")
        self.reportClientControlButStr = StringVar(self.window, "START")
        self.progressFrame = Frame(self.window, width=700, height=20)
        self.progressFrame.pack(side=TOP)
        Frame(self.window, width=700, height=10).pack(side=TOP)
        self.parseNS("/etc/resolv.conf")
        self.getDaemonStatus()
        self.home()
        Frame(self.window, width=700, height=10).pack(side=TOP)
        self.window.resizable(width=False, height=False)
        Style().configure("TButton",
                          padding=6,
                          relief="raised",
                          background="#999")

    def home(self):
        """
    Initialize main window.
    """
        #Configured NS info frame
        nsFrame = Frame(self.window, relief="groove", borderwidth=1)
        Label(nsFrame, text="Configured nameservers:", height=2,
              anchor='w').grid(row=0, sticky="nsew")
        Label(nsFrame, textvariable=self.nsListStr,
              relief="sunken").grid(row=1, sticky="nsew")
        nsFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        #Runtime params frame
        nsFrame = Frame(self.window, relief="groove", borderwidth=1)
        Label(nsFrame, text="Runtime configurations:", height=2,
              anchor='w').grid(row=0, sticky="nsew")
        Label(nsFrame, text="Play mode:").grid(row=1, column=0)
        OptionMenu(nsFrame, self.playModeStr, *PLAY_MODES).grid(row=1,
                                                                column=1)
        Separator(nsFrame, orient="vertical").grid(row=1,
                                                   column=2,
                                                   sticky="ns",
                                                   padx=20)
        Label(nsFrame, text="Interface:").grid(row=1, column=3)
        OptionMenu(nsFrame, self.netInterfaceStr,
                   *NET_INTERFACES).grid(row=1, column=4)
        Separator(nsFrame, orient="vertical").grid(row=1,
                                                   column=5,
                                                   sticky="ns",
                                                   padx=20)
        Label(nsFrame, text="Service:").grid(row=1, column=6)
        OptionMenu(nsFrame, self.servicePortsStr,
                   *NET_PORTS.keys()).grid(row=1, column=7)
        Separator(nsFrame, orient="vertical").grid(row=1,
                                                   column=8,
                                                   sticky="ns",
                                                   padx=20)
        Label(nsFrame, text="Debug level:").grid(row=1, column=9)
        OptionMenu(nsFrame, self.debugLevelStr, *DEBUG_LEVELS).grid(row=1,
                                                                    column=10)
        nsFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(nsFrame, orient="vertical").grid(row=2,
                                                   column=2,
                                                   sticky="ns",
                                                   padx=20)
        Label(nsFrame, text="Max datagram bytes to copy:").grid(row=2,
                                                                column=3)
        Entry(nsFrame,
              width=5,
              text=self.pktCopyMaxSize.get(),
              textvariable=self.pktCopyMaxSize).grid(row=2, column=4)
        Separator(nsFrame, orient="vertical").grid(row=2,
                                                   column=5,
                                                   sticky="ns",
                                                   padx=20)
        nsFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        #filter daemon status frame
        statusFrame = Frame(self.window)
        Label(statusFrame, text="DNS filter status:", height=2,
              anchor='w').grid(row=0, column=0)
        Label(statusFrame, textvariable=self.filterStatusStr).grid(row=0,
                                                                   column=1)
        Button(statusFrame,
               textvariable=self.filterControlButStr,
               command=self.changeFilterStatus).grid(row=1, column=0, sticky=W)
        statusFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        #model files frame
        modelFrame = Frame(self.window)
        Label(modelFrame,
              text="Model tags: [{}]".format(configs["model_tags"]),
              height=2,
              anchor='w').grid(row=0, sticky="nsew")
        Label(modelFrame, text="Model configuration", height=2).grid(row=1,
                                                                     sticky=W)
        self.modelConfigFrame(modelFrame).grid(row=2, columnspan=2, sticky=W)
        modelFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        #web report client frame
        reportClientFrame = Frame(self.window)
        Label(reportClientFrame,
              text="Realtime report client status:",
              height=2,
              anchor='w').grid(row=0, column=0)
        Label(reportClientFrame,
              textvariable=self.reportClientStatusStr).grid(row=0, column=1)
        self.reportServerBut = Button(
            reportClientFrame,
            textvariable=self.reportClientControlButStr,
            command=self.changeReportClientStatus,
            state=self.getButtonStateForBool(self.mainDaemonAlive))
        self.reportServerBut.grid(row=1, column=0, sticky=W)
        reportClientFrame.pack(side=TOP,
                               fill=X,
                               padx=20,
                               pady=10,
                               ipadx=20,
                               ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        #Refresh status frame
        reloadFrame = Frame(self.window)
        Button(reloadFrame, text="Reload",
               command=self.getDaemonStatus).grid(row=0, column=1, sticky=E)
        reloadFrame.pack(side=TOP, fill=X, padx=20, pady=10, ipadx=20, ipady=5)
        Separator(self.window, orient="horizontal").pack(side=TOP,
                                                         padx=20,
                                                         fill=X)
        return

    def modelConfigFrame(self, parent):
        """
    Create and place next under parent a frame containing the current model configuration.
    """
        #Create container
        frame = Frame(parent)
        #Create treeView for model configuration
        self.modelTree = Treeview(parent, columns=('size', 'modified'))
        self.populateModelTree()
        self.modelTree.grid(row=1)

        #Bind right-click (<Button-3>) on tree items for contextual menus
        def treeContextualMenu(event):
            itemId = self.modelTree.identify_row(event.y)
            if itemId:
                self.modelTree.selection_set(itemId)
                item = self.modelTree.selection()
                ctxMenu = Menu(self.window, tearoff=0)
                ctxMenu.add_separator()
                if item[0][:4] == "tag:":
                    tag = item[0][4:]
                    ctxMenu.add_command(
                        label="Add samples (from a csv file)",
                        command=lambda: self.addSampleFileToModelDir(tag))
                    ctxMenu.add_separator()
                    ctxMenu.add_command(
                        label="Visualize feature map w.r.t loaded model",
                        command=lambda: self.testOnLoadedModel(
                            join(configs["model_data_dir"], tag), True))
                elif item[0][:5] == "file:":
                    filename = item[0][5:]
                    ctxMenu.add_command(
                        label="Test on loaded model",
                        command=lambda: self.testOnLoadedModel(
                            join(configs["model_data_dir"], filename), False))
                    ctxMenu.add_separator()
                    ctxMenu.add_command(
                        label="Delete",
                        command=lambda: self.deleteModelFile(filename))
                ctxMenu.add_separator()
                ctxMenu.tk_popup(event.x_root, event.y_root)

        self.modelTree.bind("<Button-3>", treeContextualMenu)
        return frame

    def testOnLoadedModel(self, sampleFile, isDir):
        try:
            modelviz.model_viz(sampleFile, isDir)
        except Exception as exc:
            tkMessageBox.showinfo("Sorry!", exc)
        return

    def populateModelTree(self):
        if self.modelTree is None: return
        #Extract model tags
        tags = [s.strip() for s in configs["model_tags"].split(",")]
        self.modelTree.column('size', width=200, anchor='center')
        self.modelTree.column('modified', width=200, anchor='center')
        self.modelTree.heading('size', text='Length')
        self.modelTree.heading('modified', text='Modified')
        treeHeight = 0
        #Populate treeView with current configuration
        self.modelTree.delete(*self.modelTree.get_children())
        for i in range(len(tags)):
            treeHeight += 1
            dirName = join(configs["model_data_dir"], tags[i])
            children = self.getDirContentDescr(dirName)
            rowId = self.modelTree.insert('',
                                          i,
                                          "tag:{}".format(tags[i]),
                                          text=tags[i])
            for child in children:
                treeHeight += 1
                self.modelTree.insert(
                    rowId,
                    "end",
                    "file:{}/{}".format(tags[i], child['name']),
                    text=child['name'],
                    values=(child['size'], child['modified']))
        self.modelTree['height'] = treeHeight + 1
        return

    def addSampleFileToModelDir(self, tag):
        modelDir = join(configs["model_data_dir"], tag)
        file_opts = {
            'defaultextension': '.csv',
            'filetypes': [('CSV files', '.csv'), ('all files', '.*')],
            'initialdir': expanduser("~"),
            'title': 'Select data file'
        }
        filename = tkFileDialog.askopenfilename(**file_opts)
        try:
            modelLoader.add_file_to_model_dir(filename, modelDir)
        except Exception as exc:
            tkMessageBox.showerror("Error copying files", exc)
            return
        self.populateModelTree()
        tkMessageBox.showinfo(
            "Success", "Successfully copied data file {} to {}.".format(
                filename, modelDir))
        return

    def deleteModelFile(self, filename):
        if tkMessageBox.askyesno("Confirm deleting {}".format(filename),
                                 "Are you sure about deleting this file?"):
            try:
                remove(join(configs["model_data_dir"], filename))
                self.populateModelTree()
            except Exception, exc:
                tkMessageBox.showerror("Error deleting {}".format(filename),
                                       exc)
        return
Ejemplo n.º 42
0
class XML_Viwer(Frame):

    def __init__(self, master, xml=None, heading_text=None, heading_anchor=None, padding=None, cursor=None, takefocus=None, style=None):
        Frame.__init__(self, master, class_="XML_Viwer")

        self._vsb = Scrollbar(self, orient=VERTICAL)
        self._hsb = Scrollbar(self, orient=HORIZONTAL)

        kwargs = {}
        kwargs["yscrollcommand"] = lambda f, l: autoscroll(self._vsb, f, l)
        kwargs["xscrollcommand"] = lambda f, l: autoscroll(self._hsb, f, l)
       
        if style is not None:
            kwargs["style"] = style
            
        if padding is not None:
            kwargs["padding"] = padding
            
        if cursor is not None:
            kwargs["cursor"] = cursor
            
        if takefocus is not None:
            kwargs["takefocus"] = takefocus

        self._treeview = Treeview(self, **kwargs)
        
        if heading_text is not None:
            if heading_anchor is not None:
                self._treeview.heading("#0", text=heading_text, anchor=heading_anchor)
            else:
                self._treeview.heading("#0", text=heading_text)

        self._treeview.bind("<<TreeviewOpen>>", self._on_open)
        self._treeview.bind("<<TreeviewClose>>", self._on_close)
        
        # Without this line, horizontal scrolling doesn't work properly.
        self._treeview.column("#0", stretch= False)

        self._vsb['command'] = self._treeview.yview
        self._hsb['command'] = self._treeview.xview

        self._treeview.grid(column=0, row=0, sticky=N+S+W+E)
        self._vsb.grid(column=1, row=0, sticky=N+S)
        self._hsb.grid(column=0, row=1, sticky=E+W)
        
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        self._element_tree = None
        self._item_ID_to_element = {}

        if xml is not None:
            self.parse_xml(xml)

    def _on_open(self, event):
        item_ID = self._treeview.focus()
        if item_ID not in self._item_ID_to_element: return

        node = self._item_ID_to_element[item_ID]

        self._treeview.item(item_ID, text = self._repr_of_openning_tag(node))
        
    def _on_close(self, event):
        item_ID = self._treeview.focus()
        if item_ID not in self._item_ID_to_element: return

        node = self._item_ID_to_element[item_ID]
        
        text = self._repr_of_openning_tag(node) + self._repr_of_closing_tag(node)
        self._treeview.item(item_ID, text = text)

    def parse_xml(self, xml):
        self._element_tree = ET.ElementTree(ET.fromstring(xml))
        
        self.clear()
        self._walk_xml(self._element_tree.getroot())
        
    @property
    def element_tree(self):
        return self._element_tree
    
    @element_tree.setter
    def element_tree(self, element_tree):
        self._element_tree = element_tree
        
        self.clear()
        self._walk_xml(element_tree.getroot())   
        
    def clear(self):
        self._item_ID_to_element = {}
        self._treeview.delete(*self._treeview.get_children())
        
    def _repr_of_openning_tag(self, node):
        text = "<" + node.tag

        attrs = node.attrib
        
        # list function is here necessary to provide support to Python 3
        a_names = list(attrs.keys())
        a_names.sort()

        for a_name in a_names:
            text += ' %s="' % a_name
            text += attrs[a_name]
            text += '"'

        text += ">"
        return text
        
    def _repr_of_closing_tag(self, node):
        return "</%s>"%node.tag

    def _walk_xml(self, node, depth=0, parent=""):
        text = self._repr_of_openning_tag(node) + self._repr_of_closing_tag(node)

        item = self._treeview.insert(parent, END, text = text)
        self._item_ID_to_element[item] = node
        
        if node.text:
            text = node.text.strip()
            if text != "":
                for line in text.splitlines():
                    self._treeview.insert(item, END, text = line)

        child_nodes = sorted(list(node), key=attrgetter('tag'))
        for child_node in node:
            self._walk_xml(child_node, depth+1, parent=item)

        
        if node.tail:
            tail = node.tail.strip()
            if tail != "":
                for line in tail.splitlines():
                    self._treeview.insert(parent, END, text = line)
Ejemplo n.º 43
0
class Multicolumn_Listbox(object):
    _style_index = 0

    class List_Of_Rows(object):
        def __init__(self, multicolumn_listbox):
            self._multicolumn_listbox = multicolumn_listbox

        def data(self, index):
            return self._multicolumn_listbox.row_data(index)

        def get(self, index):
            return Row(self._multicolumn_listbox, index)

        def insert(self, data, index=None):
            self._multicolumn_listbox.insert_row(data, index)

        def delete(self, index):
            self._multicolumn_listbox.delete_row(index)

        def update(self, index, data):
            self._multicolumn_listbox.update_row(index, data)

        def select(self, index):
            self._multicolumn_listbox.select_row(index)

        def deselect(self, index):
            self._multicolumn_listbox.deselect_row(index)

        def set_selection(self, indices):
            self._multicolumn_listbox.set_selection(indices)

        def __getitem__(self, index):
            return self.get(index)

        def __setitem__(self, index, value):
            return self._multicolumn_listbox.update_row(index, value)

        def __delitem__(self, index):
            self._multicolumn_listbox.delete_row(index)

        def __len__(self):
            return self._multicolumn_listbox.number_of_rows

    class List_Of_Columns(object):
        def __init__(self, multicolumn_listbox):
            self._multicolumn_listbox = multicolumn_listbox

        def data(self, index):
            return self._multicolumn_listbox.get_column(index)

        def get(self, index):
            return Column(self._multicolumn_listbox, index)

        def delete(self, index):
            self._multicolumn_listbox.delete_column(index)

        def update(self, index, data):
            self._multicolumn_listbox.update_column(index, data)

        def __getitem__(self, index):
            return self.get(index)

        def __setitem__(self, index, value):
            return self._multicolumn_listbox.update_column(index, value)

        def __delitem__(self, index):
            self._multicolumn_listbox.delete_column(index)

        def __len__(self):
            return self._multicolumn_listbox.number_of_columns

    def __init__(self,
                 master,
                 columns,
                 data=None,
                 command=None,
                 sort=True,
                 select_mode=None,
                 heading_anchor=CENTER,
                 cell_anchor=W,
                 style=None,
                 height=None,
                 padding=None,
                 adjust_heading_to_content=False,
                 stripped_rows=None,
                 selection_background=None,
                 selection_foreground=None,
                 field_background=None,
                 heading_font=None,
                 heading_background=None,
                 heading_foreground=None,
                 cell_pady=2,
                 cell_background=None,
                 cell_foreground=None,
                 cell_font=None,
                 headers=True):

        self._stripped_rows = stripped_rows

        self._columns = columns

        self._number_of_rows = 0
        self._number_of_columns = len(columns)

        self.row = self.List_Of_Rows(self)
        self.column = self.List_Of_Columns(self)

        s = Style()

        if style is None:
            style_name = "Multicolumn_Listbox%s.Treeview" % self._style_index
            self._style_index += 1
        else:
            style_name = style

        style_map = {}
        if selection_background is not None:
            style_map["background"] = [('selected', selection_background)]

        if selection_foreground is not None:
            style_map["foeground"] = [('selected', selection_foreground)]

        if style_map:
            s.map(style_name, **style_map)

        style_config = {}
        if cell_background is not None:
            style_config["background"] = cell_background

        if cell_foreground is not None:
            style_config["foreground"] = cell_foreground

        if cell_font is None:
            font_name = s.lookup(style_name, "font")
            cell_font = nametofont(font_name)
        else:
            if not isinstance(cell_font, Font):
                if isinstance(cell_font, basestring):
                    cell_font = nametofont(cell_font)
                else:
                    if len(font) == 1:
                        cell_font = Font(family=cell_font[0])
                    elif len(font) == 2:
                        cell_font = Font(family=cell_font[0],
                                         size=cell_font[1])

                    elif len(font) == 3:
                        cell_font = Font(family=cell_font[0],
                                         size=cell_font[1],
                                         weight=cell_font[2])
                    else:
                        raise ValueError(
                            "Not possible more than 3 values for font")

            style_config["font"] = cell_font

        self._cell_font = cell_font

        self._rowheight = cell_font.metrics("linespace") + cell_pady
        style_config["rowheight"] = self._rowheight

        if field_background is not None:
            style_config["fieldbackground"] = field_background

        s.configure(style_name, **style_config)

        heading_style_config = {}
        if heading_font is not None:
            heading_style_config["font"] = heading_font
        if heading_background is not None:
            heading_style_config["background"] = heading_background
        if heading_foreground is not None:
            heading_style_config["foreground"] = heading_foreground

        heading_style_name = style_name + ".Heading"
        s.configure(heading_style_name, **heading_style_config)

        treeview_kwargs = {"style": style_name}

        if height is not None:
            treeview_kwargs["height"] = height

        if padding is not None:
            treeview_kwargs["padding"] = padding

        if headers:
            treeview_kwargs["show"] = "headings"
        else:
            treeview_kwargs["show"] = ""

        if select_mode is not None:
            treeview_kwargs["selectmode"] = select_mode

        self.interior = Treeview(master, columns=columns, **treeview_kwargs)

        if command is not None:
            self._command = command
            self.interior.bind("<<TreeviewSelect>>", self._on_select)

        for i in range(0, self._number_of_columns):

            if sort:
                self.interior.heading(
                    i,
                    text=columns[i],
                    anchor=heading_anchor,
                    command=lambda col=i: self.sort_by(col, descending=False))
            else:
                self.interior.heading(i,
                                      text=columns[i],
                                      anchor=heading_anchor)

            if adjust_heading_to_content:
                self.interior.column(i, width=Font().measure(columns[i]))

            self.interior.column(i, anchor=cell_anchor)

        if data is not None:
            for row in data:
                self.insert_row(row)

    @property
    def row_height(self):
        return self._rowheight

    @property
    def font(self):
        return self._cell_font

    def configure_column(self,
                         index,
                         width=None,
                         minwidth=None,
                         anchor=None,
                         stretch=None):
        kwargs = {}
        for config_name in ("width", "anchor", "stretch", "minwidth"):
            config_value = locals()[config_name]
            if config_value is not None:
                kwargs[config_name] = config_value

        self.interior.column('#%s' % (index + 1), **kwargs)

    def row_data(self, index):
        try:
            item_ID = self.interior.get_children()[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        return self.item_ID_to_row_data(item_ID)

    def update_row(self, index, data):
        try:
            item_ID = self.interior.get_children()[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        if len(data) == len(self._columns):
            self.interior.item(item_ID, values=data)
        else:
            raise ValueError("The multicolumn listbox has only %d columns" %
                             self._number_of_columns)

    def delete_row(self, index):
        list_of_items = self.interior.get_children()

        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        self.interior.delete(item_ID)
        self._number_of_rows -= 1

        if self._stripped_rows:
            for i in range(index, self._number_of_rows):
                self.interior.tag_configure(list_of_items[i + 1],
                                            background=self._stripped_rows[i %
                                                                           2])

    def insert_row(self, data, index=None):
        if len(data) != self._number_of_columns:
            raise ValueError("The multicolumn listbox has only %d columns" %
                             self._number_of_columns)

        if index is None:
            index = self._number_of_rows - 1

        item_ID = self.interior.insert('', index, values=data)
        self.interior.item(item_ID, tags=item_ID)

        self._number_of_rows += 1

        if self._stripped_rows:
            list_of_items = self.interior.get_children()

            self.interior.tag_configure(item_ID,
                                        background=self._stripped_rows[index %
                                                                       2])

            for i in range(index + 1, self._number_of_rows):
                self.interior.tag_configure(list_of_items[i],
                                            background=self._stripped_rows[i %
                                                                           2])

    def column_data(self, index):
        return [
            self.interior.set(child_ID, index)
            for child_ID in self.interior.get_children('')
        ]

    def update_column(self, index, data):
        for i, item_ID in enumerate(self.interior.get_children()):
            data_row = self.item_ID_to_row_data(item_ID)
            data_row[index] = data[i]

            self.interior.item(item_ID, values=data_row)

        return data

    def clear(self):
        # Another possibility:
        #  self.interior.delete(*self.interior.get_children())

        for row in self.interior.get_children():
            self.interior.delete(row)

        self._number_of_rows = 0

    def update(self, data):
        self.clear()

        for row in data:
            self.insert_row(row)

    def focus(self, index=None):
        if index is None:
            return self.interior.item(self.interior.focus())
        else:
            item = self.interior.get_children()[index]
            self.interior.focus(item)

    def state(self, state=None):
        if stateSpec is None:
            return self.interior.state()
        else:
            self.interior.state(state)

    @property
    def number_of_rows(self):
        return self._number_of_rows

    @property
    def number_of_columns(self):
        return self._number_of_columns

    def toogle_selection(self, index):
        list_of_items = self.interior.get_children()

        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        self.interior.selection_toggle(item_ID)

    def select_row(self, index):
        list_of_items = self.interior.get_children()

        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        self.interior.selection_add(item_ID)

    def deselect_row(self, index):
        list_of_items = self.interior.get_children()

        try:
            item_ID = list_of_items[index]
        except IndexError:
            raise ValueError("Row index out of range: %d" % index)

        self.interior.selection_remove(item_ID)

    def deselect_all(self):
        self.interior.selection_remove(self.interior.selection())

    def set_selection(self, indices):
        list_of_items = self.interior.get_children()

        self.interior.selection_set(" ".join(list_of_items[row_index]
                                             for row_index in indices))

    @property
    def selected_rows(self):
        data = []
        for item_ID in self.interior.selection():
            data_row = self.item_ID_to_row_data(item_ID)
            data.append(data_row)

        return data

    @property
    def indices_of_selected_rows(self):
        list_of_indices = []
        for index, item_ID in enumerate(self.interior.get_children()):
            if item_ID in self.interior.selection():
                list_of_indices.append(index)

        return list_of_indices

    def delete_all_selected_rows(self):
        selected_items = self.interior.selection()
        for item_ID in selected_items:
            self.interior.delete(item_ID)

        number_of_deleted_rows = len(selected_items)
        self._number_of_rows -= number_of_deleted_rows

        return number_of_deleted_rows

    def _on_select(self, event):
        for item_ID in event.widget.selection():
            data_row = self.item_ID_to_row_data(item_ID)
            self._command(data_row)

    def item_ID_to_row_data(self, item_ID):
        item = self.interior.item(item_ID)
        return item["values"]

    @property
    def table_data(self):
        data = []

        for item_ID in self.interior.get_children():
            data_row = self.item_ID_to_row_data(item_ID)
            data.append(data_row)

        return data

    @table_data.setter
    def table_data(self, data):
        self.update(data)

    def cell_data(self, row, column):
        """Get the value of a table cell"""
        try:
            item = self.interior.get_children()[row]
        except IndexError:
            raise ValueError("Row index out of range: %d" % row)

        return self.interior.set(item, column)

    def update_cell(self, row, column, value):
        """Set the value of a table cell"""

        item_ID = self.interior.get_children()[row]

        data = self.item_ID_to_row_data(item_ID)

        data[column] = value
        self.interior.item(item_ID, values=data)

    def __getitem__(self, index):
        if isinstance(index, tuple):
            row, column = index
            return self.cell_data(row, column)
        else:
            raise Exception("Row and column indices are required")

    def __setitem__(self, index, value):
        if isinstance(index, tuple):
            row, column = index
            self.update_cell(row, column, value)
        else:
            raise Exception("Row and column indices are required")

    def bind(self, event, handler):
        self.interior.bind(event, handler)

    def sort_by(self, col, descending):
        """
        sort tree contents when a column header is clicked
        """
        # grab values to sort
        data = [(self.interior.set(child_ID, col), child_ID)
                for child_ID in self.interior.get_children('')]

        # if the Demo_programs to be sorted is numeric change to float
        try:
            data = [(float(number), child_ID) for number, child_ID in data]
        except ValueError:
            pass

        # now sort the Demo_programs in place
        data.sort(reverse=descending)
        for idx, item in enumerate(data):
            self.interior.move(item[1], '', idx)

        # switch the heading so that it will sort in the opposite direction
        self.interior.heading(
            col, command=lambda col=col: self.sort_by(col, not descending))

        if self._stripped_rows:
            list_of_items = self.interior.get_children('')
            for i in range(len(list_of_items)):
                self.interior.tag_configure(list_of_items[i],
                                            background=self._stripped_rows[i %
                                                                           2])

    def destroy(self):
        self.interior.destroy()

    def item_ID(self, index):
        return self.interior.get_children()[index]
Ejemplo n.º 44
0
class CommSearch(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):

        self.entries_found = []

        self.parent.title("Search your command cards")
        self.style = Style()
        self.style.theme_use("default")
        self.pack()

        self.input_title = Label(self, text="Enter your command below")
        self.input_title.grid(row=0, columnspan=2)
        self.input_box = Entry(self, width=90)
        self.input_box.grid(row=1, column=0)
        self.input_box.focus()
        self.input_box.bind("<Key>", self.onUpdateSearch)
        self.search_btn = Button(self, text="Search", command=self.onSearch)
        self.search_btn.grid(row=1, column=1)
        self.output_box = Treeview(self, columns=("Example"))
        ysb = Scrollbar(self, orient='vertical', command=self.output_box.yview)
        xsb = Scrollbar(self,
                        orient='horizontal',
                        command=self.output_box.xview)
        self.output_box.configure(yscroll=ysb.set, xscroll=xsb.set)
        self.output_box.heading('Example', text='Example', anchor='w')
        self.output_box.column("#0", minwidth=0, width=0, stretch=NO)
        self.output_box.column("Example", minwidth=0, width=785)
        self.output_box.bind("<Button-1>", self.OnEntryClick)
        self.output_box.grid(row=3, columnspan=2)
        self.selected_box = Text(self, width=110, height=19)
        self.selected_box.grid(row=4, columnspan=2)
        self.gotoadd_btn = Button(self,
                                  text="Go to Add",
                                  command=self.onGoToAdd)
        self.gotoadd_btn.grid(row=5)

    def OnEntryClick(self, event):
        try:
            item = self.output_box.selection()[0]
        except IndexError:
            pass
        entry_title = self.output_box.item(item, "value")
        for item in self.entries_found:
            if str(entry_title) == str("('" + item.title.strip('\n') + "',)"):
                self.selected_box.delete(0.1, END)
                self.selected_box.insert(END, item.text + '\n')

    def onUpdateSearch(self, key):
        # Somehow calling self.onSearch() does not register last key
        # And we need to correct "special chars"
        global entries, entries_map
        text_entries = ""
        for item in self.output_box.get_children():
            self.output_box.delete(item)

    # ...like, for instance, deleting last character
        if key.char == '\b':
            search_terms = str(self.input_box.get()[:-1])
        else:
            search_terms = str(self.input_box.get() + key.char)
        self.entries_found = []
        self.entries_found = data.Search(search_terms, entries, entries_map)
        for item in range(len(self.entries_found)):
            aux = self.output_box.insert(
                '',
                'end',
                '',
                value=[self.entries_found[item].title.split('\n')[0]])

    def onSearch(self):
        global entries, entries_map
        text_entries = ""
        for item in self.output_box.get_children():
            self.output_box.delete(item)
        search_terms = str(self.input_box.get())
        for item in data.Search(search_terms, entries, entries_map):
            self.output_box.insert(
                '',
                'end',
                '',
                value=[self.entries_found[item].title.split('\n')[0]])

    def onGoToAdd(self):
        newroot = Tk()
        newcomm = CommAdd(newroot)
        newroot.geometry("800x600+0+0")
        newroot.mainloop()