class per(): def __init__(self,data,y,v='план'): w=Toplevel() w.wm_title('Доп') w.columnconfigure(0,weight=1) w.rowconfigure(0,weight=1) years=sorted(data.keys()) cols=data['2013']['degurs'] # ЗАГЛУШКА : список дежурных self.t=Treeview(w,columns=cols) for c in cols: self.t.heading(c,text=c) self.t.column(c,width=65,anchor='center') self.t.tag_configure('табель',background='green') self.t.tag_configure('ош',background='red') #self.t.tag_configure('табель',background='green') self.scrX=Scrollbar(w,orient='horizontal',command=self.t.xview) self.scrY=Scrollbar(w,orient='vertical',command=self.t.yview) self.t['xscrollcommand']=self.scrX.set self.t['yscrollcommand']=self.scrY.set self.t.grid(row=0,column=0,sticky=N+S+E+W) self.scrX.grid(row=1,column=0,sticky=E+W) self.scrY.grid(row=0,column=1,sticky=N+S) for y in years: x=self.t.insert('','end',text=y) eeY=[] for m in ['01','02','03','04','05','06','07','08','09','10','11','12']: d0=data[y] if m not in d0: continue d=d0[m] rez=dict() tag='' if v=='авто': if 'табель' in d['degur']: vv='табель' tag=vv else: vv='план' elif v=='табель': if 'табель' not in d['degur']: vv='план' tag='ош' else: vv=v tag=vv else: vv=v for j,s in d['degur'][vv].items(): rez[j]=analyse2(s,d) NUL=(0,0,0,0,0,0,0) ee=[rez.get(j,NUL)[0]-rez.get(j,NUL)[3]+rez.get(j,NUL)[4] for j in cols] eeY.append(ee) self.t.insert(x,'end',text=m,values=[x or '-' for x in ee],tag=tag) eeY=[sum(x) for x in zip(*eeY)] self.t.insert(x,'end',text='итого',values=eeY,tag='Y')
def Mk_Book_display(book, name): w = book.page(name) disp = Frame(w) tree_columns = ('book_no', 'book_name', 'book_author', 'book_publisher', 'in_out_status') Entries=Treeview( disp, columns=tree_columns, show="headings" ) global_bucket['book_shelf'] = Entries vsb = Scrollbar ( disp, orient="vertical", command=Entries.yview) Entries.configure(yscrollcommand=vsb.set) for col,width in zip(tree_columns,(4,20,10,5,6)): Entries.heading(col, text=col.title(), anchor='w') Entries.column(col, width=1) vsb.pack(side=RIGHT,fill=Y) Entries.pack(fill=BOTH, expand=1) disp.pack(fill=BOTH, expand=1) update()
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
def _create_popwin(self, event): if self._r is not None: top = Toplevel() top.title("统计") # # tr = Treeview(top, columns=('kind','state')) tr = Treeview(top, show='headings', columns=('kind', 'state', 'count')) # ysb = Scrollbar(tr, orient='vertical', command=tr.yview) # tr.configure(yscroll=ysb.set) # ysb.pack() tr.column('kind', width = 100, anchor ='center') tr.column('state', width = 100, anchor ='center') tr.column('count', width = 100, anchor ='center') tr.heading('kind', text='车型') tr.heading('state', text='状态') tr.heading('count', text='总量') for l in self._r: _state = '' if l[1] == 1: _state = '未修改' elif l[1] == 2: _state = '轴数异常' elif l[1] == 3: _state = '已修改' tr.insert('',0, text='', values=(l[0], _state, l[2])) # tr.insert('',0,values=(l[0], _state, l[2])) tr.pack() button = Button(top, text="退出", command=top.destroy) button.pack() top.config(height=top.bbox(tr)[3]+100)
class TableView(Frame): OPTIONS = {'font': ('bold', 11)} def __init__(self, window, **kwargs): super().__init__(window, **kwargs) self.tree = Treeview(self, selectmode='browse') self.tree.column("#0", width=100, minwidth=75, stretch=NO) self.tree.heading("#0", text='row', anchor='center') self.scroll = Scrollbar(self, command=self.tree.yview) self.tree.config(yscrollcommand=self.scroll.set) self.scroll.pack(side=RIGHT, fill=Y) self.tree.pack(expand=True, side=LEFT, fill=BOTH) def create_columns(self, *columns): for column in columns: self.tree.column(f"{column}", width=150, minwidth=150, stretch=YES) def create_heading(self, *columns): for index, column in enumerate(columns): self.tree.heading(f"#{index+1}", text=f"{column}", anchor='center') def fill_row(self, *args): if args: self.tree.delete(*self.tree.get_children()) for index, contact in enumerate(args): self.tree.insert("", 'end', contact.id, text=f"{index+1}", values=list(contact.informations.values())) else: return
def sort_column(tree: ttk.Treeview, col: int, descending: bool): """ Sort tree contents when a column header is clicked on. :param tree: the root tree to sort :param col: the column of the tree to sort :param descending: If True sort in descending order, otherwise sort in ascending order """ data = [(tree.set(child, col), child) for child in tree.get_children('')] try_date = False try: data = [(float(d[0]), d[1]) for d in data] except ValueError: try_date = True if try_date: try: data = [(parser.parse(d[0]), d[1]) for d in data] except ValueError: pass data.sort(reverse=descending) for ix, item in enumerate(data): tree.move(item[1], '', ix) tree.heading(col, command=lambda c=col: sort_column(tree, c, not descending))
def create_blank() -> 'Treeview': fig = plt.Figure(figsize=(8, 4), dpi=100) ax = fig.add_subplot(111) ax.plot() ax.grid() canvas = FigureCanvasTkAgg(fig, master=graph_frame) canvas.draw() canvas.get_tk_widget().pack() toolbar = NavigationToolbar2Tk(canvas, graph_frame) toolbar.update() tree = Treeview(table_frame, columns=('num', 'start', 'end', 'root', 'itrs'), height=15) tree.column('#0', width=0, minwidth=0) tree.column('num', width=160, minwidth=160, anchor=CENTER) tree.column('start', width=160, minwidth=160, anchor=CENTER) tree.column('end', width=160, minwidth=160, anchor=CENTER) tree.column('root', width=160, minwidth=160, anchor=CENTER) tree.column('itrs', width=160, minwidth=160, anchor=CENTER) tree.heading('num', text='Root number', anchor=CENTER) tree.heading('start', text='Segment start', anchor=CENTER) tree.heading('end', text='Segment end', anchor=CENTER) tree.heading('root', text='Root X', anchor=CENTER) tree.heading('itrs', text='It-n number', anchor=CENTER) tree.pack() return tree
def CreateUI(self): self.frame1= Frame(self) self.frame2= Frame(self) from tkinter.ttk import Treeview tv = Treeview(self) tv['columns'] = ('Mobile', 'waiter', 'bill', 'status') tv.heading("#0", text='Customer Name', anchor='w') tv.column("#0", anchor="w") tv.heading('Mobile', text='Mobile') tv.column('Mobile', anchor='center', width=100) tv.heading('waiter', text='Waiter') tv.column('waiter', anchor='center', width=100) tv.heading('bill', text='Current Bill') tv.column('bill', anchor='center', width=100) tv.heading('status', text='Status') tv.column('status', anchor='center', width=100) tv.grid(sticky = (N, S, W, E)) self.frame1.treeview = tv self.frame1.grid_rowconfigure(0, weight = 1) self.frame1.grid_columnconfigure(0, weight = 1) self.frame2.grid(row = 0, column = 1, sticky = N) self.button = Button(self.frame2, text= "Add") self.button.grid(row = 0, column = 0) self.button1 = Button(self.frame2, text= "Modify") self.button1.grid(row = 1, column = 0) self.button2 = Button(self.frame2, text= "Delete") self.button2.grid(row = 2, column = 0) self.button3 = Button(self.frame2, text= "Delete All") self.button3.grid(row = 3, column = 0)
class SQLTableFrameQuery(Frame): def __init__(self, parent): super().__init__(parent) self.pack() def fill_values(self, fields, results): if hasattr(self, 'tree'): self.tree.pack_forget() self.tree.destroy() if hasattr(self, 'tree_scrollbar'): self.tree_scrollbar.destroy() del self.tree_scrollbar self.tree = Treeview(self, selectmode='extended', columns=fields) if len(results) >= 16 and not hasattr(self, 'tree_scrollbar'): self.tree_scrollbar = Scrollbar(self, orient='vertical', command=self.tree.yview) self.tree_scrollbar.pack(side='right', fill='y') self.tree.configure(yscrollcommand=self.tree_scrollbar.set) for idx, field in enumerate(fields): self.tree.heading(f'#{idx}', text=field) self.tree.column(f'#{idx}', minwidth=40, width=560//len(fields)) for idx, value in enumerate(results): try: self.tree.insert('', index='end', text=str(value[0]), values=value[1:]) except: print('Error with:', idx, value) self.tree.pack(expand=YES, fill=BOTH)
def open_records(self): top = Toplevel() top.title('记录') top.maxsize(600, 600) Label(top, text='欢迎使用人脸识别系统', width=35, height=2, bg='#56764C').grid(row=0, columnspan=2, sticky=W + E) columns = ('所选目标', '出现时间', '消失时间', '持续时间') tree = Treeview(top, show='headings', columns=columns) tree.column('所选目标', width=150, anchor='center') tree.column('出现时间', width=150, anchor='center') tree.column('消失时间', width=150, anchor='center') tree.column('持续时间', width=150, anchor='center') tree.heading('所选目标', text='所选目标') tree.heading('出现时间', text='出现时间') tree.heading('消失时间', text='消失时间') tree.heading('持续时间', text='持续时间') sql = "select * from records where aid = '%s'" % user.id ret = sql_conn(sql) for i in range(len(ret)): tree.insert('', i, values=(ret[i]['object_name'], ret[i]['appear'], ret[i]['disappear'], ret[i]['last_time'])) tree.grid(row=1, column=0, sticky=NSEW) scrollbar = Scrollbar(top) scrollbar.grid(row=1, column=1, sticky=NS) scrollbar.config(command=tree.yview)
def submit(tree2): roots = Tk() roots.geometry("920x570+100+50") roots.title("Billing") roots.config(bg="#ffe0b2") c = con.cursor() s = 0 for child in tree2.get_children(): s = s + tree2.item(child)["values"][1] totalSum.set(s) navbar2 = Frame(roots, bg="#212121", height=50, width=920) navbar2.place(x=0, y=0) outbtn = Button(navbar2, text="Back", font=("Noto sans", 12, "bold"), fg="#ffffff", bg="#c62828", relief="flat", command=roots.destroy) outbtn.place(x=830, y=5) tree3 = Treeview(roots, columns=('pname', 'pprice')) tree3.heading('pname', text='Product Name') tree3.heading('pprice', text='Price') tree3.column("pname", width=90) tree3.column("pprice", width=90) tree3.pack(side=LEFT, anchor=N, fill='x', expand=TRUE, pady=(90, 0)) tree3['show'] = 'headings' for data in tree2.get_children(): tree3.insert('', '0', values=(tree2.item(data)["values"])) buyButton = Button(roots, text="Buy", font=("Noto sans", 12, "bold"), fg="#ffffff", bg="#c62828", relief="flat", command=lambda: add_sales(roots)) buyButton.place(x=830, y=450) total_label = Label(roots, text="Total : ", font=("Noto sans", 12, "bold"), fg="#212121", bg="#ffe0b2") total_label.place(x=200, y=400) total_labelVal = Label(roots, text=totalSum.get(), font=("Noto sans", 12, "bold"), fg="#212121", bg="#ffe0b2") total_labelVal.place(x=260, y=400) roots.mainloop()
def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller back_btn=Button(self,text="Back",command=lambda:controller.show_frame(Main), width=30) subject_tree=Treeview( self, columns=('#1','#2','#3')) subject_tree.heading('#1',text='Sl No.') subject_tree.heading('#2',text='Subject Name') subject_tree.heading('#3',text='Subject Code') subject_tree.column('#1',stretch=YES,width=80) subject_tree.column('#2',stretch=YES,width=250) subject_tree.column('#3',stretch=YES,width=190) subject_tree['show']='headings' subject_list = see_subjects() for subject in subject_list: subject_tree.insert("",'end',values=subject) heading_label = Label(self, text="All Subjects List", font=MED_FONT) heading_label.grid(row=0, column=0, padx=10,pady=5,sticky="W") subject_tree.grid(row=1, column=0, padx=50, pady=10, columnspan=2, sticky='nsew') back_btn.grid(row=2, column=0, padx=180, pady=10, sticky="W")
def show_grammar(self): self.frame = Toplevel(self) self.frame.geometry("770x600") self.frame.title("Grammar") table_margin = Frame(self.frame, width=1000) table_margin.pack(side=LEFT) scrollbarx = Scrollbar(table_margin, orient=HORIZONTAL) scrollbary = Scrollbar(table_margin, orient=VERTICAL) tree = Treeview(table_margin, columns=("rule", "tokens"), height=400, selectmode="extended", yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) tree.heading('rule', text="rule", anchor=W) tree.heading('tokens', text="tokens", anchor=W) tree.column('#0', stretch=NO, minwidth=0, width=0) tree.column('#1', stretch=NO, minwidth=10, width=150) tree.column('#2', stretch=NO, minwidth=100, width=600) scrollbary.config(command=tree.yview) scrollbary.pack(side=RIGHT, fill=Y) scrollbarx.config(command=tree.xview) scrollbarx.pack(side=BOTTOM, fill=X) tree.pack() for key in self.bottom_up.grammar: rules = '' for variant in self.bottom_up.grammar[key]: rules += variant + ' | ' rules = rules[:-3] tree.insert("", "end", values=(key, rules))
def open_automatic_table(self, automatic_table): self.frame = Toplevel(self) self.frame.geometry("230x400") self.frame.title("Automatic machine") self.frame.resizable(False, False) table_margin = Frame(self.frame, width=500) table_margin.pack(side=LEFT) scrollbarx = Scrollbar(table_margin, orient=HORIZONTAL) scrollbary = Scrollbar(table_margin, orient=VERTICAL) tree = Treeview(table_margin, columns=("State", "Label", "Stack"), height=400, selectmode="extended", yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) scrollbary.config(command=tree.yview) scrollbary.pack(side=RIGHT, fill=Y) scrollbarx.config(command=tree.xview) scrollbarx.pack(side=BOTTOM, fill=X) tree.heading('State', text="State", anchor=W) tree.heading('Label', text="Label", anchor=W) tree.heading('Stack', text="Stack", anchor=W) tree.column('#0', stretch=NO, minwidth=0, width=0) tree.column('#1', stretch=NO, minwidth=0, width=70) tree.column('#2', stretch=NO, minwidth=0, width=70) tree.column('#3', stretch=NO, minwidth=0, width=70) tree.pack() for row in automatic_table: tree.insert("", "end", values=(row[0], row[1], row[2]))
def tokens_table(self, program_name): table_margin = Frame(self.frame, width=500) table_margin.pack(side=LEFT) scrollbarx = Scrollbar(table_margin, orient=HORIZONTAL) scrollbary = Scrollbar(table_margin, orient=VERTICAL) tree = Treeview(table_margin, columns=("Token number", "Line number", "Token", "IDN id", "CON id", "LAB id", "TOK id"), height=400, selectmode="extended", yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) scrollbary.config(command=tree.yview) scrollbary.pack(side=RIGHT, fill=Y) scrollbarx.config(command=tree.xview) scrollbarx.pack(side=BOTTOM, fill=X) tree.heading('Token number', text="Token number", anchor=W) tree.heading('Line number', text="Line number", anchor=W) tree.heading('Token', text="Token", anchor=W) tree.heading('IDN id', text="IDN id", anchor=W) tree.heading('CON id', text="CON id", anchor=W) tree.heading('LAB id', text="LAB id", anchor=W) tree.heading('TOK id', text="TOK id", anchor=W) tree.column('#0', stretch=NO, minwidth=0, width=0) tree.column('#1', stretch=NO, minwidth=0, width=90) tree.column('#2', stretch=NO, minwidth=0, width=80) tree.column('#3', stretch=NO, minwidth=0, width=110) tree.column('#4', stretch=NO, minwidth=0, width=50) tree.column('#5', stretch=NO, minwidth=0, width=50) tree.column('#6', stretch=NO, minwidth=0, width=50) tree.column('#7', stretch=NO, minwidth=0, width=50) tree.pack() with open("./results/" + program_name + "/tokens.csv", newline="") as file: reader = csv.reader(file) for row in reader: tree.insert("", "end", values=(row[0], row[1], row[2], row[3], row[4], row[5], row[6]))
def open_bottom_up_grammar_table(self): self.frame = Toplevel(self) self.frame.geometry("1300x700") self.frame.title("Bottom up table") table_margin = Frame(self.frame, width=1000) table_margin.pack(side=LEFT) scrollbarx = Scrollbar(table_margin, orient=HORIZONTAL) scrollbary = Scrollbar(table_margin, orient=VERTICAL) tree = Treeview(table_margin, height=400, selectmode="extended", yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) tree["columns"] = tuple(range(1, 68)) tree.column('#0', stretch=NO, minwidth=0, width=0) tree.heading(1, text="", anchor=W) tree.column(1, stretch=NO, minwidth=20, width=70) for i in range(2, 68): tree.heading(i, text=self.bottom_up.rules_array[i-1], anchor=W) tree.column(i, stretch=NO, minwidth=20, width=70) scrollbary.config(command=tree.yview) scrollbary.pack(side=RIGHT, fill=Y) scrollbarx.config(command=tree.xview) scrollbarx.pack(side=BOTTOM, fill=X) tree.pack() for row in self.bottom_up.bottom_up_grammar_table: tree.insert("", "end", values=row)
class _List(WidgetBase): def __init__(self, master, **options): super().__init__(master) from tkinter.ttk import Treeview self.widget = Treeview(self.master, show="tree", **options) self.widget.bind("<<TreeviewSelect>>", self.callback) self.value = () def set_header(self, column, text): self.widget.heading("#" + str(column), text=text) def add_item(self, parent="", index=0, id=None, label="", values=None, **options): if not id is None: options.update(iid=id) if not values is None: options.update(values=values) self.widget.insert(parent=parent, index=index, text=label, **options) def callback(self, event): self.value = self.widget.selection() def set_selection(self, items): self.value = items self.widget.selection_set(items) def exist_item(self, id): return self.widget.exists(id)
def __init__(self, data): Page.__init__(self) self.data = data print('>>>>>>>>>>>>>>>>>>>',self.data) from defuse import knap a,b=knap(data) print('>>>>>>>>>>>> a , b',a,b) label = tk.Label(self, text="The set of executable query plans:") tree = Treeview(self, columns=('Execution Cost','Response Time','Reputation','Results number')) tree.heading('#0', text='Data Services') tree.heading('#1', text='Execution Cost') tree.heading('#2', text='Response Time') tree.heading('#4', text='Results number') tree.heading('#3', text='Reputation') tree.column('#4',stretch=tk.YES) tree.column('#3', stretch=tk.YES) tree.column('#1', stretch=tk.YES) tree.column('#2', stretch=tk.YES) tree.column('#0', stretch=tk.YES) tree.grid(row=4, columnspan=6, sticky='nsew') tree.insert('', 'end', text = "Data_Servcie1", values=(b,"----",a,"--")) tree.pack() b1 = Button(self, text='Execute', cursor='exchange') b1.pack(side=RIGHT, padx=5, pady=5) b2 = Button(self, text='Select', cursor='exchange') b2.pack(side=RIGHT, padx=5, pady=5) b3 = Button(self, text='Confirm', cursor='exchange') b3.pack(side=RIGHT, padx=5, pady=5)
def loadTable(self, keyphraseDF, columns, searchResults): # TODO: make reusable for various df's self.keyphraseDF = keyphraseDF self.searchResults = searchResults tv = Treeview(self) tv['columns'] = columns tv.heading("#0", text='keyphrase_full') tv.column("#0", anchor="w", width=300) for column in tv['columns']: tv.heading(column, text=column, command=lambda _col=column: self.treeview_sort_column( tv, _col, True)) tv.column(column, anchor='center', width=100) tv.grid(sticky=(N, S, W, E)) self.treeview = tv self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) for (i, row) in self.keyphraseDF.iterrows(): self.treeview.insert('', 'end', text=row["keyphrase_full"], values=tuple(row[column] for column in columns)) self.treeview.bind("<Double-1>", self.onClick) self.treeview.bind("<Enter>", self.onEnter)
def showComment(self): self.show_comment_screen = Tk() self.show_comment_screen.title("comments") comments = mydb.showAllComments(self.shop_id) comments = list(dict.fromkeys(comments)) Label(self.show_comment_screen, text="All your Comments", bg="yellow", width="300", height="2", font=("Calibri", 13)).pack() Label(text="").pack() tree = Treeview(self.show_comment_screen, style="mystyle.Treeview") tree["columns"] = ("one") #set tree columns tree.column("#0", width=270, minwidth=270, stretch=tk.NO) tree.column("one", width=150, minwidth=150, stretch=tk.NO) #set tree's heading tree.heading("#0", text="Comment", anchor=tk.W) tree.heading("one", text="Rate", anchor=tk.W) for i in range(len(comments)): tree.insert("", 1, text=comments[i][4], values=(comments[i][5])) tree.pack(side=tk.TOP, fill=tk.X)
class SQLTableFrame(Frame): def __init__(self, parent, table_name, db): super().__init__(parent) self.table_name = table_name self.db = db self.grid() self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) self.create_widgets() def create_widgets(self): table_fields = tuple(self.db._tables[self.table_name]['fields']) data = self.db.read_table(self.table_name, table_fields) self.tree = Treeview(self, selectmode="extended", columns=table_fields) if len(data) >= 16: self.tree_scrollbar = Scrollbar(self, orient='vertical', command=self.tree.yview) self.tree_scrollbar.pack(side='right', fill='y') self.tree.configure(yscrollcommand=self.tree_scrollbar.set) self.tree.pack(expand=YES, fill=BOTH) self.tree.heading('#0', text='id') self.tree.column('#0', minwidth=40, width=40, stretch=NO) for idx, field in enumerate(table_fields): self.tree.heading(f'#{idx+1}', text=field) self.tree.column(f'#{idx+1}', minwidth=40, width=560//len(table_fields), stretch=YES) # tree.insert(parent -root if empty-, index -0-9 or end, iid -???, text -first, values -[1:]) for idx, value in enumerate(data): self.tree.insert('', index='end', text=idx+1, values=value[:])
def show_result(_sorted_r): show_window = Toplevel() show_window.title("Results") label = Label(show_window, text=query_label.get(), font=("Arial", 30)).grid(row=0, columnspan=3) # create Treeview with 3 columns cols = ('Rank', 'Title', 'Year', 'Artist', 'Genera') listBox = ttk.Treeview(show_window, columns=cols, show='headings', selectmode='browse') listBox = Treeview(show_window, columns=cols, show='headings') # set column headings for col in cols: listBox.heading(col, text=col) listBox.grid(row=1, column=0, columnspan=2) show_window.resizable(width=0, height=0) tyag = [] for doc in _sorted_r: full_hashed_address, hashed_path, restricted = get_hashed_directory(title_year_artist_genera_dir, str(doc), 255) with open(full_hashed_address, 'r') as file: for row in file: tyag = re.sub(r'"', ' ', row) tyag = tyag.split(",") break if len(tyag) == 3: listBox.insert("", "end", values=(_sorted_r.get(doc), tyag[0], tyag[1], tyag[2])) if len(tyag) == 4: listBox.insert("", "end", values=(_sorted_r.get(doc), tyag[0], tyag[1], tyag[2],tyag[3]))
def loadTableWindow2(self, secondWindowDF, columns, clicked_keyphrase): # TODO: make reusable for various df's self.secondWindowDF = secondWindowDF tv = Treeview(self) #tv['columns'] = columns tv.heading("#0", text='#') tv.column("#0", anchor="w", width=600) #for column in tv['columns']: # tv.heading(column, text=column) # tv.column(column, anchor='center', width=350) tv.grid(sticky=(N, S, W, E)) self.treeview = tv self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) for (i, row) in self.secondWindowDF.iterrows(): #print(clicked_keyphrase) #print(row["body"]) highlighted_text = highlight(keyphrase=clicked_keyphrase, text=row['body'], words=5) self.treeview.insert('', 'end', text=str(i) + " " + highlighted_text) self.treeview.bind("<Double-1>", self.onClick2)
def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller for count in range(0, 10): Grid.rowconfigure(self, count, weight=1) Grid.columnconfigure(self, count, weight=1) # Paths subsection of settings page treeview + scrollbar + label + two buttons tv = Treeview(self) self.paths_tree_view = tv tv.grid(row=1, column=0, rowspan=3, columnspan=10, sticky=(N, E, W, S)) tv['columns'] = 'Source' tv.heading('#0', text="Path") tv.heading('Source', text="Source") tv.column("#0", anchor='w', minwidth=200) tv.column('Source', width=100, minwidth=50) paths_label = Label(self, text="PATHS OF YOUR GAME LIBRARY", font=('Fixedsys', 16)) paths_label.grid(row=0, column=0, columnspan=10, sticky=N + S + E + W) # TODO: Make these buttons do stuff? :D add_button = Button(self, text="Add", command=None) add_button.grid(row=4, column=8, sticky=N + S + E + W) remove_button = Button(self, text="Remove", command=None) remove_button.grid(row=4, column=9, sticky=N + S + E + W) ysb = Scrollbar(self, orient='vertical', command=tv.yview) tv.configure(yscroll=ysb.set) ysb.grid(row=1, column=9, rowspan=3, sticky='nse') # Video subsection video_label = Label(self, text='Video settings', font=('Courier', 14)) video_label.grid(row=4, column=0, columnspan=2, sticky=N + S + E + W) video_label_w = Label(self, text='Width', font=('Courier', 11)) video_label_w.grid(row=6, column=0, sticky=N + S + E + W) video_label_h = Label(self, text='Height', font=('Courier', 11)) video_label_h.grid(row=7, column=0, sticky=N + S + E + W) width_entry = Entry(self, text='Default width', font=('Courier', 11)) width_entry.grid(row=6, column=2, sticky=N + S + E + W) height_entry = Entry(self, text='Default height', font=('Courier', 11)) height_entry.grid(row=7, column=2, sticky=N + S + E + W) # Buttons for the rest save_button = Button(self, text="Save", command=None) save_button.grid(row=10, column=8, sticky=N + S + E + W) cancel_button = Button(self, text="Cancel", command=lambda: controller.show_frame(MainPage)) cancel_button.grid(row=10, column=9, sticky=N + S + E + W)
def extraire_caracs(self): try: m=im #Si im ou im_seg n'est pas définie (on n'a pas encore ouvert d'image ou pas encore segmentée l'image ouverte, on aura un NameError d'où un message de précaution de notre part n=im_seg scores = Tk() #on va afficher une nouvelle fenêtre qui contiendra les résultats. scores.title('Extraction des caractéristiques') style = Style(scores) style.configure('Treeview', rowheight=40) #Permet de changer la taille du tableau qu'on va créer, ainsi que la police d'écriture style.configure('Treeview', font=(None, 15)) style.configure('Treeview.Heading', font=(None, 18, 'bold')) cols = ('Caractéristiques', 'Scores') listBox = Treeview(scores, height=7, columns=cols, show='headings') #Le tableau est un Treeview for col in cols: listBox.heading(col, text=col) #on regle les titres des colonnes du tableau et leur taille listBox.column(col, width=int(1/6*GetSystemMetrics(0))) listBox.grid(row=0, column=0, columnspan=2) L=extraction_classification.ABCDbis(filepath,255*im_seg) #les résultats de l'extraction des caractéristiques A1,A2,B1,B2,C=L[0] global results results = [['',''],['A1 - Assymetry 1',str(A1)], ['A2 - Assymetry 2',str(A2)],['B1 - Borders 1',str(B1)], ['B2 - Borders 2',str(B2)], ['C - Colors' , str(C)]] listDiag=extraction_classification.diagnostic(L) global lis lis=[] for x in listDiag: if x: lis.append('Malin') else: lis.append('Bénin') for i in range(len(results)): listBox.insert("", "end", values=(results[i][0], results[i][1])) #on insère les caractéristiques extraites dans le tableau Label(scores, text="Linear Discriminant Analysis", font=("Helvetica 16 bold"), justify=LEFT).grid(row=1, columnspan=1,sticky=W) #on donne les résultats de classification selon différentes méthodes Label(scores, text=lis[0], font=("Helvetica 16"), justify=LEFT).grid(row=1, column=1,sticky=W) Label(scores, text="Quadratic Discriminant Analysis", font=("Helvetica 16 bold"), justify=LEFT).grid(row=2, columnspan=1,sticky=W) Label(scores, text=lis[1], font=("Helvetica 16"), justify=LEFT).grid(row=2, column=1,sticky=W) Label(scores, text="Naive Bayes", font=("Helvetica 16 bold"),justify=LEFT).grid(row=3, columnspan=1,sticky=W) Label(scores, text=lis[2], font=("Helvetica 16"), justify=LEFT).grid(row=3, column=1,sticky=W) #Label(scores, text="K-NearestNeighbours", font=("Helvetica 16 bold"), justify=LEFT).grid(row=4, columnspan=1,sticky=W) #Label(scores, text="Malin", font=("Helvetica 16"), justify=LEFT).grid(row=4, column=1,sticky=W) Label(scores, text="Logistic Regression", font=("Helvetica 16 bold"), justify=LEFT).grid(row=4, columnspan=1,sticky=W) Label(scores, text=lis[3], font=("Helvetica 16"), justify=LEFT).grid(row=4, column=1,sticky=W) scores.mainloop() scores.destroy() except NameError: im_exists = 'im' in locals() or 'im' in globals() im_seg_exists = 'im_seg' in locals() or 'im_seg' in globals() if not im_exists: #ce sont des messages de précaution si aucune image n'a encore été ouverte et qu'on appuie sur le bouton de segmentation ou si on veut extraire les caracs et que la segmentation n'a pas encore été faite showerror(title="Erreur", message="Vous n'avez pas ouvert d'image.", default=OK, icon=ERROR) elif not im_seg_exists: showerror(title="Erreur", message="Vous n'avez pas encore effectué la segmentation.", default=OK, icon=ERROR)
def leaderboard_window(window, Gamer_name): global leaderboard for widget in window.winfo_children(): widget.destroy() frame = Frame(window) frame.grid(row=1, column=1) frame.grid_columnconfigure(0, weight=1) frame.grid_rowconfigure(0, weight=1) t = threading.Thread(target=getleaderboard) t.start() message1 = Label(frame, text='Please Wait...', fg='black', font='Ariel 16 bold') message1.grid(row=0, column=0, pady=(5, 5)) progress = Progressbar(frame, orient=HORIZONTAL, length=100, mode='indeterminate') progress.grid(row=1, column=0, pady=(5, 5)) bar(progress, frame) listt = frame.grid_slaves() for l in listt: l.destroy() name = Label(frame, text='Leaderboard', fg='black', font='Ariel 16 bold') name.grid(row=0, column=0, pady=(10, 10)) i = 1 for key in leaderboard.keys(): i += 1 name1 = Label(frame, text=key, fg='black', font='Ariel 10 bold') name1.grid(row=i, column=0, pady=(5, 5)) tv = Treeview(frame, height=len(leaderboard[key]) - 1) tv['columns'] = (leaderboard[key][0][1]) tv.heading("#0", text=leaderboard[key][0][0]) tv.column("#0", anchor="center", width=100) tv.heading(leaderboard[key][0][1], text=leaderboard[key][0][1]) tv.column(leaderboard[key][0][1], anchor='center', width=100) tv.grid(sticky=(N, S)) treeview = tv for j in range(len(leaderboard[key]) - 1): j += 1 treeview.insert('', 'end', text=leaderboard[key][j][0], values=(leaderboard[key][j][1])) i += 1 treeview.grid(row=i, column=0, pady=(10, 10)) bottonEasy = Button(frame, text='Go back', bg="green", fg="white", font='Ariel 12 bold', command=lambda: start(window, Gamer_name)) bottonEasy.grid(row=i + 1, column=0, pady=(5, 5))
def preparingOrders(self): self.prepare_screen = Tk() self.prepare_screen.title("Preparing") all_history = mydb.showActiveOrder(self.shop_id) print(all_history) Label(self.prepare_screen, text="All your orders", bg="yellow", width="300", height="2", font=("Calibri", 13)).pack() Label(text="").pack() tree = Treeview(self.prepare_screen, style="mystyle.Treeview") tree["columns"] = ("one", "two", "three", "four") #set tree columns tree.column("#0", width=270, minwidth=270, stretch=tk.NO) tree.column("one", width=150, minwidth=150, stretch=tk.NO) tree.column("two", width=400, minwidth=200) tree.column("three", width=80, minwidth=50, stretch=tk.YES) tree.column("four", width=80, minwidth=50, stretch=tk.YES) #set tree's heading tree.heading("#0", text="Order#", anchor=tk.W) tree.heading("one", text="Total Price", anchor=tk.W) tree.heading("two", text="Address", anchor=tk.W) tree.heading("three", text="Status", anchor=tk.W) tree.heading("four", text="Foods", anchor=tk.W) invoic_dict = {} print(all_history) for history in all_history: if ((history[0], history[1], history[2], history[4]) in invoic_dict.keys()): invoic_dict[(history[0], history[1], history[2], history[4])].append(history[3]) else: invoic_dict[(history[0], history[1], history[2], history[4])] = [] invoic_dict[(history[0], history[1], history[2], history[4])].append(history[3]) # print (type(list(invoic_dict.keys()))) print(invoic_dict) tree.pack(side=tk.TOP, fill=tk.X) orders_list = [] for key in invoic_dict.keys(): orders_list.append(key[0]) for i in range(len(list(invoic_dict.keys()))): order_number = list(invoic_dict.keys())[i][0] address_id = list(invoic_dict.keys())[i][2] foods_list = invoic_dict[list(invoic_dict.keys())[i]] print(foods_list) tree.insert("", i + 1, text="Order#" + str(order_number), values=(list(invoic_dict.keys())[i][1], self.make_address_str(address_id), list(invoic_dict.keys())[i][3], self.make_foods_str(foods_list))) tree.bind("<Double-1>", partial(self.OnDoubleClickChangeStatus, tree))
def load_pins(self, master, pinref): pins_tree = Treeview(master) pins_tree.pack(fill=BOTH, expand=True) pins_tree.heading('#0', text=(next(iter(self.pins)), ' PinType: ', self.pins.get(pinref).get('pintype'))) for p in self.pins.get(pinref).get('pins'): pins_tree.insert('', 'end', p, text=p)
class PopupFrameView(Toplevel): # СОРТИРОВКА ФИЛЬМОВ; def __init__(self, x, y, *data): super().__init__() self.x = x self.y = y self.vr = data self.init_frame() self.db = db self.view = appl self.view_record() def init_frame(self): self.title('Просмотр записей') self.geometry('440x392+%d+%d' % (self.x + 180, self.y + 65)) self.resizable(False, False) # НИЖНЯЯ ПАНЕЛЬ для КОЛИЧЕСТВА ЗАПИСЕЙ; TB_BOT = Frame(self, bg='#EDF0F5', bd=1) TB_BOT.pack(side=BOTTOM, fill=X) # ВЫВОД КОЛИЧЕСТВА ЗАПИСЕЙ на НИЖНЮЮ ПАНЕЛЬ; self.count = Label(TB_BOT, background='#EDF0F5', foreground='#425370') self.count.pack() _yscroll_ = Scrollbar(self) self.tree = Treeview(self, columns=('id', 'name'), height=18, show='headings', yscrollcommand=_yscroll_.set) _yscroll_.config(command=self.tree.yview) self.tree.column('id', width=50, anchor=CENTER) self.tree.column('name', width=370) self.tree.heading('id', text='№') self.tree.heading('name', text='Название') _yscroll_.pack(side=RIGHT, fill=Y) self.tree.pack() self.tree.bind('<Button-1>', lambda event: 'break' if self.tree.identify_region(event.x, event.y) == 'separator' else None) # УДЕРЖИВАЕМ НАШЕ ДИАЛОГОВОЕ ОКНО 'НА ВЕРХУ'; self.grab_set() self.focus_set() def view_record(self): # ПРОСМОТР ОТСОРТИРОВАННЫХ ДАННЫХ; num = 0 if (self.vr[0][0] != '' and self.vr[0][1] == '' and self.vr[0][2] == ''): self.db.c.execute(''' SELECT id, name FROM films WHERE mors=? ''', (self.vr[0][0], )) if (self.vr[0][0] == '' and self.vr[0][1] != '' and self.vr[0][2] == ''): self.db.c.execute(''' SELECT id, name FROM films WHERE janr=? ''', (self.vr[0][1], )) if (self.vr[0][0] == '' and self.vr[0][1] == '' and self.vr[0][2] != ''): self.db.c.execute(''' SELECT id, name FROM films WHERE flag=? ''', (self.vr[0][2], )) if (self.vr[0][0] != '' and self.vr[0][1] != '' and self.vr[0][2] != ''): self.db.c.execute(''' SELECT id, name FROM films WHERE mors=? AND janr=? AND flag=? ''', (self.vr[0][0], self.vr[0][1], self.vr[0][2])) [ self.tree.delete(i) for i in self.tree.get_children() ] for row in self.db.c.fetchall(): [ self.tree.insert('', 'end', values=row) ] num += 1 self.count['text'] = 'Количество записей: %d' % num
def show_dic_command(self): if self.dictionary_in_main_memory == False: messagebox.showwarning( "Error", "first, load dictionary to your main memory.\ndon't look at me like this! just do it with the Load Dictionary button\nif you have some time, you can also start the program and after it will be finished, you will be able to show dictionary" ) else: text_of_waiting = Label( self.bottomFrame, text= "Please Wait.. the dictionary will be shown in 10-20 seconds") text_of_waiting.grid(row=0, column=1) self.window.update() self.dictionaryWindow = Toplevel(self.window) self.dictionaryWindow.geometry("400x600") self.dictionaryWindow.title("Main Dictionary") self.dictionaryWindow.resizable(False, False) tree = Treeview(self.dictionaryWindow, selectmode="extended", columns=("term", "tf")) style = ttk.Style() style.configure("Treeview.Heading", background='lavender') tree.pack(expand=YES, fill=BOTH) tree['show'] = 'headings' tree.column("#0", minwidth=10, width=20, stretch=NO) tree.heading("term", text="Term") tree.column("term", minwidth=250, width=200, stretch=NO) tree.heading("tf", text="Frequency in corpus") tree.column("tf", minwidth=180, width=180, stretch=NO) scrollbar = ttk.Scrollbar(self.dictionaryWindow, orient="vertical", command=tree.yview) scrollbar.place(x=380, y=0, height=600) tree.configure(yscrollcommand=scrollbar.set) main_dictionary_pointer = Controller.getMainDictionaryFromIndexerToGUI( ) sorted_main_dictionary = dict( sorted(main_dictionary_pointer.items())) odd = 'odd' even = 'even' i = 0 for key in sorted_main_dictionary: term = key tf = str(sorted_main_dictionary[key].tf_in_corpus) if i % 2 == 0: tag = odd else: tag = even tree.insert('', 'end', values=(term, tf), tags=(tag, )) i = i + 1 tree.tag_configure(odd, background='gold') tree.tag_configure(even, background='deep sky blue') tree.pack() text_of_waiting.grid_remove()
def Student_Main(self, un): global Student_Frame username = un def get_results(lis, uname): """linear search algorithm""" l = [] for i in lis: for j in i: if j == uname: y = (i[-2], i[-1]) l.append(y) return l # start = 0 # end = len(lis) - 1 # while start <= end: # mid = (start + end) // 2 # if list[mid][0] == uname: # return mid # elif list[mid][0] > uname: # end = mid - 1 # else: # start = mid + 1 # return -1 def update(): children = Tree.get_children() for i in children: Tree.delete(i) x = DBMS_Connection() ls = x.show_result() for i in get_results(ls, username): Tree.insert('', 'end', values=i) Student_Frame = Frame(self.root) Student_Frame.pack(expand=1, fill=BOTH) Label(Student_Frame, text=f'Welcome {username}').pack() student_wrapper = LabelFrame(Student_Frame) student_wrapper.pack() Tree = Treeview(student_wrapper, columns=(1, 2), show='headings', height='10') Tree.pack() Tree.heading(1, text='subject') Tree.heading(2, text='marks') Button( Student_Frame, text="Done", command=lambda: Navigate(Student_Frame, self.Main_Page())).pack() update()
class DeviceToFrame(CopilotInnerFrame): def __init__(self, master, config, state): super(DeviceToFrame, self).__init__(master, config) self._state = state if self._state.action == 'copy': self._frame_lbl['text'] = 'Copy To Directory' elif self._state.action == 'delete': self._frame_lbl['text'] = 'Delete From Directory' self._next_btn['command'] = self._next_cmd self._tree = Treeview(self._master, columns=('size')) self._tree.heading('size', text='Size') self._tree.grid(row=1, column=0, columnspan=3, sticky='nsew') self._tree.configure(yscrollcommand=self._sb.set) self._sb['command'] = self._tree.yview self._item_paths = {} self._populate_tree(self._state.to_device.part().mount()) def _next_cmd(self): cur_item = self._tree.focus() cur_path = self._item_paths.get(cur_item, '') if cur_path != '': self._state.device_to_path = cur_path self._new_state_window(CopyFileFrame, self._state) def _populate_tree(self, tree_root): self._item_paths = {} def insert_path(tree, path, parent_id): dirs = [e for e in scandir(path) if e.is_dir()] dirs.sort(key=lambda e: e.name) for d in dirs: dir_name = d.name dir_id = '{}-{}'.format(parent_id, dir_name) dir_path = os.path.join(path, dir_name) tree.insert(parent_id, 'end', dir_id, text=dir_name, tags=('dir')) self._item_paths[dir_id] = dir_path try: insert_path(tree, dir_path, dir_id) except: pass insert_path(self._tree, tree_root, '') tree = self._tree tree.tag_configure('dir', font=self._config.item_font) tree.tag_configure('file', font=self._config.item_font) tree.tag_configure('file_odd', background='light grey')
def CreateUI(self, classInstance): self.headers = [ "Customers", "Inter-arrival time", "Arrival time", "Service time", "Waiting time in queue", "Time when service begins", "Time when service ends", "Time customer spends in system", "Idle time of server" ] self.contents =[] # populates the table from other class to generate the tkinter table def compilelist(classInstance): self.contents.append(classInstance.intarrival()) self.contents.append(classInstance.arrival()) self.contents.append(classInstance.service()) self.contents.append(classInstance.queuewait()) self.contents.append(classInstance.servbegin()) self.contents.append(classInstance.servend()) self.contents.append(classInstance.custspend()) self.contents.append(classInstance.idle()) return self.contents # Calling the function compilelist(classInstance) self.rearrange = [] for row in zip(*self.contents): self.rearrange.append(row) self.headdata = [] for x in range(len(self.contents[0])): self.headdata.append(x+1) header_lists = [] tv = Treeview(self) tv['columns'] = (self.headers) for x in range(len(self.headers)): tv.heading("#%s"%x, text=self.headers[x], anchor='center') tv.column ("#%s"%x, anchor='center', width="150") tv.grid(sticky = (N,S,W,E)) self.treeview = tv self.grid_rowconfigure(0, weight = 1) self.grid_columnconfigure(0, weight = 1)
class Table(Frame): def __init__(self, parent, title, columns): Frame.__init__(self, parent) self.pack(expand=YES, fill=BOTH) self.title_lbl = Label(self, text=title, font=GENERAL_FONT) self.table_tree = Treeview(self, columns=columns) # добавить Scrollbar self.scroll = Scroll(self, orient=VERTICAL, command=self.table_tree.yview) self.table_tree['yscroll'] = self.scroll.set for i in range(len(columns)): self.table_tree.heading(columns[i], text=columns[i]) self.place_widgets() def place_widgets(self): self.title_lbl.pack(side=TOP, fill=X, expand=YES) self.table_tree.pack(side=LEFT, fill=BOTH, expand=YES) self.scroll.pack(side=RIGHT, fill=Y, expand=YES)
def Mk_Status_display(book, name): w = book.page(name) disp = Frame(w) tree_columns = ('book_no', 'book_name', 'date', 'staff_id', 'staff_name', 'note') Entries=Treeview( disp, columns=tree_columns, show="headings", ) global_bucket['status_register'] = Entries vsb = Scrollbar ( disp, orient="vertical", command=Entries.yview) Entries.configure(yscrollcommand=vsb.set) for col in tree_columns: Entries.heading(col, text=col.title(), anchor='w') Entries.column(col, width=0) vsb.pack(side=RIGHT,fill=Y) Entries.pack(fill=BOTH, expand=1) disp.pack(fill=BOTH, expand=1) update()
def calender(w): global year, mon date_bg = "white" date_fg = "black" date_fgb = "blue" date_bgt = "white" date_fgt = "red" day_bg = "orange" day_fg = "white" mon_bg = "violet" mon_fg = "white" Magic_Sequence = "2345012356013456123460124560" month = { "jan": 0, "feb": 8, "mar": 25, "apr": 5, "may": 1, "jun": 9, "jul": 5, "aug": 13, "sep": 21, "oct": 17, "nov": 25, "dec": 21, } months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"] day = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"] # ~ current year and month now = ctime().split() year = int(now[4]) mon = now[1].lower() date = int(now[2]) def Cal_config(modify=False): global year, mon mon_limit = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] now = ctime().split() cyear = int(now[4]) cmon = now[1].lower() cdate = int(now[2]) if modify == "go": year, mon = int(y.entry.get()), m.entry.get() elif modify: if months.index(mon) + modify > 11: year, mon = year + 1, "jan" elif months.index(mon) + modify < 0: year, mon = year - 1, "dec" else: mon = months[months.index(mon) + modify] monl.config(text="%s - %d" % (mon.title(), year)) if not year % 4: mon_limit[1] = 29 # Leap year Check year_id = (year + 3) % 28 Required_Sequence = Magic_Sequence[month[mon] :] + Magic_Sequence[: month[mon]] addition_factor = int(Required_Sequence[year_id]) notes = CalLookUp(mon) d = 1 for i in range(37): if i < addition_factor or d > mon_limit[months.index(mon)]: # blank positions datebuttons[i].config(text="", bg=date_bg, activebackground=date_bg) else: # positions with date bc, fc = date_bg, date_fg bracket = 0 if year == cyear and mon == cmon and d == cdate: bc, fc, bracket = date_bgt, date_fgt, 1 if "%0.2d" % (d) in notes: fc = date_fgb datebuttons[i].config( text="%s%0.2d%s" % ("(" * bracket, d, ")" * bracket), bg=bc, fg=fc, activebackground="yellow", activeforeground="black", ) d += 1 for each_item in Entries.get_children(): Entries.delete(each_item) ordered = [] for memo in notes: ordered.append(memo) ordered.sort() for memo in ordered: for note in notes[memo]: Entries.insert("", "end", values=(memo, note[0], note[1])) print("Cal configured to", mon, year) # ~ main calender frame pane = tkinter.tix.PanedWindow(w, orientation="vertical") pane.pack(side=tkinter.tix.TOP, fill=BOTH) f1 = pane.add("top", size=190, expand="0", allowresize=0) f2 = pane.add("info", expand="0", allowresize=0) f1pane = tkinter.tix.PanedWindow(f1, orientation="horizontal") f1pane.pack(side=tkinter.tix.TOP, fill=BOTH) f1f1 = f1pane.add("calender", size=200, allowresize=0) f1f2 = f1pane.add("options", allowresize=0) # ~ month heading calhead = Frame(f1f1, bg=date_bg) back = Button( calhead, text="<<<", width=5, bg=date_bg, activebackground="red", activeforeground="white", borderwidth=0, command=lambda modify=-1: Cal_config(modify), ) monl = Label(calhead, width=15, bg=mon_bg, fg=mon_fg) next = Button( calhead, text=">>>", width=5, bg=date_bg, activebackground="red", activeforeground="white", borderwidth=0, command=lambda modify=1: Cal_config(modify), ) back.pack(side=LEFT) monl.pack(side=LEFT, padx=10) next.pack(side=LEFT) calhead.pack(fill=X) # ~ day lables DayFrame = Frame(f1f1, bg=day_bg) daylabels = [] for i in range(7): daylabels.append(Label(DayFrame, text=day[i], width=3, bg=day_bg, fg=day_fg)) daylabels[i].pack(side=LEFT, padx=2) DayFrame.pack(fill=X) # ~ date buttons datebuttons = [] dfl = [] for i in range(6): dfl.append(Frame(f1f1, bg=date_bg)) dfl[i].pack(fill=X) j = 0 for i in range(37): datebuttons.append(Button(dfl[j], width=3, borderwidth=0)) datebuttons[i].pack(side=LEFT, padx=2) if not (i + 1) % 7: j += 1 # ~ information frame mem = Label(f2, text="Memos :") disp_frame = tkinter.Frame(f2) tree_columns = ("Date", "Note", "Category") Entries = Treeview(disp_frame, columns=tree_columns, show="headings", height=5) vsb = Scrollbar(disp_frame, orient="vertical", command=Entries.yview) Entries.configure(yscrollcommand=vsb.set) for col in tree_columns: Entries.heading(col, text=col.title()) Entries.column("Date", width=50) Entries.column("Note", width=150) Entries.column("Category", width=100) vsb.pack(side=RIGHT, fill=Y) Entries.pack(fill=BOTH) mem.pack(fill=X) disp_frame.pack(fill=BOTH) # ~ option frame L = Label(f1f2, text="More Options:") view = Frame(f1f2) y = ComboBox(view, editable=1) y.entry.config(width=5) y.entry.insert(0, year) m = ComboBox(view, editable=1) m.entry.config(width=4) m.entry.insert(0, mon) go = Button(f1f2, text="<<< Go", command=lambda modify="go": Cal_config(modify)) for i in range(200): y.insert(END, "%d" % (i + 1901)) for i in months: m.insert(END, i) y.pack(side=LEFT) m.pack() L.pack(fill=X) view.pack(fill=X) go.pack(fill=X) # ~ first config Cal_config()
class DialogPluginManager(Toplevel): def __init__(self, mainWin, modulesWithNewerFileDates): super(DialogPluginManager, self).__init__(mainWin.parent) self.ENABLE = _("Enable") self.DISABLE = _("Disable") self.parent = mainWin.parent self.cntlr = mainWin # copy plugins for temporary display self.pluginConfig = PluginManager.pluginConfig self.pluginConfigChanged = False self.uiClassMethodsChanged = False self.modulesWithNewerFileDates = modulesWithNewerFileDates parentGeometry = re.match("(\d+)x(\d+)[+]?([-]?\d+)[+]?([-]?\d+)", self.parent.geometry()) dialogX = int(parentGeometry.group(3)) dialogY = int(parentGeometry.group(4)) self.title(_("Plug-in Manager")) frame = Frame(self) # left button frame buttonFrame = Frame(frame, width=40) buttonFrame.columnconfigure(0, weight=1) addLabel = Label(buttonFrame, text=_("Find plug-in modules:"), wraplength=60, justify="center") addLocalButton = Button(buttonFrame, text=_("Locally"), command=self.findLocally) ToolTip(addLocalButton, text=_("File chooser allows selecting python module files to add (or reload) plug-ins, from the local file system."), wraplength=240) addWebButton = Button(buttonFrame, text=_("On Web"), command=self.findOnWeb) ToolTip(addWebButton, text=_("Dialog to enter URL full path to load (or reload) plug-ins, from the web or local file system."), wraplength=240) addLabel.grid(row=0, column=0, pady=4) addLocalButton.grid(row=1, column=0, pady=4) addWebButton.grid(row=2, column=0, pady=4) buttonFrame.grid(row=0, column=0, rowspan=2, sticky=(N, S, W), padx=3, pady=3) # right tree frame (plugins already known to arelle) modulesFrame = Frame(frame, width=700) vScrollbar = Scrollbar(modulesFrame, orient=VERTICAL) hScrollbar = Scrollbar(modulesFrame, orient=HORIZONTAL) self.modulesView = Treeview(modulesFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=7) self.modulesView.grid(row=0, column=0, sticky=(N, S, E, W)) self.modulesView.bind('<<TreeviewSelect>>', self.moduleSelect) hScrollbar["command"] = self.modulesView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.modulesView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) modulesFrame.columnconfigure(0, weight=1) modulesFrame.rowconfigure(0, weight=1) modulesFrame.grid(row=0, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.modulesView.focus_set() self.modulesView.column("#0", width=120, anchor="w") self.modulesView.heading("#0", text=_("Name")) self.modulesView["columns"] = ("author", "ver", "status", "date", "update", "descr", "license") self.modulesView.column("author", width=100, anchor="w", stretch=False) self.modulesView.heading("author", text=_("Author")) self.modulesView.column("ver", width=50, anchor="w", stretch=False) self.modulesView.heading("ver", text=_("Version")) self.modulesView.column("status", width=50, anchor="w", stretch=False) self.modulesView.heading("status", text=_("Status")) self.modulesView.column("date", width=70, anchor="w", stretch=False) self.modulesView.heading("date", text=_("File Date")) self.modulesView.column("update", width=50, anchor="w", stretch=False) self.modulesView.heading("update", text=_("Update")) self.modulesView.column("descr", width=200, anchor="w", stretch=False) self.modulesView.heading("descr", text=_("Description")) self.modulesView.column("license", width=70, anchor="w", stretch=False) self.modulesView.heading("license", text=_("License")) classesFrame = Frame(frame) vScrollbar = Scrollbar(classesFrame, orient=VERTICAL) hScrollbar = Scrollbar(classesFrame, orient=HORIZONTAL) self.classesView = Treeview(classesFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=5) self.classesView.grid(row=0, column=0, sticky=(N, S, E, W)) hScrollbar["command"] = self.classesView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.classesView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) classesFrame.columnconfigure(0, weight=1) classesFrame.rowconfigure(0, weight=1) classesFrame.grid(row=1, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.classesView.focus_set() self.classesView.column("#0", width=200, anchor="w") self.classesView.heading("#0", text=_("Class")) self.classesView["columns"] = ("modules") self.classesView.column("modules", width=500, anchor="w", stretch=False) self.classesView.heading("modules", text=_("Modules")) # bottom frame module info details moduleInfoFrame = Frame(frame, width=700) moduleInfoFrame.columnconfigure(1, weight=1) self.moduleNameLabel = Label(moduleInfoFrame, wraplength=600, justify="left", font=font.Font(family='Helvetica', size=12, weight='bold')) self.moduleNameLabel.grid(row=0, column=0, columnspan=4, sticky=W) self.moduleAuthorHdr = Label(moduleInfoFrame, text=_("author:"), state=DISABLED) self.moduleAuthorHdr.grid(row=1, column=0, sticky=W) self.moduleAuthorLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleAuthorLabel.grid(row=1, column=1, columnspan=3, sticky=W) self.moduleDescrHdr = Label(moduleInfoFrame, text=_("description:"), state=DISABLED) self.moduleDescrHdr.grid(row=2, column=0, sticky=W) self.moduleDescrLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleDescrLabel.grid(row=2, column=1, columnspan=3, sticky=W) self.moduleClassesHdr = Label(moduleInfoFrame, text=_("classes:"), state=DISABLED) self.moduleClassesHdr.grid(row=3, column=0, sticky=W) self.moduleClassesLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleClassesLabel.grid(row=3, column=1, columnspan=3, sticky=W) ToolTip(self.moduleClassesLabel, text=_("List of classes that this plug-in handles."), wraplength=240) self.moduleUrlHdr = Label(moduleInfoFrame, text=_("URL:"), state=DISABLED) self.moduleUrlHdr.grid(row=4, column=0, sticky=W) self.moduleUrlLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleUrlLabel.grid(row=4, column=1, columnspan=3, sticky=W) ToolTip(self.moduleUrlLabel, text=_("URL of plug-in module (local file path or web loaded file)."), wraplength=240) self.moduleDateHdr = Label(moduleInfoFrame, text=_("date:"), state=DISABLED) self.moduleDateHdr.grid(row=5, column=0, sticky=W) self.moduleDateLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleDateLabel.grid(row=5, column=1, columnspan=3, sticky=W) ToolTip(self.moduleDateLabel, text=_("Date of currently loaded module file (with parenthetical node when an update is available)."), wraplength=240) self.moduleLicenseHdr = Label(moduleInfoFrame, text=_("license:"), state=DISABLED) self.moduleLicenseHdr.grid(row=6, column=0, sticky=W) self.moduleLicenseLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleLicenseLabel.grid(row=6, column=1, columnspan=3, sticky=W) self.moduleEnableButton = Button(moduleInfoFrame, text=self.ENABLE, state=DISABLED, command=self.moduleEnable) ToolTip(self.moduleEnableButton, text=_("Enable/disable plug in."), wraplength=240) self.moduleEnableButton.grid(row=7, column=1, sticky=E) self.moduleReloadButton = Button(moduleInfoFrame, text=_("Reload"), state=DISABLED, command=self.moduleReload) ToolTip(self.moduleReloadButton, text=_("Reload/update plug in."), wraplength=240) self.moduleReloadButton.grid(row=7, column=2, sticky=E) self.moduleRemoveButton = Button(moduleInfoFrame, text=_("Remove"), state=DISABLED, command=self.moduleRemove) ToolTip(self.moduleRemoveButton, text=_("Remove plug in from plug in table (does not erase the plug in's file)."), wraplength=240) self.moduleRemoveButton.grid(row=7, column=3, sticky=E) moduleInfoFrame.grid(row=2, column=0, columnspan=5, sticky=(N, S, E, W), padx=3, pady=3) moduleInfoFrame.config(borderwidth=4, relief="groove") okButton = Button(frame, text=_("Close"), command=self.ok) ToolTip(okButton, text=_("Accept and changes (if any) and close dialog."), wraplength=240) cancelButton = Button(frame, text=_("Cancel"), command=self.close) ToolTip(cancelButton, text=_("Cancel changes (if any) and close dialog."), wraplength=240) okButton.grid(row=3, column=3, sticky=(S,E), pady=3) cancelButton.grid(row=3, column=4, sticky=(S,E), pady=3, padx=3) self.loadTreeViews() frame.grid(row=0, column=0, sticky=(N,S,E,W)) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) window = self.winfo_toplevel() window.columnconfigure(0, weight=1) self.geometry("+{0}+{1}".format(dialogX+50,dialogY+100)) self.bind("<Return>", self.ok) self.bind("<Escape>", self.close) self.protocol("WM_DELETE_WINDOW", self.close) self.grab_set() self.wait_window(self) def loadTreeViews(self): self.selectedModule = None # clear previous treeview entries for previousNode in self.modulesView.get_children(""): self.modulesView.delete(previousNode) for i, moduleItem in enumerate(sorted(self.pluginConfig.get("modules", {}).items())): moduleInfo = moduleItem[1] name = moduleInfo.get("name", moduleItem[0]) node = self.modulesView.insert("", "end", name, text=name) self.modulesView.set(node, "author", moduleInfo.get("author")) self.modulesView.set(node, "ver", moduleInfo.get("version")) self.modulesView.set(node, "status", moduleInfo.get("status")) self.modulesView.set(node, "date", moduleInfo.get("fileDate")) if name in self.modulesWithNewerFileDates: self.modulesView.set(node, "update", _("available")) self.modulesView.set(node, "descr", moduleInfo.get("description")) self.modulesView.set(node, "license", moduleInfo.get("license")) # clear previous treeview entries for previousNode in self.classesView.get_children(""): self.classesView.delete(previousNode) for i, classItem in enumerate(sorted(self.pluginConfig.get("classes", {}).items())): className, moduleList = classItem node = self.classesView.insert("", "end", className, text=className) self.classesView.set(node, "modules", ', '.join(moduleList)) self.moduleSelect() # clear out prior selection def ok(self, event=None): if self.pluginConfigChanged: PluginManager.pluginConfig = self.pluginConfig PluginManager.pluginConfigChanged = True PluginManager.reset() # force reloading of modules if self.uiClassMethodsChanged: # may require reloading UI if messagebox.askyesno(_("User interface plug-in change"), _("A change in plug-in class methods may have affected the menus " "of the user interface. It may be necessary to restart Arelle to " "access the menu entries or the changes to their plug-in methods. \n\n" "Should Arelle restart with changed user interface language, " "(if there are any unsaved changes they would be lost!)?"), parent=self): self.cntlr.uiThreadQueue.put((self.cntlr.quit, [None, True])) self.close() def close(self, event=None): self.parent.focus_set() self.destroy() def moduleSelect(self, *args): node = (self.modulesView.selection() or (None,))[0] moduleInfo = self.pluginConfig.get("modules", {}).get(node) if moduleInfo: self.selectedModule = node name = moduleInfo["name"] self.moduleNameLabel.config(text=name) self.moduleAuthorHdr.config(state=ACTIVE) self.moduleAuthorLabel.config(text=moduleInfo["author"]) self.moduleDescrHdr.config(state=ACTIVE) self.moduleDescrLabel.config(text=moduleInfo["description"]) self.moduleClassesHdr.config(state=ACTIVE) self.moduleClassesLabel.config(text=', '.join(moduleInfo["classMethods"])) self.moduleUrlHdr.config(state=ACTIVE) self.moduleUrlLabel.config(text=moduleInfo["moduleURL"]) self.moduleDateHdr.config(state=ACTIVE) self.moduleDateLabel.config(text=moduleInfo["fileDate"] + " " + (_("(an update is available)") if name in self.modulesWithNewerFileDates else "")) self.moduleLicenseHdr.config(state=ACTIVE) self.moduleLicenseLabel.config(text=moduleInfo["license"]) self.moduleEnableButton.config(state=ACTIVE, text={"enabled":self.DISABLE, "disabled":self.ENABLE}[moduleInfo["status"]]) self.moduleReloadButton.config(state=ACTIVE) self.moduleRemoveButton.config(state=ACTIVE) else: self.selectedModule = None self.moduleNameLabel.config(text="") self.moduleAuthorHdr.config(state=DISABLED) self.moduleAuthorLabel.config(text="") self.moduleDescrHdr.config(state=DISABLED) self.moduleDescrLabel.config(text="") self.moduleClassesHdr.config(state=DISABLED) self.moduleClassesLabel.config(text="") self.moduleUrlHdr.config(state=DISABLED) self.moduleUrlLabel.config(text="") self.moduleDateHdr.config(state=DISABLED) self.moduleDateLabel.config(text="") self.moduleLicenseHdr.config(state=DISABLED) self.moduleLicenseLabel.config(text="") self.moduleEnableButton.config(state=DISABLED, text=self.ENABLE) self.moduleReloadButton.config(state=DISABLED) self.moduleRemoveButton.config(state=DISABLED) def findLocally(self): filename = self.cntlr.uiFileDialog("open", owner=self, title=_("Choose plug-in module file"), initialdir=self.cntlr.config.setdefault("pluginOpenDir","."), filetypes=[(_("Python files"), "*.py")], defaultextension=".py") if filename: self.cntlr.config["pluginOpenDir"] = os.path.dirname(filename) moduleInfo = PluginManager.moduleModuleInfo(filename) self.loadFoundModuleInfo(moduleInfo, filename) def findOnWeb(self): url = DialogURL.askURL(self) if url: # url is the in-cache or local file moduleInfo = PluginManager.moduleModuleInfo(url) self.cntlr.showStatus("") # clear web loading status self.loadFoundModuleInfo(moduleInfo, url) def loadFoundModuleInfo(self, moduleInfo, url): if moduleInfo and moduleInfo.get("name"): self.addPluginConfigModuleInfo(moduleInfo) self.loadTreeViews() else: messagebox.showwarning(_("Module is not a plug-in"), _("File does not contain a python program with an appropriate __pluginInfo__ declaration: \n\n{0}") .format(url), parent=self) def removePluginConfigModuleInfo(self, name): moduleInfo = self.pluginConfig["modules"].get(name) if moduleInfo: for classMethod in moduleInfo["classMethods"]: classMethods = self.pluginConfig["classes"].get(classMethod) if classMethods and name in classMethods: classMethods.remove(name) if not classMethods: # list has become unused del self.pluginConfig["classes"][classMethod] # remove class if classMethod.startswith("CntlrWinMain.Menu"): self.uiClassMethodsChanged = True # may require reloading UI del self.pluginConfig["modules"][name] self.pluginConfigChanged = True def addPluginConfigModuleInfo(self, moduleInfo): name = moduleInfo["name"] self.removePluginConfigModuleInfo(name) # remove any prior entry for this module self.modulesWithNewerFileDates.discard(name) # no longer has an update available self.pluginConfig["modules"][name] = moduleInfo # add classes for classMethod in moduleInfo["classMethods"]: classMethods = self.pluginConfig["classes"].setdefault(classMethod, []) if name not in classMethods: classMethods.append(name) if classMethod.startswith("CntlrWinMain.Menu"): self.uiClassMethodsChanged = True # may require reloading UI self.pluginConfigChanged = True def moduleEnable(self): if self.selectedModule in self.pluginConfig["modules"]: moduleInfo = self.pluginConfig["modules"][self.selectedModule] if self.moduleEnableButton['text'] == self.ENABLE: moduleInfo["status"] = "enabled" self.moduleEnableButton['text'] = self.DISABLE elif self.moduleEnableButton['text'] == self.DISABLE: moduleInfo["status"] = "disabled" self.moduleEnableButton['text'] = self.ENABLE self.pluginConfigChanged = True self.loadTreeViews() def moduleReload(self): if self.selectedModule in self.pluginConfig["modules"]: url = self.pluginConfig["modules"][self.selectedModule].get("moduleURL") if url: moduleInfo = PluginManager.moduleModuleInfo(url, reload=True) if moduleInfo: self.addPluginConfigModuleInfo(moduleInfo) self.loadTreeViews() self.cntlr.showStatus(_("{0} reloaded").format(moduleInfo.get("name")), clearAfter=5000) else: messagebox.showwarning(_("Module error"), _("File or module cannot be reloaded: \n\n{0}") .format(url), parent=self) def moduleRemove(self): if self.selectedModule in self.pluginConfig["modules"]: self.removePluginConfigModuleInfo(self.selectedModule) self.pluginConfigChanged = True self.loadTreeViews()
class ComponentsDumpWindow(Toplevel): def __init__(self, application, barNumber = None, **kwargs): Toplevel.__init__(self) self.application = application self.barNumber = barNumber self.fromLabel = Label(self) self.fromLabel.grid(column = 0, row = 0) self.fromVar = StringVar() self.fromEntry = Entry(self, textvariable = self.fromVar, justify = RIGHT) self.fromEntry.grid(column = 1, row = 0, sticky = W + E) self.columnconfigure(1, weight = 1) self.toLabel = Label(self) self.toLabel.grid(column = 2, row = 0) self.toVar = StringVar() self.toEntry = Entry(self, textvariable = self.toVar, justify = RIGHT) self.toEntry.grid(column = 3, row = 0, sticky = W + E) self.columnconfigure(3, weight = 1) self.stepLabel = Label(self, text = "dx:") self.stepLabel.grid(column = 4, row = 0) self.stepVar = StringVar() self.stepEntry = Entry(self, textvariable = self.stepVar, justify = RIGHT) self.stepEntry.grid(column = 5, row = 0, sticky = W + E) self.columnconfigure(5, weight = 1) self.calculateButton = Button(self, text = "Рассчитать", command = self.onCalculateButtonClicked) self.calculateButton.grid(column = 6, row = 0, columnspan = 2) # Таблица рассчитанных значений columns = ("№ стержня", "x", "Nx", "U", "σ") self.tree = Treeview(self, columns = columns, displaycolumns = columns) self.tree.grid(column = 0, row = 1, columnspan = 7, sticky = W + N + E + S) self.tree.column("#0", width = 0, stretch = 0) # Настройки отображения таблицы self.tree.column(columns[0], anchor = CENTER) self.tree.heading(columns[0], text = columns[0], anchor = CENTER) for x in columns[1:]: self.tree.column(x, anchor = E) self.tree.heading(x, text = x, anchor = E) self.rowconfigure(1, weight = 1) self.bind("<Destroy>", self.onWindowDestroy) self.updateTitles() self.onConstructionChanged(False) def updateTitles(self): if self.barNumber is None: titleDescStr = "" xDescStr = "global" else: titleDescStr = "%sСтержень (%d)" % (self.application.nameDelim, self.barNumber) xDescStr = "local" self.title("%s%sКомпоненты%s" \ % (self.application.name, self.application.nameDelim, titleDescStr)) self.fromLabel["text"] = "От x(" + xDescStr + "):" self.toLabel["text"] = "До x(" + xDescStr + "):" def onWindowDestroy(self, event): self.application.onWindowDestroy(self) def onCalculateButtonClicked(self): try: self.calculate() except Exception as e: self.showError(e) def onConstructionChanged(self, constructed = True): if not constructed: for var in self.fromVar, self.toVar, self.stepVar: var.set("0") return try: self.calculate() except Exception: self.clear() def onPointCalculated(self, barNumber, x, N, U, Sigma): if self.barNumber is not None and barNumber != self.barNumber: return self.tree.insert(parent = "", index = "end", values = ("—" if barNumber is None else str(barNumber), "%.14f" % x, "%.14f" % N, "%.14f" % U, "%.14f" % Sigma)) def clear(self): self.tree.delete(*self.tree.get_children()) def calculate(self): self.clear() if self.barNumber not in range(0, self.application.logic.barsCount()): self.barNumber = None self.updateTitles() for var in self.fromVar, self.toVar, self.stepVar: try: float(var.get()) except ValueError: var.set("0") xFrom = float(self.fromVar.get()) xTo = float(self.toVar.get()) xStep = float(self.stepVar.get()) self.application.logic.calculateComponents(xFrom, xTo, xStep, barNumber = self.barNumber, onPointCalculated = self.onPointCalculated) def showError(self, message): tkinter.messagebox.showerror("Ошибка", message)
class DialogOpenArchive(Toplevel): def __init__(self, mainWin, openType, filesource, filenames, title, colHeader, showAltViewButton=False): parent = mainWin.parent super(DialogOpenArchive, self).__init__(parent) self.parent = parent self.showAltViewButton = showAltViewButton parentGeometry = re.match("(\d+)x(\d+)[+]?([-]?\d+)[+]?([-]?\d+)", parent.geometry()) dialogX = int(parentGeometry.group(3)) dialogY = int(parentGeometry.group(4)) self.accepted = False self.transient(self.parent) frame = Frame(self) treeFrame = Frame(frame, width=500) vScrollbar = Scrollbar(treeFrame, orient=VERTICAL) hScrollbar = Scrollbar(treeFrame, orient=HORIZONTAL) self.treeView = Treeview(treeFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set) self.treeView.grid(row=0, column=0, sticky=(N, S, E, W)) hScrollbar["command"] = self.treeView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.treeView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) treeFrame.columnconfigure(0, weight=1) treeFrame.rowconfigure(0, weight=1) treeFrame.grid(row=0, column=0, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.treeView.focus_set() mainWin.showStatus(_("loading archive {0}").format(filesource.url)) self.filesource = filesource self.filenames = filenames self.selection = filesource.selection self.hasToolTip = False selectedNode = None if openType == ENTRY_POINTS: try: metadataFiles = filesource.taxonomyPackageMetadataFiles if len(metadataFiles) > 1: raise IOError(_("Taxonomy package contained more than one metadata file: {0}.") .format(', '.join(metadataFiles))) metadataFile = metadataFiles[0] metadata = filesource.file(filesource.url + os.sep + metadataFile)[0] self.metadataFilePrefix = os.sep.join(os.path.split(metadataFile)[:-1]) if self.metadataFilePrefix: self.metadataFilePrefix += os.sep self.nameToUrls, self.remappings = parseTxmyPkg(mainWin, metadata) except Exception as e: self.close() err = _("Failed to parse metadata; the underlying error was: {0}").format(e) messagebox.showerror(_("Malformed taxonomy package"), err) mainWin.addToLog(err) return mainWin.showStatus(None) if openType == DISCLOSURE_SYSTEM: y = 3 else: y = 1 okButton = Button(frame, text=_("OK"), command=self.ok) cancelButton = Button(frame, text=_("Cancel"), command=self.close) okButton.grid(row=y, column=2, sticky=(S,E,W), pady=3) cancelButton.grid(row=y, column=3, sticky=(S,E,W), pady=3, padx=3) if showAltViewButton: self.altViewButton = Button(frame, command=self.showAltView) self.altViewButton.grid(row=y, column=0, sticky=(S,W), pady=3, padx=3) self.loadTreeView(openType, colHeader, title) frame.grid(row=0, column=0, sticky=(N,S,E,W)) frame.columnconfigure(0, weight=1) window = self.winfo_toplevel() window.columnconfigure(0, weight=1) self.geometry("+{0}+{1}".format(dialogX+50,dialogY+100)) self.bind("<Return>", self.ok) self.bind("<Escape>", self.close) self.toolTipText = StringVar() if self.hasToolTip: self.treeView.bind("<Motion>", self.motion, '+') self.treeView.bind("<Leave>", self.leave, '+') self.toolTipText = StringVar() self.toolTip = ToolTip(self.treeView, textvariable=self.toolTipText, wraplength=640, follow_mouse=True, state="disabled") self.toolTipRowId = None self.protocol("WM_DELETE_WINDOW", self.close) self.grab_set() self.wait_window(self) def loadTreeView(self, openType, title, colHeader): self.title(title) self.openType = openType selectedNode = None # clear previous treeview entries for previousNode in self.treeView.get_children(""): self.treeView.delete(previousNode) # set up treeView widget and tabbed pane if openType in (ARCHIVE, DISCLOSURE_SYSTEM): self.treeView.column("#0", width=500, anchor="w") self.treeView.heading("#0", text=colHeader) try: self.isRss = self.filesource.isRss if self.isRss: self.treeView.column("#0", width=350, anchor="w") self.treeView["columns"] = ("descr", "date", "instDoc") self.treeView.column("descr", width=50, anchor="center", stretch=False) self.treeView.heading("descr", text="Form") self.treeView.column("date", width=170, anchor="w", stretch=False) self.treeView.heading("date", text="Pub Date") self.treeView.column("instDoc", width=200, anchor="w", stretch=False) self.treeView.heading("instDoc", text="Instance Document") except AttributeError: self.isRss = False self.treeView["columns"] = tuple() loadedPaths = [] for i, filename in enumerate(self.filenames): if isinstance(filename,tuple): if self.isRss: form, date, instDoc = filename[2:5] filename = filename[0] # ignore tooltip self.hasToolTip = True if filename.endswith("/"): filename = filename[:-1] path = filename.split("/") if not self.isRss and len(path) > 1 and path[:-1] in loadedPaths: parent = "file{0}".format(loadedPaths.index(path[:-1])) else: parent = "" node = self.treeView.insert(parent, "end", "file{0}".format(i), text=path[-1]) if self.isRss: self.treeView.set(node, "descr", form) self.treeView.set(node, "date", date) self.treeView.set(node, "instDoc", os.path.basename(instDoc)) if self.selection == filename: selectedNode = node loadedPaths.append(path) elif openType == ENTRY_POINTS: self.treeView.column("#0", width=150, anchor="w") self.treeView.heading("#0", text="Name") self.treeView["columns"] = ("url",) self.treeView.column("url", width=350, anchor="w") self.treeView.heading("url", text="URL") for name, urls in self.nameToUrls.items(): displayUrl = urls[1] # display the canonical URL self.treeView.insert("", "end", name, values=[displayUrl], text=name) self.hasToolTip = True else: # unknown openType return None if selectedNode: self.treeView.see(selectedNode) self.treeView.selection_set(selectedNode) if self.showAltViewButton: self.altViewButton.config(text=_("Show Files") if openType == ENTRY_POINTS else _("Show Entries")) def ok(self, event=None): selection = self.treeView.selection() if len(selection) > 0: if self.openType in (ARCHIVE, DISCLOSURE_SYSTEM): filename = self.filenames[int(selection[0][4:])] if isinstance(filename,tuple): if self.isRss: filename = filename[4] else: filename = filename[0] if not filename.endswith("/"): self.filesource.select(filename) self.accepted = True self.close() elif self.openType == ENTRY_POINTS: epName = selection[0] #index 0 is the remapped Url, as opposed to the canonical one used for display urlOrFile = self.nameToUrls[epName][0] # load file source remappings self.filesource.mappedPaths = \ dict((prefix, remapping if isHttpUrl(remapping) else (self.filesource.baseurl + os.sep + self.metadataFilePrefix +remapping.replace("/", os.sep))) for prefix, remapping in self.remappings.items()) if not urlOrFile.endswith("/"): # check if it's an absolute URL rather than a path into the archive if isHttpUrl(urlOrFile): self.filesource.select(urlOrFile) # absolute path selection else: # assume it's a path inside the archive: self.filesource.select(self.metadataFilePrefix + urlOrFile) self.accepted = True self.close() def close(self, event=None): self.parent.focus_set() self.destroy() def showAltView(self, event=None): if self.openType == ENTRY_POINTS: self.loadTreeView(ARCHIVE, _("Select Entry Point"), _("File")) else: self.loadTreeView(ENTRY_POINTS, _("Select Archive File"), _("File")) def leave(self, *args): self.toolTipRowId = None def motion(self, *args): tvRowId = self.treeView.identify_row(args[0].y) if tvRowId != self.toolTipRowId: text = None if self.openType in (ARCHIVE, DISCLOSURE_SYSTEM): self.toolTipRowId = tvRowId if tvRowId and len(tvRowId) > 4: try: text = self.filenames[ int(tvRowId[4:]) ] if isinstance(text, tuple): text = text[1].replace("\\n","\n") except (KeyError, ValueError): pass elif self.openType == ENTRY_POINTS: try: epUrl = self.nameToUrls[tvRowId][1] text = "{0}\n{1}".format(tvRowId, epUrl) except KeyError: pass self.setToolTip(text) def setToolTip(self, text): self.toolTip._hide() if text: self.toolTipText.set(text) self.toolTip.configure(state="normal") self.toolTip._schedule() else: self.toolTipText.set("") self.toolTip.configure(state="disabled")
class tabel(): def __init__(self,data,y,m): w=Toplevel() w.geometry('{0}x{1}+0+0'.format(120+25*21,w.winfo_screenheight()-80)) w.columnconfigure(0,weight=1) w.rowconfigure(0,weight=1) d=data[y][m] v='план' if 'табель' in d['degur']: v='табель' w.wm_title('{0} {1} {2}'.format(v,y,m)) #deg=data['2013']['11']['degurs'] # ЗАГЛУШКА : список дежурных deg=d['degurs'] # ЗАГЛУШКА : список дежурных cc=list(range(1,17)) cols=[str(c) for c in cc]+['s','сум','ноч','пра','доп'] self.t=Treeview(w,columns=cols) self.t.column('#0',width=100) for c in cols: self.t.heading(c,text=c) self.t.column(c,width=25,anchor='center') self.t.tag_configure('title',background='gray') self.scrX=Scrollbar(w,orient='horizontal',command=self.t.xview) self.scrY=Scrollbar(w,orient='vertical',command=self.t.yview) self.t['xscrollcommand']=self.scrX.set self.t['yscrollcommand']=self.scrY.set self.t.grid(row=0,column=0,sticky=N+S+E+W) self.scrX.grid(row=1,column=0,sticky=E+W) self.scrY.grid(row=0,column=1,sticky=N+S) rez=dict() for j,s in d['degur'][v].items(): rez[j]=analyse2(s,d) for j in deg: ww1=[] ww2=[] a=0 nn1=[] for x in d['degur'][v].get(j,''): if a: if x=='Д': ww1.append('!!') nn1+=[0,0] y=a+12 a=0 elif x in [str(xx) for xx in range(1,10)]: ww1.append('Я') nn1+=[0,0] y=a+int(x) a=0 elif x=='Н': ww1.append('!') nn1+=[2,6] y=a+4 a=8 elif x=='-': ww1.append('Н') nn1+=[0,0] y=a+0 a=0 else: ww1.append('!') nn1+=[0,0] y=a+0 a=0 else: if x=='Д': ww1.append('Я') nn1+=[0,0] y=12 a=0 elif x in [str(xx) for xx in range(1,10)]: ww1.append('Я') nn1+=[0,0] y=int(x) a=0 elif x=='Н': ww1.append(x) nn1+=[2,6] y=4 a=8 elif x=='-': ww1.append('В') nn1+=[0,0] y=0 a=0 else: ww1.append(x) nn1+=[0,0] y=0 a=0 ww2.append(y) ww=rez.get(j,(0,0,0,0))[0] ee=rez.get(j,(0,0,0,0))[0] -rez.get(j,(0,0,0,0))[3] #ee=rez.get(j,(0,0,0,0))[3] nn=rez.get(j,(0,0,0,0))[1] hh=rez.get(j,(0,0,0,0))[2] s1=sum([x and 1 for x in ww2[1:16]]) s2=sum([x and 1 for x in ww2[16:-1]]) n0=sum([x=='Н' and 1 or 0 for x in ww1[1:-1]]) z=self.t.insert('','end',text=j) self.t.insert(z,'end',text='',values=list(range(1,16)),tag='title') self.t.insert(z,'end',text='',values=ww1[1:16]+['',s1]) self.t.insert(z,'end',text='',values=[x or '-' for x in ww2[1:16]]+ \ ['']+[sum(ww2[1:16])]) self.t.insert(z,'end',text='',values=list(range(16,32)),tag='title') self.t.insert(z,'end',text='',values=ww1[16:-1]+['']*(33-len(ww1))+ \ [s2,s1+s2,n0]) self.t.insert(z,'end',text='',values=[x or '-' for x in ww2[16:-1]]+ \ ['']*(16-len(ww2[16:-1]))+[sum(ww2[16:-1]),sum(ww2[1:-1]),sum(nn1[1:-3]),hh,ee])
class MainFrame(Frame): """ Główna ramka aplikacji """ def __init__(self, ui: SharedrawUI): Frame.__init__(self, ui.root) self.parent = ui.root self.ui = ui self.parent.title("Sharedraw [%s:%s, id: %s]" % (self.ui.peer_pool.ip, self.ui.peer_pool.port, own_id)) self.drawer = Drawer(self.parent, WIDTH, HEIGHT, self.save) self.clients_table = Treeview(self.parent, columns=('R', 'G', 'from')) self.clients_table.heading('#0', text='Id') self.clients_table.heading('R', text='R') self.clients_table.heading('G', text='G') self.clients_table.heading('from', text='Otrzymano od:') self.clients_table.pack() self.token_owner_label = MutableLabel(self.parent, 'Posiadacz tokena: %s', lambda s: s if s else 'Nikt', None) self.token_owner_label.pack() self.locked_label = MutableLabel(self.parent, 'Tablica %s', lambda b: 'zablokowana' if b else 'odblokowana', False) self.locked_label.pack() # Przycisk czyszczenia self.clean_btn = self._create_button(text="Czyść", func=self.clean) # Przycisk podłączenia self.connect_btn = self._create_button(text="Podłącz", func=self.connect) # Przycisk żądania przejęcia na własność self.req_btn = self._create_button(text="Chcę przejąć tablicę", func=self._make_request) # Rezygnacja z posiadania blokady self.resign_btn = self._create_button(text='Zrezygnuj z blokady', func=self._resign) def _create_button(self, text: str, func): """ Tworzy nowy przycisk w bieżącej ramce :param text: tekst przycisku :param func: funkcja wywoływana po naciśnięciu :return: przycisk """ btn = Button(self.parent, text=text, command=func) btn.pack() return btn def save(self): """ Wysyła komunikat o zmianie obrazka do innych klientów :return: """ if self.drawer.changed_pxs: msg = PaintMessage(self.drawer.changed_pxs, self.drawer.color) self.ui.peer_pool.send(msg) # Reset listy punktów self.drawer.changed_pxs = [] def clean(self): """ Czyści obrazek oraz wysyła komunikat o wyczyszczeniu :return: """ self.drawer.clean_img() msg = CleanMessage(own_id) self.ui.peer_pool.send(msg) def _make_request(self): """ Żąda przejęcia tablicy na własność :return: """ clients_info = self.ui.om.claim_ownership() self.update_clients_info(clients_info) def _resign(self): clients_info = self.ui.om.resign() self.update_clients_info(clients_info) def connect(self): """ Uruchamia okno dialogowe do podłączenia się z innym klientem :return: """ d = ConnectDialog(self.ui) self.parent.wait_window(d.top) def update_clients_info(self, clients: ClientsTable): # Aktualizacja listy klientów for ch in self.clients_table.get_children(): self.clients_table.delete(ch) for client in clients.clients: self.clients_table.insert('', 'end', text=client.id, values=(client.requested, client.granted, client.received_from_id)) # Aktualizacja info o właścicielu tokena i blokadzie self.locked_label.update_text(clients.locked) self.token_owner_label.update_text(clients.token_owner) # Aktualizacja blokady has_token = clients.token_owner == own_id self.__set_lock_state(clients.locked, has_token) # Aktualizacja przycisków # jeśli zablokowaliśmy, to nie możemy tego zrobić drugi raz is_locker = (has_token and clients.locked) # tak samo jeśli już zażądaliśmy has_requested = clients.find_self().has_requested() self.__set_button_enabled(self.req_btn, not (is_locker or has_requested)) # jeśli nie zablokowaliśmy, to nie możemy rezygnować self.__set_button_enabled(self.resign_btn, is_locker) # Możemy się podłączyć, tylko, jeśli nie jesteśmy do nikogo podłączeni self.__set_button_enabled(self.connect_btn, len(clients.clients) <= 1) # Przycisk czyść aktywny jeśli możemy rysować self.__set_button_enabled(self.clean_btn, has_token or not clients.locked) @staticmethod def __set_button_enabled(btn: Button, enabled: bool): btn.configure(state=(NORMAL if enabled else DISABLED)) def __set_lock_state(self, locked: bool, has_token: bool): self.drawer.locked = locked and not has_token # Dodatkowo ustawiamy kolor tła, żeby było ładnie widać if locked: if has_token: color = '#66FF66' else: color = '#FF9999' else: color = '#FFFFFF' self.parent.configure(bg=color)
class CopyFileFrame(CopilotInnerFrame): def __init__(self, master, config, state): super(CopyFileFrame, self).__init__(master, config) self._state = state self._item_paths = {} self._tree = Treeview(self._master, columns=('size')) self._tree.heading('size', text='Size') self._tree.grid(row=1, column=0, columnspan=3, sticky='nsew') self._tree.configure(yscrollcommand=self._sb.set) self._sb['command'] = self._tree.yview if self._state.action == 'copy': self._next_btn['text'] = 'Copy' self._frame_lbl['text'] = 'Copy File' self._populate_tree(self._config.file_root) elif self._state.action == 'delete': self._next_btn['text'] = 'Delete' self._frame_lbl['text'] = 'Delete File' self._populate_tree(self._state.to_device.part().mount()) self._next_btn['command'] = self._next_cmd def _next_cmd(self): if self._state.action == 'copy': self._copy_file() elif self._state.action == 'delete': self._delete_file() def _copy_file(self): cur_item = self._tree.focus() cur_path = self._item_paths.get(cur_item, '') if cur_path != '': new_path = os.path.join(self._state.device_to_path, os.path.basename(cur_path)) try: if os.path.exists(new_path): if ConfirmFrame.show( self._master, self._config, 'The file already exists in the destination.\n' 'Would you like to overwrite it?', 'Yes', 'No' ): shutil.copyfile(cur_path, new_path) else: shutil.copyfile(cur_path, new_path) except PermissionError: OkFrame.show( self._master, self._config, 'Error copying file:\n\nInvalid permissions' ) except Exception as e: OkFrame.show( self._master, self._config, 'An error occurred while copying the file:\n\n{}'.format(e) ) def _delete_file(self): cur_item = self._tree.focus() cur_path = self._item_paths.get(cur_item, '') if cur_path != '': disp_path = cur_path[len(self._state.to_device.part().mount()):] try: if ConfirmFrame.show( self._master, self._config, 'Are you sure you\'d like to delete this file?\n{}'.format(disp_path), 'Yes', 'No' ): os.remove(cur_path) self._tree.delete(self._tree.focus()) except PermissionError: OkFrame.show( self._master, self._config, 'Error deleting file:\n\nInvalid permissions' ) except Exception as e: OkFrame.show( self._master, self._config, 'An error occurred while deleting the file:\n\n{}'.format(e) ) def _populate_tree(self, tree_root): self._item_paths = {} def insert_path(tree, path, parent_id): dirs = [e for e in scandir(path) if e.is_dir()] dirs.sort(key=lambda e: e.name) for d in dirs: dir_name = d.name dir_id = '{}-{}'.format(parent_id, dir_name) dir_path = os.path.join(path, dir_name) tree.insert(parent_id, 'end', dir_id, text=dir_name, tags=('dir')) try: insert_path(tree, dir_path, dir_id) except: pass files = [e for e in scandir(path) if e.is_file()] files.sort(key=lambda e: e.name) for idx, f in enumerate(files): file_name = f.name file_id = '{}-{}'.format(parent_id, file_name) file_stat = f.stat() file_size = sizeof_fmt(file_stat.st_size) file_path = os.path.join(path, file_name) self._item_paths[file_id] = file_path if idx % 2 == 0: file_bg = 'file_even' else: file_bg = 'file_odd' tree.insert( parent_id, 'end', file_id, text=file_name, tags=('file', file_bg), values=(file_size) ) insert_path(self._tree, tree_root, '') tree = self._tree tree.tag_configure('dir', font=self._config.item_font) tree.tag_configure('file', font=self._config.item_font) tree.tag_configure('file_odd', background='light grey')
class Gui(Interface): """The GUI interface uses the tkinter module to generate a window using tk """ TREE_COLUMNS = ("Number of probes : {nProbes}", "Probe address", "Status") RESULT_DIPLAY_HEIGHT = 10 def __init__(self, ip): Interface.__init__(self, ip) self.commandHistory = [] self.mainWin = Tk() self.command = StringVar(self.mainWin) self.status = StringVar(self.mainWin, value="Waiting for command ...") self.text = StringVar(self.mainWin, value="Enter a command :") self.result = None self.probesDisplay = None self.mainWin.title("Commander for probe with ip : " + ip) self.isRunning = True self.mainWin.protocol("WM_DELETE_WINDOW", self.quit) # define the threads self.thProbe = Thread(target=self.updateProbes, name="Probe updater", daemon=True) self.thResults = Thread(target=self.updateResults, name="Results Updater", daemon=True) def start(self): """Starts (opens) the commander window""" self.mainWin.geometry("800x600") txtText = Label(self.mainWin, textvariable=self.text) txtText.grid(row=0, column=0, sticky=W) txtInput = Entry(self.mainWin, textvariable=self.command, width=30) txtInput.grid(row=0, column=1, sticky=E + W) txtInput.bind("<Return>", self.doCommand) txtInput.bind("<Up>", self.recallCommand) button = Button(self.mainWin, text="Refresh", fg="blue", command=self.triggerFetchProbes) button.grid(row=1, column=0, sticky=N + S + E + W) txtStatus = Label(self.mainWin, textvariable=self.status, wraplength=600, justify=CENTER) txtStatus.grid(row=1, column=1, sticky=N + S + E + W) self.probesDisplay = Treeview(self.mainWin, columns=self.TREE_COLUMNS, show="headings") self.probesDisplay.grid(row=2, columnspan=2, sticky=N + S + E + W) for i in range(0, len(self.TREE_COLUMNS)): self.updateHeading(i, nProbes=0) self.result = Text(self.mainWin, textvariable=self.result, height=self.RESULT_DIPLAY_HEIGHT, wrap=WORD) self.result.configure(state=DISABLED) self.result.grid(row=3, columnspan=2, sticky=N + S + E + W) self.addResult("Awaiting results .... ") self.mainWin.grid_rowconfigure(2, weight=1) self.mainWin.grid_columnconfigure(1, weight=1) self.probeFetcherScheduler() self.thProbe.start() self.resultFetcherScheduler() self.thResults.start() self.logger.info("Commander : Starting main window") self.mainWin.mainloop() self.logger.debug("Commander : mainloop over") def recallCommand(self, event): """Function to rewrite previous command in box""" if len(self.commandHistory) != 0: self.command.set(self.commandHistory[-1]) return "break" def doCommand(self, event): """Executes user command""" self.commandHistory.append(self.command.get()) self.logger.info("Commander : executing command") cmd = super().doCommand(self.command.get()) # cmd.join() self.command.set("") def updateStatus(self, status): """Update status of the probe in status label :param status: new status""" self.status.set(status) self.mainWin.update_idletasks() def addResult(self, result): """Add (prepend) a result in the result test area :param result: the result to add """ self.result.configure(state=NORMAL) self.result.insert("1.0", result + "\n") self.result.configure(state=DISABLED) def setResult(self, result): """Put this result in the result area :param result: result to put """ self.result.configure(state=NORMAL) self.result.set(result) self.result.configure(state=DISABLED) def updateProbes(self): """Update the list of probes in the Treeview""" while self.isRunning: try: probes = self.probesToItems(self.fetchProbes()) self.probesDisplay.set_children("") self.updateHeading(0, nProbes=len(probes)) for item in probes: self.probesDisplay.insert("", "end", values=item) # self.probesDisplay.set_children('', probes) except ProbeConnectionFailed: self.updateStatus("Cannot get list of probes") self.logger.error("Error while getting list of probes : connection failed", exc_info=1) finally: self.doFetchProbes.wait() def updateHeading(self, index, **kw): self.probesDisplay.heading(index, anchor=W, text=self.TREE_COLUMNS[index].format(**kw)) @staticmethod def probesToItems(probes): """Transform probe object into lists for display :param probes: list of probes to transform """ return [(str(probe.getId()), probe.getIp(), probe.getStatus()) for probe in probes] def updateResults(self): """Update the results is the box""" while self.isRunning: try: result = self.fetchResults() self.addResult(result) except ProbeConnectionFailed: self.updateStatus("Cannot fetch results") self.logger.error("Cannot fetch results : connection to probe failed", exc_info=1) finally: self.doFetchResults.wait() def quit(self): """Exit and close the commander window""" self.logger.info("Commander : exiting commander") self.isRunning = False self.triggerFetchProbes() self.thProbe.join() super().quit() # no join because answer is blocking... # self.thResults.join() self.mainWin.quit()
class ElementListWidget(Frame): def __init__(self, parent, label, columns, showError): Frame.__init__(self, parent) self.showError = showError self.columnconfigure(0, weight = 1) self.rowconfigure(1, weight = 1) # Название таблицы self.titleLabel = Label(self, text = label) self.titleLabel.grid(column = 0, row = 0, sticky = W + E) # Таблица значений columns = ("Метка", "№") + columns self.tree = Treeview(self, columns = columns, displaycolumns = columns, selectmode = "browse") self.tree.grid(column = 0, row = 1, sticky = W + N + E + S) # Настраиваем внешний вид таблицы (первые колонки) self.tree.column("#0", width = 0, stretch = 0) # Прячем колонку с иконкой self.tree.column( columns[0], anchor = W, width = 150) self.tree.heading(columns[0], anchor = W, text = columns[0]) self.tree.column( columns[1], anchor = E, width = 80) self.tree.heading(columns[1], anchor = E, text = columns[1]) self.tree.bind("<<TreeviewSelect>>", self.onSelectionChanged) # Панель с кнопками self.buttonPanel = Frame(self) self.buttonPanel.grid(column = 0, row = 2, sticky = W + E) self.buttonPanel.columnconfigure(0, weight = 1) self.buttonPanel.columnconfigure(3, minsize = emptySpaceSize, weight = 0) self.buttonPanel.columnconfigure(6, minsize = emptySpaceSize, weight = 0) self.buttonPanel.columnconfigure(9, weight = 1) # Кнопки добавления/удаления элемента self.buttonAdd = Button(self.buttonPanel, text = "+", width = 3, command = self.onButtonAddClicked) self.buttonAdd.grid(column = 1, row = 0) self.buttonRemove = Button(self.buttonPanel, text = "-", width = 3, state = DISABLED, command = self.onButtonRemoveClicked) self.buttonRemove.grid(column = 2, row = 0) # Кнопки перемещения элемента self.buttonUp = Button(self.buttonPanel, text = "↑", width = 3, state = DISABLED, command = self.onButtonUpClicked) self.buttonUp.grid(column = 4, row = 0) self.buttonDown = Button(self.buttonPanel, text = "↓", width = 3, state = DISABLED, command = self.onButtonDownClicked) self.buttonDown.grid(column = 5, row = 0) # Кнопки применить/отменить (для выбранного элемента) self.buttonCancel = Button(self.buttonPanel, text = "✗", width = 3, command = self.updateSelectedFrame) self.buttonCancel.grid(column = 7, row = 0) self.buttonApply = Button(self.buttonPanel, text = "✓", width = 3, command = self.onButtonApplyClicked) self.buttonApply.grid(column = 8, row = 0) # Редактирование выделенного элемента self.i = StringVar() self.label = (StringVar(), StringVar()) self.selectedFrame = Frame(self) self.selectedFrame.grid(column = 0, row = 3, sticky = W + E) # Номер Label(self.selectedFrame, text = "№:") \ .grid(column = 0, row = 0) Label(self.selectedFrame, textvariable = self.i, width = 3, justify = RIGHT) \ .grid(column = 1, row = 0) # Пустое пространство self.selectedFrame.columnconfigure(2, minsize = emptySpaceSize, weight = 0) # Метка Entry(self.selectedFrame, textvariable = self.label[0]) \ .grid(column = 3, row = 0, sticky = W + E) Entry(self.selectedFrame, textvariable = self.label[1], bg = defaultValueBG) \ .grid(column = 4, row = 0, sticky = W + E) # Виджет для элементов классов-потомков self.detailFrame = Frame(self.selectedFrame) self.detailFrame.grid(column = 3, row = 1, columnspan = 2, sticky = W + N + E + S) self.selectedFrame.columnconfigure(3, weight = 1) self.selectedFrame.columnconfigure(4, weight = 1) self.selectedFrame.rowconfigure(1, weight = 1) def onButtonUpClicked(self): item = self.selectedItem() if item is None: return prev = self.tree.prev(item) if prev != "": parent, index = self.tree.parent(item), self.tree.index(item) self.tree.move(item, parent, index - 1) # Корректируем номера элементов self.tree.set(item, "№", index - 1) self.tree.set(prev, "№", index) self.updateSelectedFrame(item) def onButtonDownClicked(self): item = self.selectedItem() if item is None: return next = self.tree.next(item) if next != "": parent, index = self.tree.parent(item), self.tree.index(item) self.tree.move(item, parent, index + 1) # Корректируем номера элементов self.tree.set(item, "№", index + 1) self.tree.set(next, "№", index) self.updateSelectedFrame(item) def onButtonAddClicked(self): pass def onButtonRemoveClicked(self): item = self.selectedItem() if item is None: return next = self.tree.next(item) self.tree.delete(item) while next != "": i = int(self.tree.set(next, "№")) self.tree.set(next, "№", i - 1) next = self.tree.next(next) self.onSelectionChanged() def onButtonApplyClicked(self, item = None): if item is None: item = self.selectedItem() if item is None: return None label = self.label[0].get() self.tree.set(item, "Метка", label) return item def onSelectionChanged(self, event = None): item = self.selectedItem() # Обновляем состояние кнопок state = DISABLED if item is None else NORMAL for x in (self.buttonRemove, self.buttonUp, self.buttonDown): x["state"] = state self.updateSelectedFrame(item) def selectedItem(self): selection = self.tree.selection() return None if type(selection) == type("") else selection[0] def clear(self): for item in self.tree.get_children(): self.tree.delete(item) def updateSelectedFrame(self, item = None, values = None): if item is None: item = self.selectedItem() values = None if item is None: i = "" label = "" else: if values is None: values = self.tree.set(item) i = values["№"] label = values["Метка"] self.i.set(i) self.label[0].set(label) return (item, values) def addElement(self, values): self.tree.insert(parent = "", index = END, values = values) def setDefaultElement(self, label): self.label[1].set(label) def elementsCount(self): return len(self.tree.get_children()) def elements(self, transform): return [ transform(item) for item in self.tree.get_children() ]
class Gr(): def __init__(self,root,data,SCRY=None): self.data=data self.columns=[x for x in range(1,8)]+['day'] root.rowconfigure(1,weight=1) root.columnconfigure(0,weight=1) root.columnconfigure(1,weight=1) root.columnconfigure(2,weight=1) f=Frame(root) f.columnconfigure(0,weight=1) f.rowconfigure(1,weight=1) self.v=Combobox(root) self.v.grid(row=0,column=0) self.v.bind('<<ComboboxSelected>>',self.select_ver) f.grid(row=1,column=0,columnspan=3,sticky=N+S) self.tree=Treeview(f, columns=self.columns, displaycolumns=['day']+self.columns[:-1], show='headings') #self.tree.tag_configure('odd',background='white') #self.tree.tag_configure('even',background='gray') self.tree.tag_configure('dif',foreground='brown') self.tree.tag_configure('work',background='white') self.tree.tag_configure('short',background='#F5EFE0') self.tree.tag_configure('rest',background='#E0B0B0') self.tree.tag_configure('holyday',background='#E7B7A4') for c in self.columns: self.tree.heading(c,text=c) self.tree.column(c,width=65,anchor='center') self.tree.column('day',width=30) scrX=Scrollbar(f,orient='horizontal',command=self.tree.xview) self.tree['xscrollcommand']=scrX.set if not SCRY: self.scrY=Scrollbar(f,orient='vertical',command=self.yview) self.tree['yscrollcommand']=self.scrY.set else: self.tree['yscrollcommand']=SCRY.set self.tree.grid(row=1,column=0,sticky=N+S) if not SCRY: self.scrY.grid(row=1,column=1,sticky=N+S) scrX.grid(row=2,column=0,sticky=E+W) def set(self,y,m): self.y=y self.m=m self.show() def yview(self,*args): self.tree.yview(*args) self.yview2(*args) def yview2(self,*args): pass def show(self): d=self.data[self.y][self.m] V=list(d['degur'].keys()) self.v['values']=V self.v.set(V[0]) self.select_ver() def select_ver(self,*e): self.tree.delete(*self.tree.get_children()) d=self.data[self.y][self.m] offset=d['offset'] v=self.v.get() col=[] for i,deg in enumerate(d['degurs']): self.tree.heading(i+1,text=deg) col.append(i+1) self.tree.configure(displaycolumns=['day']+col) items=dict() if 'табель' in d['degur']: a=[''.join(x) for x in zip(*[[x for x in d['degur']['план'][j]] \ for j in d['degurs']])] b=[''.join(x) for x in zip(*[[x for x in d['degur']['табель'][j]] \ for j in d['degurs']])] c=[x!=y for x,y in zip(a,b)] else: c=[False]*32 for i in range(1,d['days']+1): tag = (i+offset) % 7 in [0,6] and 'rest' or 'work' if i in d['holydays'] : tag='holyday' elif i in d['restdays'] : tag='rest' elif i in d['shortdays'] : tag='short' elif i in d['workdays'] : tag='work' if c[i]: tag=[tag,'dif'] ii=self.tree.insert('','end',values=['-','-','-','-','-'],tag=tag) self.tree.set(ii,column='day',value=i) items[i]=ii for j,s in d['degur'][v].items(): # j-degur if not s: continue for i,val in enumerate(s[1:-1]): if val=='J': val='до' elif val=='j': val='од' elif val=='a': val='10' self.tree.set(items[i+1],column=d['degurs'].index(j)+1,value=val) if s[0]=='Н': if s[1]=='-': self.tree.set(items[1],column=d['degurs'].index(j)+1,value='Н(8)') else: self.tree.set(items[1],column=d['degurs'].index(j)+1,value='!') if s[-2]=='Н': if s[-1]=='-': self.tree.set(items[len(s)-2],column=d['degurs'].index(j)+1,value='Н(4)') else: self.tree.set(items[len(s)-2],column=d['degurs'].index(j)+1,value='!') self.calc(self.y,self.m) def calc(self,y,m): d=self.data[y][m] offset=d['offset'] WH=0 for i in range(1,d['days']+1): if i in d['holydays']: wh=0 elif i in d['restdays'] : wh=0 elif i in d['shortdays'] : wh=7 elif i in d['workdays'] : wh=8 elif (i+offset) % 7 in [0,6]: wh=0 else: wh=8 WH+=wh
class statistic_xx(): def __init__(self,data,y,v='план'): w=Toplevel() w.wm_title('Итоги по месяцам за {0} год ({1}) '.format(y,v)) w.columnconfigure(0,weight=1) w.rowconfigure(0,weight=1) cols=data[y]['degurs'] # ЗАГЛУШКА : список дежурных self.t=Treeview(w,columns=cols) self.t.column('#0',width=120) for c in cols: self.t.heading(c,text=c) self.t.column(c,width=65,anchor='center') self.t.tag_configure('табель',background='green') self.t.tag_configure('ош',background='red') self.scrX=Scrollbar(w,orient='horizontal',command=self.t.xview) self.scrY=Scrollbar(w,orient='vertical',command=self.t.yview) self.t['xscrollcommand']=self.scrX.set self.t['yscrollcommand']=self.scrY.set self.t.grid(row=0,column=0,sticky=N+S+E+W) self.scrX.grid(row=1,column=0,sticky=E+W) self.scrY.grid(row=0,column=1,sticky=N+S) roots=dict() for m in ['01','02','03','04','05','06','07','08','09','10','11','12']: d0=data[y] if m not in d0: continue roots[m]=self.t.insert('','end',text=m+' ('+data[y][m]['month']+')') #r=self.t.insert('','end',text='рабочих') #x=self.t.insert('','end',text='xxx') #w=self.t.insert('','end',text='отработано') #e=self.t.insert('','end',text='дополнительные') #n=self.t.insert('','end',text='ночные') #h=self.t.insert('','end',text='праздничные') #rz_root=self.t.insert('','end',text='резерв') for m in ['01','02','03','04','05','06','07','08','09','10','11','12']: d0=data[y] if m not in d0: continue d=d0[m] rez=dict() tag='' if v=='авто': if 'табель' in d['degur']: vv='табель' tag=vv else: vv='план' elif v=='табель': if 'табель' not in d['degur']: vv='план' tag='ош' else: vv=v tag=vv else: vv=v for j,s in d['degur'][vv].items(): rez[j]=analyse2(s,d) NUL=(0,0,0,0,0,0,0) ww=[rez.get(j,NUL)[0] for j in cols] ee=[rez.get(j,NUL)[0]-rez.get(j,NUL)[3]+rez.get(j,NUL)[4] for j in cols] xx=[rez.get(j,NUL)[0]-rez.get(j,NUL)[3] for j in cols] nn=[rez.get(j,NUL)[1] for j in cols] hh=[rez.get(j,NUL)[2] for j in cols] rr=[rez.get(j,NUL)[3]-rez.get(j,NUL)[4] for j in cols] rz=[rez.get(j,NUL)[5] for j in cols] self.t.insert(roots[m],'end',text='отработано',values=ww,tag=tag) self.t.insert(roots[m],'end',text='рабочие',values=rr,tag=tag) self.t.insert(roots[m],'end',text='дополнительные',values=ee,tag=tag) self.t.insert(roots[m],'end',text='ночные',values=nn,tag=tag) self.t.insert(roots[m],'end',text='праздничные',values=hh,tag=tag)
class statistic_q(): def __init__(self,data,y,v='план'): w=Toplevel() w.wm_title('Поквартальная статистика за {0} год ({1})'.format(y,v)) w.columnconfigure(0,weight=1) w.rowconfigure(0,weight=1) cols=data[y]['degurs'] # ЗАГЛУШКА : список дежурных self.t=Treeview(w,columns=cols) self.t.column('#0',width=120) for c in cols: self.t.heading(c,text=c) self.t.column(c,width=65,anchor='center') self.t.tag_configure('табель',background='green') self.t.tag_configure('ош',background='red') self.scrX=Scrollbar(w,orient='horizontal',command=self.t.xview) self.scrY=Scrollbar(w,orient='vertical',command=self.t.yview) self.t['xscrollcommand']=self.scrX.set self.t['yscrollcommand']=self.scrY.set self.t.grid(row=0,column=0,sticky=N+S+E+W) self.scrX.grid(row=1,column=0,sticky=E+W) self.scrY.grid(row=0,column=1,sticky=N+S) r=self.t.insert('','end',text='рабочих') w=self.t.insert('','end',text='отработано') e=self.t.insert('','end',text='дополнительные') n=self.t.insert('','end',text='ночные') h=self.t.insert('','end',text='праздничные') x=self.t.insert('','end',text='xxx') rz_root=self.t.insert('','end',text='резерв') rez=dict() wwY=[] rrY=[] eeY=[] xxY=[] nnY=[] hhY=[] rzY=[] for mm in [1,2,3,4]: mmm=[str((mm-1)*3+x).zfill(2) for x in [1,2,3]] mmm=[x for x in mmm if x in data[y]] tag='' k=['табель' in data[y][m]['degur'] for m in mmm] #print(k) if v=='авто': if k==[True, True, True]: vv='табель' tag=vv else: vv='план' elif v=='табель': if k!=[True, True, True]: vv='план' tag='ош' else: vv=v tag=vv else: vv=v ww=[] rr=[] ee=[] xx=[] nn=[] hh=[] rz=[] for m in mmm: d=data[y][m] for j in cols: s=d['degur'][vv].get(j,'*ООООООООООООООООООООООООООООООО*') rez[j]=analyse2(s,d) NUL=(0,0,0,0,0,0,0) ww.append([rez.get(j,NUL)[0] for j in cols]) ee.append([rez.get(j,NUL)[0]-rez.get(j,NUL)[3] + \ rez.get(j,NUL)[4] for j in cols]) xx.append([rez.get(j,NUL)[0]-rez.get(j,NUL)[3] for j in cols]) rr.append([rez.get(j,NUL)[3]-rez.get(j,NUL)[4] for j in cols]) nn.append([rez.get(j,NUL)[1] for j in cols]) hh.append([rez.get(j,NUL)[2] for j in cols]) rz.append([rez.get(j,NUL)[5] for j in cols]) ww=[sum(x) for x in zip(*ww)] rr=[sum(x) for x in zip(*rr)] ee=[sum(x) for x in zip(*ee)] xx=[sum(x) for x in zip(*xx)] nn=[sum(x) for x in zip(*nn)] hh=[sum(x) for x in zip(*hh)] rz=[sum(x) for x in zip(*rz)] wwY.append(ww) rrY.append(rr) eeY.append(ee) xxY.append(xx) nnY.append(nn) hhY.append(hh) rzY.append(rz) self.t.insert(w,'end',text=mm,values=ww,tag=tag) self.t.insert(r,'end',text=mm,values=rr,tag=tag) self.t.insert(n,'end',text=mm,values=nn,tag=tag) self.t.insert(h,'end',text=mm,values=hh,tag=tag) self.t.insert(e,'end',text=mm,values=ee,tag=tag) self.t.insert(x,'end',text=mm,values=xx,tag=tag) self.t.insert(rz_root,'end',text=mm,values=rz,tag=tag) wwY=[sum(x) for x in zip(*wwY)] rrY=[sum(x) for x in zip(*rrY)] eeY=[sum(x) for x in zip(*eeY)] xxY=[sum(x) for x in zip(*xxY)] nnY=[sum(x) for x in zip(*nnY)] hhY=[sum(x) for x in zip(*hhY)] rzY=[sum(x) for x in zip(*rzY)] self.t.insert(w,'end',text='итого',values=wwY,tag='Y') self.t.insert(r,'end',text='итого',values=rrY,tag='Y') self.t.insert(n,'end',text='итого',values=nnY,tag='Y') self.t.insert(h,'end',text='итого',values=hhY,tag='Y') self.t.insert(e,'end',text='итого',values=eeY,tag='Y') self.t.insert(x,'end',text='итого',values=xxY,tag='Y') self.t.insert(rz_root,'end',text='итого',values=rzY,tag='Y')
def digiclock(w): pane = tkinter.tix.PanedWindow(w, orientation='vertical') pane.pack(side=tkinter.tix.TOP, expand=1, fill=BOTH) f1 = pane.add('time',size=190) f2 = pane.add('options') f2pane = tkinter.tix.PanedWindow(f2, orientation='horizontal') f2pane.pack(side=tkinter.tix.TOP, expand=1, fill=BOTH) f2f1 = f2pane.add('alarm',size=150) f2f2 = f2pane.add('event') global al_status,al_time,m m='am' ts_status=ON al_status=OFF al_time=str() colour=['orange','red','violet','pink','blue','grey'] def ConfigEvents(): now=ctime().split() year=int(now[4]) mon=now[1].lower() date=int(now[2]) notes=CalLookUp( mon ) for each_item in Entries.get_children(): Entries.delete(each_item) ordered=[] for memo in notes: if(int(memo) >= date): ordered.append(memo) ordered.sort() for memo in ordered: for note in notes[memo]: Entries.insert('', 'end', values=( memo, note[0], note[1]) ) def displayTime(st,ts): global al_time,m sleep(3) day={'Mon' : 'Monday' , 'Tue' : 'Tuesday' , 'Wed' : 'Wednesday', 'Thu' : 'Thursday', 'Fri' : 'Friday' , 'Sat' : 'Saturday', 'Sun' : 'Sunday' } while(st): ct=ctime().split(' ') m='AM' if int(ct[3].split(':')[0])>11 : m='PM' if int(ct[3].split(':')[0])>12 : ct[3]=str( int( ct[3][:2] )-12 ) + ct[3][2:] if (ct[3].split(':')[0] == '00' ): ct[3]='12' + ct[3][2:] ConfigEvents() #~ if (not int(ct[3].split(':')[2])%10): ts.config( bg=colour[ int( int( ct[3].split(':')[2] )/10) ] ) mhs=ct[3].split(':') mode= { 'time&date' :'%s-%s-%s\n%s\n%0.2d:%0.2d:%0.2d %s'%(ct[1],ct[2],ct[4],day[ct[0]],int(mhs[0]),int(mhs[1]),int(mhs[2]),m), 'time' :'%0.2d:%0.2d:%0.2d %s'%(int(mhs[0]),int(mhs[1]),int(mhs[2]),m) } text =mode['time&date'] #~ print(ct) ts.config(text=text) #~ print(al_time,mode['time'],al_time==mode['time']) if(al_time==mode['time']): set.config( text='Stop' ) cal.config( text='Expired @ ' + al_time[:-2] ) thread.start_new_thread(lambda snd='ringout', repeat=ON :play( snd, repeat ) ,() ) sleep(1) def sett(): global al_status,sound_continueous,al_time if(al_status): al_status = OFF sound_continueous = OFF al_time = '' cal.config( text='No Alarm' ) set.config( text='Set' ) else: al_status = ON al_time = at.entry.get()+' '+ampm.entry.get() cal.config( text='Set @ ' + al_time ) set.config( text='Remove' ) bg='orange' #~ time frame tf=Frame( f1, bg='black' ) ts=Label( tf ,text="rajiv.m1991\n@\ngmail.com" ,font='times 40' ,bg='violet' ,width=11 ,fg='white') tf.pack(fill=BOTH) ts.pack(fill=X) #~ alarm frame af=Frame(f2f1,bg=bg) al=Label( af ,text="$ Alarm $" ,font='times' ,fg='white' ,bg='black') at=LabelEntry( af, label='HH:MM:SS', bg=bg ) at.label.config( fg='white', bg=bg ) at.entry.config( width=13, borderwidth=0 ) at.entry.insert( 0, '00:00:00' ) ampm=LabelEntry( af, label='AM / PM ', bg=bg ) ampm.entry.config( borderwidth=0 ) ampm.label.config( fg='white', bg=bg) if( int( ctime().split(' ')[3].split(':')[0]) > 11 ): ampm.entry.insert( 0,'PM' ) else: ampm.entry.insert( 0, 'AM' ) set=Button(af ,text='Set' ,command=sett ,fg='brown') ast=Label( af ,text='Alarm status:' ,fg='white' ,bg=bg ,anchor='sw') cal=Label( af ,text='No Alarm' ,fg='white' ,bg='black' ,anchor='sw') af.pack(fill=BOTH) al.pack(fill=X) at.pack(fill=X,padx=5,pady=5) ampm.pack(fill=X,padx=5,pady=5) set.pack() ast.pack(fill=X) cal.pack(fill=X) #~ options L=Label(f2f2,text="Upcoming Events") L.pack(fill=X) tree_columns = ("Dt", "Note", "Category") Entries=Treeview( f2f2, columns=tree_columns, show="headings", height=5) vsb = Scrollbar(f2f2,orient="vertical", command=Entries.yview) Entries.configure(yscrollcommand=vsb.set) for col in tree_columns: Entries.heading(col, text=col.title()) Entries.column(tree_columns[0],width=20) Entries.column(tree_columns[1],width=75) Entries.column(tree_columns[2],width=75) vsb.pack(side=RIGHT,fill=Y) Entries.pack(fill=BOTH) #~ start clock ConfigEvents() thread.start_new_thread(lambda st=ts_status ,ts=ts : displayTime(st,ts),()) print('Digital Clock Successfully built')
class DialogPackageManager(Toplevel): def __init__(self, mainWin, packageNamesWithNewerFileDates): super(DialogPackageManager, self).__init__(mainWin.parent) self.ENABLE = _("Enable") self.DISABLE = _("Disable") self.parent = mainWin.parent self.cntlr = mainWin # copy plugins for temporary display self.packagesConfig = PackageManager.packagesConfig self.packagesConfigChanged = False self.packageNamesWithNewerFileDates = packageNamesWithNewerFileDates parentGeometry = re.match("(\d+)x(\d+)[+]?([-]?\d+)[+]?([-]?\d+)", self.parent.geometry()) dialogX = int(parentGeometry.group(3)) dialogY = int(parentGeometry.group(4)) self.title(_("Taxonomy Packages Manager")) frame = Frame(self) # left button frame buttonFrame = Frame(frame, width=40) buttonFrame.columnconfigure(0, weight=1) addLabel = Label(buttonFrame, text=_("Find taxonomy packages:"), wraplength=64, justify="center") addLocalButton = Button(buttonFrame, text=_("Locally"), command=self.findLocally) ToolTip(addLocalButton, text=_("File chooser allows selecting taxonomy packages to add (or reload), from the local file system. " "Select either a taxonomy package zip file, or a taxonomy manifest (.taxonomyPackage.xml) within an unzipped taxonomy package. "), wraplength=240) addWebButton = Button(buttonFrame, text=_("On Web"), command=self.findOnWeb) ToolTip(addWebButton, text=_("Dialog to enter URL full path to load (or reload) package, from the web or local file system. " "URL may be either a taxonomy package zip file, or a taxonomy manifest (.taxonomyPackage.xml) within an unzipped taxonomy package. "), wraplength=240) manifestNameButton = Button(buttonFrame, text=_("Manifest"), command=self.manifestName) ToolTip(manifestNameButton, text=_("Provide non-standard archive manifest file name pattern (e.g., *taxonomyPackage.xml). " "Uses unix file name pattern matching. " "Multiple manifest files are supported in archive (such as oasis catalogs). " "(Replaces search for either .taxonomyPackage.xml or catalog.xml). "), wraplength=240) self.manifestNamePattern = "" addLabel.grid(row=0, column=0, pady=4) addLocalButton.grid(row=1, column=0, pady=4) addWebButton.grid(row=2, column=0, pady=4) manifestNameButton.grid(row=3, column=0, pady=4) buttonFrame.grid(row=0, column=0, rowspan=3, sticky=(N, S, W), padx=3, pady=3) # right tree frame (packages already known to arelle) packagesFrame = Frame(frame, width=700) vScrollbar = Scrollbar(packagesFrame, orient=VERTICAL) hScrollbar = Scrollbar(packagesFrame, orient=HORIZONTAL) self.packagesView = Treeview(packagesFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=7) self.packagesView.grid(row=0, column=0, sticky=(N, S, E, W)) self.packagesView.bind('<<TreeviewSelect>>', self.packageSelect) hScrollbar["command"] = self.packagesView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.packagesView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) packagesFrame.columnconfigure(0, weight=1) packagesFrame.rowconfigure(0, weight=1) packagesFrame.grid(row=0, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.packagesView.focus_set() self.packagesView.column("#0", width=120, anchor="w") self.packagesView.heading("#0", text=_("Name")) self.packagesView["columns"] = ("ver", "status", "date", "update", "descr") self.packagesView.column("ver", width=150, anchor="w", stretch=False) self.packagesView.heading("ver", text=_("Version")) self.packagesView.column("status", width=50, anchor="w", stretch=False) self.packagesView.heading("status", text=_("Status")) self.packagesView.column("date", width=170, anchor="w", stretch=False) self.packagesView.heading("date", text=_("File Date")) self.packagesView.column("update", width=50, anchor="w", stretch=False) self.packagesView.heading("update", text=_("Update")) self.packagesView.column("descr", width=200, anchor="w", stretch=False) self.packagesView.heading("descr", text=_("Description")) remappingsFrame = Frame(frame) vScrollbar = Scrollbar(remappingsFrame, orient=VERTICAL) hScrollbar = Scrollbar(remappingsFrame, orient=HORIZONTAL) self.remappingsView = Treeview(remappingsFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=5) self.remappingsView.grid(row=0, column=0, sticky=(N, S, E, W)) hScrollbar["command"] = self.remappingsView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.remappingsView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) remappingsFrame.columnconfigure(0, weight=1) remappingsFrame.rowconfigure(0, weight=1) remappingsFrame.grid(row=1, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.remappingsView.focus_set() self.remappingsView.column("#0", width=200, anchor="w") self.remappingsView.heading("#0", text=_("Prefix")) self.remappingsView["columns"] = ("remapping") self.remappingsView.column("remapping", width=500, anchor="w", stretch=False) self.remappingsView.heading("remapping", text=_("Remapping")) # bottom frame package info details packageInfoFrame = Frame(frame, width=700) packageInfoFrame.columnconfigure(1, weight=1) self.packageNameLabel = Label(packageInfoFrame, wraplength=600, justify="left", font=font.Font(family='Helvetica', size=12, weight='bold')) self.packageNameLabel.grid(row=0, column=0, columnspan=6, sticky=W) self.packageVersionHdr = Label(packageInfoFrame, text=_("version:"), state=DISABLED) self.packageVersionHdr.grid(row=1, column=0, sticky=W) self.packageVersionLabel = Label(packageInfoFrame, wraplength=600, justify="left") self.packageVersionLabel.grid(row=1, column=1, columnspan=5, sticky=W) self.packageDescrHdr = Label(packageInfoFrame, text=_("description:"), state=DISABLED) self.packageDescrHdr.grid(row=2, column=0, sticky=W) self.packageDescrLabel = Label(packageInfoFrame, wraplength=600, justify="left") self.packageDescrLabel.grid(row=2, column=1, columnspan=5, sticky=W) self.packagePrefixesHdr = Label(packageInfoFrame, text=_("prefixes:"), state=DISABLED) self.packagePrefixesHdr.grid(row=3, column=0, sticky=W) self.packagePrefixesLabel = Label(packageInfoFrame, wraplength=600, justify="left") self.packagePrefixesLabel.grid(row=3, column=1, columnspan=5, sticky=W) ToolTip(self.packagePrefixesLabel, text=_("List of prefixes that this package remaps."), wraplength=240) self.packageUrlHdr = Label(packageInfoFrame, text=_("URL:"), state=DISABLED) self.packageUrlHdr.grid(row=4, column=0, sticky=W) self.packageUrlLabel = Label(packageInfoFrame, wraplength=600, justify="left") self.packageUrlLabel.grid(row=4, column=1, columnspan=5, sticky=W) ToolTip(self.packageUrlLabel, text=_("URL of taxonomy package (local file path or web loaded file)."), wraplength=240) self.packageDateHdr = Label(packageInfoFrame, text=_("date:"), state=DISABLED) self.packageDateHdr.grid(row=5, column=0, sticky=W) self.packageDateLabel = Label(packageInfoFrame, wraplength=600, justify="left") self.packageDateLabel.grid(row=5, column=1, columnspan=5, sticky=W) ToolTip(self.packageDateLabel, text=_("Date of currently loaded package file (with parenthetical node when an update is available)."), wraplength=240) self.packageEnableButton = Button(packageInfoFrame, text=self.ENABLE, state=DISABLED, command=self.packageEnable) ToolTip(self.packageEnableButton, text=_("Enable/disable package."), wraplength=240) self.packageEnableButton.grid(row=6, column=1, sticky=E) self.packageMoveUpButton = Button(packageInfoFrame, text=_("Move Up"), state=DISABLED, command=self.packageMoveUp) ToolTip(self.packageMoveUpButton, text=_("Move package up (above other remappings)."), wraplength=240) self.packageMoveUpButton.grid(row=6, column=2, sticky=E) self.packageMoveDownButton = Button(packageInfoFrame, text=_("Move Down"), state=DISABLED, command=self.packageMoveDown) ToolTip(self.packageMoveDownButton, text=_("Move package down (below other remappings)."), wraplength=240) self.packageMoveDownButton.grid(row=6, column=3, sticky=E) self.packageReloadButton = Button(packageInfoFrame, text=_("Reload"), state=DISABLED, command=self.packageReload) ToolTip(self.packageReloadButton, text=_("Reload/update package."), wraplength=240) self.packageReloadButton.grid(row=6, column=4, sticky=E) self.packageRemoveButton = Button(packageInfoFrame, text=_("Remove"), state=DISABLED, command=self.packageRemove) ToolTip(self.packageRemoveButton, text=_("Remove package from packages table (does not erase the package file)."), wraplength=240) self.packageRemoveButton.grid(row=6, column=5, sticky=E) packageInfoFrame.grid(row=2, column=0, columnspan=5, sticky=(N, S, E, W), padx=3, pady=3) packageInfoFrame.config(borderwidth=4, relief="groove") okButton = Button(frame, text=_("Close"), command=self.ok) ToolTip(okButton, text=_("Accept and changes (if any) and close dialog."), wraplength=240) cancelButton = Button(frame, text=_("Cancel"), command=self.close) ToolTip(cancelButton, text=_("Cancel changes (if any) and close dialog."), wraplength=240) okButton.grid(row=3, column=3, sticky=(S,E), pady=3) cancelButton.grid(row=3, column=4, sticky=(S,E), pady=3, padx=3) self.loadTreeViews() self.geometry("+{0}+{1}".format(dialogX+50,dialogY+100)) frame.grid(row=0, column=0, sticky=(N,S,E,W)) frame.columnconfigure(0, weight=0) frame.columnconfigure(1, weight=1) frame.rowconfigure(0, weight=1) window = self.winfo_toplevel() window.columnconfigure(0, weight=1) window.rowconfigure(0, weight=1) self.bind("<Return>", self.ok) self.bind("<Escape>", self.close) self.protocol("WM_DELETE_WINDOW", self.close) self.grab_set() self.wait_window(self) def loadTreeViews(self): self.selectedModule = None # clear previous treeview entries for previousNode in self.packagesView.get_children(""): self.packagesView.delete(previousNode) for i, packageInfo in enumerate(self.packagesConfig.get("packages", [])): name = packageInfo.get("name", "package{}".format(i)) node = self.packagesView.insert("", "end", "_{}".format(i), text=name) self.packagesView.set(node, "ver", packageInfo.get("version")) self.packagesView.set(node, "status", packageInfo.get("status")) self.packagesView.set(node, "date", packageInfo.get("fileDate")) if name in self.packageNamesWithNewerFileDates: self.packagesView.set(node, "update", _("available")) self.packagesView.set(node, "descr", packageInfo.get("description")) # clear previous treeview entries for previousNode in self.remappingsView.get_children(""): self.remappingsView.delete(previousNode) for i, remappingItem in enumerate(sorted(self.packagesConfig.get("remappings", {}).items())): prefix, remapping = remappingItem node = self.remappingsView.insert("", "end", prefix, text=prefix) self.remappingsView.set(node, "remapping", remapping) self.packageSelect() # clear out prior selection def ok(self, event=None): if self.packagesConfigChanged: PackageManager.packagesConfig = self.packagesConfig PackageManager.packagesConfigChanged = True self.cntlr.onPackageEnablementChanged() self.close() def close(self, event=None): self.parent.focus_set() self.destroy() def packageSelect(self, *args): node = (self.packagesView.selection() or (None,))[0] try: nodeIndex = int(node[1:]) except (ValueError, TypeError): nodeIndex = -1 if 0 <= nodeIndex < len(self.packagesConfig["packages"]): packageInfo = self.packagesConfig["packages"][nodeIndex] self.selectedPackageIndex = nodeIndex name = packageInfo["name"] self.packageNameLabel.config(text=name) self.packageVersionHdr.config(state=ACTIVE) self.packageVersionLabel.config(text=packageInfo["version"]) self.packageDescrHdr.config(state=ACTIVE) self.packageDescrLabel.config(text=packageInfo["description"]) self.packagePrefixesHdr.config(state=ACTIVE) self.packagePrefixesLabel.config(text=', '.join(packageInfo["remappings"].keys())) self.packageUrlHdr.config(state=ACTIVE) self.packageUrlLabel.config(text=packageInfo["URL"]) self.packageDateHdr.config(state=ACTIVE) self.packageDateLabel.config(text=packageInfo["fileDate"] + " " + (_("(an update is available)") if name in self.packageNamesWithNewerFileDates else "")) self.packageEnableButton.config(state=ACTIVE, text={"enabled":self.DISABLE, "disabled":self.ENABLE}[packageInfo["status"]]) self.packageMoveUpButton.config(state=ACTIVE if 0 < nodeIndex else DISABLED) self.packageMoveDownButton.config(state=ACTIVE if nodeIndex < (len(self.packagesConfig["packages"]) - 1) else DISABLED) self.packageReloadButton.config(state=ACTIVE) self.packageRemoveButton.config(state=ACTIVE) else: self.selectedPackageIndex = -1 self.packageNameLabel.config(text="") self.packageVersionHdr.config(state=DISABLED) self.packageVersionLabel.config(text="") self.packageDescrHdr.config(state=DISABLED) self.packageDescrLabel.config(text="") self.packagePrefixesHdr.config(state=DISABLED) self.packagePrefixesLabel.config(text="") self.packageUrlHdr.config(state=DISABLED) self.packageUrlLabel.config(text="") self.packageDateHdr.config(state=DISABLED) self.packageDateLabel.config(text="") self.packageEnableButton.config(state=DISABLED, text=self.ENABLE) self.packageMoveUpButton.config(state=DISABLED) self.packageMoveDownButton.config(state=DISABLED) self.packageReloadButton.config(state=DISABLED) self.packageRemoveButton.config(state=DISABLED) def findLocally(self): initialdir = self.cntlr.pluginDir # default plugin directory if not self.cntlr.isMac: # can't navigate within app easily, always start in default directory initialdir = self.cntlr.config.setdefault("packageOpenDir", initialdir) filename = self.cntlr.uiFileDialog("open", parent=self, title=_("Choose taxonomy package file"), initialdir=initialdir, filetypes=[(_("Taxonomy package files (*.zip)"), "*.zip"), (_("Manifest (*.taxonomyPackage.xml)"), "*.taxonomyPackage.xml"), (_("Oasis Catalog (*catalog.xml)"), "*catalog.xml")], defaultextension=".zip") if filename: # check if a package is selected (any file in a directory containing an __init__.py self.cntlr.config["packageOpenDir"] = os.path.dirname(filename) packageInfo = PackageManager.packageInfo(filename, packageManifestName=self.manifestNamePattern) self.loadFoundPackageInfo(packageInfo, filename) def findOnWeb(self): url = DialogURL.askURL(self) if url: # url is the in-cache or local file packageInfo = PackageManager.packageInfo(url, packageManifestName=self.manifestNamePattern) self.cntlr.showStatus("") # clear web loading status self.loadFoundPackageInfo(packageInfo, url) def manifestName(self): self.manifestNamePattern = simpledialog.askstring(_("Archive manifest file name pattern"), _("Provide non-standard archive manifest file name pattern (e.g., *taxonomyPackage.xml). \n" "Uses unix file name pattern matching. \n" "Multiple manifest files are supported in archive (such as oasis catalogs). \n" "(If blank, search for either .taxonomyPackage.xml or catalog.xml). "), initialvalue=self.manifestNamePattern, parent=self) def loadFoundPackageInfo(self, packageInfo, url): if packageInfo and packageInfo.get("name"): self.addPackageInfo(packageInfo) self.loadTreeViews() else: messagebox.showwarning(_("Package is not itself a taxonomy package. "), _("File does not itself contain a manifest file: \n\n{0}\n\n " "If opening an archive file, the manifest file search pattern currently is \"\", please press \"Manifest\" to change manifest file name pattern, e.g.,, \"*.taxonomyPackage.xml\", if needed. ") .format(url), parent=self) def removePackageInfo(self, name, version): # find package entry packagesList = self.packagesConfig["packages"] j = -1 for i, packageInfo in enumerate(packagesList): if packageInfo['name'] == name and packageInfo['version'] == version: j = i break if 0 <= j < len(packagesList): del self.packagesConfig["packages"][i] self.packagesConfigChanged = True def addPackageInfo(self, packageInfo): name = packageInfo["name"] version = packageInfo["version"] self.removePackageInfo(name, version) # remove any prior entry for this package self.packageNamesWithNewerFileDates.discard(name) # no longer has an update available self.packagesConfig["packages"].append(packageInfo) PackageManager.rebuildRemappings() self.packagesConfigChanged = True def packageEnable(self): if 0 <= self.selectedPackageIndex < len(self.packagesConfig["packages"]): packageInfo = self.packagesConfig["packages"][self.selectedPackageIndex] if self.packageEnableButton['text'] == self.ENABLE: packageInfo["status"] = "enabled" self.packageEnableButton['text'] = self.DISABLE elif self.packageEnableButton['text'] == self.DISABLE: packageInfo["status"] = "disabled" self.packageEnableButton['text'] = self.ENABLE self.packagesConfigChanged = True PackageManager.rebuildRemappings() self.loadTreeViews() def packageMoveUp(self): if 1 <= self.selectedPackageIndex < len(self.packagesConfig["packages"]): packages = self.packagesConfig["packages"] packageInfo = packages[self.selectedPackageIndex] del packages[self.selectedPackageIndex] packages.insert(self.selectedPackageIndex -1, packageInfo) self.packagesConfigChanged = True PackageManager.rebuildRemappings() self.loadTreeViews() def packageMoveDown(self): if 0 <= self.selectedPackageIndex < len(self.packagesConfig["packages"]) - 1: packages = self.packagesConfig["packages"] packageInfo = packages[self.selectedPackageIndex] del packages[self.selectedPackageIndex] packages.insert(self.selectedPackageIndex + 1, packageInfo) self.packagesConfigChanged = True PackageManager.rebuildRemappings() self.loadTreeViews() def packageReload(self): if 0 <= self.selectedPackageIndex < len(self.packagesConfig["packages"]): packageInfo = self.packagesConfig["packages"][self.selectedPackageIndex] url = packageInfo.get("URL") if url: packageInfo = PackageManager.packageInfo(url, reload=True, packageManifestName=packageInfo.get("manifestName")) if packageInfo: self.addPackageInfo(packageInfo) PackageManager.rebuildRemappings() self.loadTreeViews() self.cntlr.showStatus(_("{0} reloaded").format(packageInfo.get("name")), clearAfter=5000) else: messagebox.showwarning(_("Package error"), _("File or package cannot be reloaded: \n\n{0}") .format(url), parent=self) def packageRemove(self): if 0 <= self.selectedPackageIndex < len(self.packagesConfig["packages"]): packageInfo = self.packagesConfig["packages"][self.selectedPackageIndex] self.removePackageInfo(packageInfo["name"], packageInfo["version"]) self.packagesConfigChanged = True PackageManager.rebuildRemappings() self.loadTreeViews()
class hyGUI(Frame): def __init__(self): Frame.__init__(self) self.master.title("Hockey team Data") self.master.maxsize(1400, 1000) ## Maximum Frame size self.pack() self._treeview = Treeview(self) ## initialize the treeview ## Writing label on gui and creating a data insert box to get user input when clicking a button self.gameLocationLabel = Label(self, text = "Enter game location") self.gameLocationLabel.pack() self.gameLocationVar = StringVar() self.gameLocationEntry = Entry(self, textvariable = self.gameLocationVar, width=30) self.gameLocationEntry.pack() self.gameDateLabel = Label(self, text = "Enter game date") self.gameDateLabel.pack() self.gameDateVar = StringVar() self.gameDateEntry = Entry(self, textvariable = self.gameDateVar, width = 30) self.gameDateEntry.pack() self.hatSoldLabel = Label(self, text = "Enter how many hats were sold") self.hatSoldLabel.pack() self.hatSoldVar = StringVar() self.hatSoldEntry = Entry(self, textvariable = self.hatSoldVar, width = 30) self.hatSoldEntry.pack() self.posterSoldLabel = Label(self, text = "Enter how many poster were sold") self.posterSoldLabel.pack() self.posterSoldVar = StringVar() self.posterSoldEntry = Entry(self, textvariable = self.posterSoldVar, width = 30) self.posterSoldEntry.pack() self.jerseySoldLabel = Label(self, text = "Enter how many jersey were sold") self.jerseySoldLabel.pack() self.jerseySoldVar = StringVar() self.jerseySoldEntry = Entry(self, textvariable = self.jerseySoldVar, width = 30) self.jerseySoldEntry.pack() self.hockeyStickSoldLabel = Label(self, text = "Enter how many hockey stick were sold") self.hockeyStickSoldLabel.pack() self.hockeyStickSoldVar = StringVar() self.hockeyStickSoldEntry = Entry(self, textvariable = self.hockeyStickSoldVar, width = 30) self.hockeyStickSoldEntry.pack() ## Creating space between the button on the GUI interface self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Add button self._addButton = Button(self, text="Add", command=self._add) self._addButton.pack() self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Delete button self._addButton = Button(self, text="Delete", command=self._delete) self._addButton.pack() self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Exit button self._exitButton = Button(self, text="Exit", command=self._exit) self._exitButton.pack() self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Best item sold button self._bestItemButton = Button(self, text="Best Item Sold", command=self._bestItem) self._bestItemButton.pack() self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Worst item sold button self._worstItemButton = Button(self, text="Worst Item Sold", command=self._worstItem) self._worstItemButton.pack() self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Best sales per game button self._itemButton = Button(self, text="Game for best Sales", command=self._item) self._itemButton.pack() ## this button is not packed but, it is needed to populate the table self._tableButton = Button(self, text = "Show the Complete table", command =self._maketable()) self._resultVar = StringVar() self._resultLabel = Label(self, text=" \n ", textvariable=self._resultVar) self._resultLabel.pack() ## Using empty sting label to display the different text on GUI Frame when clicking button self.resultBestLabel = Label(self, text = "") self.resultBestLabel.pack() self._treeview['columns']=('location', 'date', 'no_hats', 'val_hats', 'no_jerseys', 'val_jerseys', 'no_hockstick', 'val_hockstick', 'no_posters', 'val_posters','total_sales') ## Creating a columns name heading for the table self._treeview.heading('location', text = "Location") self._treeview.column('#0', width = 0) self._treeview.heading('date', text = "Date") self._treeview.heading('no_hats', text = "# hats") self._treeview.heading('val_hats', text = "$ hats") self._treeview.heading('no_jerseys', text = "# jerseys") self._treeview.heading('val_jerseys', text = "$ jerseys") self._treeview.heading('no_hockstick', text = "# hockey stick") self._treeview.heading('val_hockstick', text = "$ hockey stick") self._treeview.heading('no_posters', text = "# posters") self._treeview.heading('val_posters', text = "$ posters") self._treeview.heading('total_sales', text = "Total Sales") ## The column size is 100 for item in self._treeview['columns']: self._treeview.column(item, width = 100) self._treeview.pack() ## Calling for database table to be displayed on GUI frame def _maketable(self): makeTableDatabase(self) ## when clicking add button with the user input, it will get the user input and add the data to the database def _add(self): location = self.gameLocationVar.get() date = self.gameDateVar.get() hat = self.hatSoldVar.get() jersey = self.jerseySoldVar.get() stick = self.hockeyStickSoldVar.get() poster = self.posterSoldVar.get() hatTotal = int(hat) * 20 ## Calculate hat quantity sold with hat retail price of $20 jerseyTotal = int(jersey) * 40 ## Calculate jersey quantity sold with jersey retail price of $20 stickTotal = int(stick) * 30 ## Calculate hockey stick quantity sold with hockey stick retail price of $20 posterTotal = int(poster) * 10 ## Calculate poster quantity sold with poster retail price of $20 TotalSales = posterTotal + stickTotal + jerseyTotal + hatTotal # calculation of total sales of the game ## Calling add_data method with the user input and calculated value to a add a data to a database add_data(location, date, hat, hatTotal, jersey, jerseyTotal, stick, stickTotal, poster, posterTotal, TotalSales) ## update the data on the table update_table(self) ## when delete button is pressed, it will call deleteData method def _delete(self): deleteData(self) # when exit button is clicked, the GUI frame close def _exit(self): sys.exit() # when best item button is clicked, it will calculate the best item sold amount per game def _bestItem(self): bestItem(self) # when worst item button is clicked, it will calculate the worst item sold amount per game def _worstItem(self): worstItem(self) # when game for best sales button were clicked, it will display the game location # for the best total sales per game def _item(self): bestSalesGame(self)
class Expenses(Frame): # Creates the first option menus in the expense window def createOptionButtons(self): self.master.title("Expenses") # Creates the add item to inventory button addItem = Button(root, text="Add item to inventory", command=lambda: self.sequence(self.addItem))#addItem(master))) # This button will send to the user to the add item page addItem.place(x = 130, y = 100) # Creates the view items in inventory button inventoryButton = Button(root, text="View items in inventory", command=lambda: self.sequence(self.viewInveroty)) # This button will send the user to the view inventory page inventoryButton.place(x = 130, y = 150) # Create the total cost button totalCost = Button(root, text="Total Cost", command=lambda: self.sequence(self.viewTotalCost)) totalCost.place(x = 130, y = 200) # Creates the back button backButton = Button(root, text="Back", command=returnHome) # This button will return the user to the main page. Still working on it. backButton.place(x = 50, y = 350) # Creates the add item to inventory button and entries def addItem(self): self.master.title("Add new item") # Changes the title of the page to Add New Item # Creates a label called nameOfItems and an entry called itemName nameOfItem = Label(root, text="Item Name: ") nameOfItem.place(x = 110, y = 100) self.itemName = Entry(root) # This will allow the user to enter the name of the item that they will be adding self.itemName.place(x = 190, y = 100) # Creates the label called itemTypeLabel and a drop down menu called itemTypeChoice itemTypeLabel = Label(root, text = "Item's type: ") itemTypeLabel.place(x = 110, y = 160) self.itemTypeChoice = StringVar(root) # This makes itemTypeChoice a permanent String self.itemTypeChoice.set("Tree") # Tree is set to the default string of itemTypeChoice typeChoices = OptionMenu(root, self.itemTypeChoice, "Tree", "Animal", "Machine") # Drop down menu is created and options Tree, Animal, and Machine are added to the menu typeChoices.place(x = 190, y = 160) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.createOptionButtons)) backButton.place(x = 50, y = 350) # Next button nextButton = Button(root, text = "Next", command=self.saveNameAndType) #This button will send the user to the add inventory page nextButton.place(x = 350, y = 350) # Function that creates a new item object and assigns it a name and the type def saveNameAndType(self): name = self.itemName.get() self.item = Inventory(name) itemType = self.itemTypeChoice.get() self.item.itemType = itemType self.sequence(self.addToInventory) # Creates the add to inventory options def addToInventory(self): self.master.title("Add %s to %s inventory" % (self.item.name, self.item.itemType)) # This assigns the variables month, day, and year to be value holder for integer values # They are also set to be values of the class expenses (by using self) so that they can # be used in the function updateDay and SaveDate self.month = IntVar(self) self.day = IntVar(self) self.year = IntVar(self) # This trace function is used to keep track of when the selected months and years change. This is # done to adjust the days of the month according to the month or the year self.month.trace('w', self.updateDay) self.year.trace('w', self.updateDay) numMonths = self.nums(1, 12) # Runs the nums function that creates a list from 1 to 12 numYears = self.nums(2015, 2030) # Runs the nums function that creates a list from 2015 to 2030 # This creates the drop down menu and assigns the options is the menu. The day menu is left empty and # is assigned in the updateDay function self.optionmenu_month = OptionMenu(root, self.month, *numMonths) self.optionmenu_day = OptionMenu(root, self.day, '') self.optionmenu_year = OptionMenu(root, self.year, *numYears) # Sets the default value of the month and year options to 1 and 2015 respectively self.month.set(numMonths[0]) self.year.set(numYears[0]) self.optionmenu_month.place(x = 100, y = 120) self.optionmenu_day.place(x = 150, y = 120) self.optionmenu_year.place(x = 200, y = 120) datePurchased = Label(root, text = "Date Purchased") datePurchased.place(x = 150, y = 95) quantityPurchasedLabel = Label(root, text="Amount purchased:") quantityPurchasedLabel.place(x = 50, y = 180) self.quantityPurchasedEntry = Entry(root, bd=5) # Creates input box for user to insert the amount of items purchased self.quantityPurchasedEntry.place(x = 180, y = 180) pricePaidLabe = Label(root, text="Price paid for all: ") pricePaidLabe.place(x = 50, y = 210) self.pricePaidEntry = Entry(root, bd=5) # Creates input box for user to insert the price paid for the item self.pricePaidEntry.place(x = 180, y = 210) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.addItem)) backButton.place(x = 50, y = 350) nextButton = Button(root, text = "Next", command=self.saveQuanAndPrice) nextButton.place(x = 350, y = 350) # This function will update the days of the month according to the selected month and year def updateDay(self, *args): # The .get() will obtain the selected month and year values from the drop down menu above month = self.month.get() year = self.year.get() # Creates a loop which chooses the last day of the month according to the month or the year if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12: lastDay = 31 elif month == 4 or month == 6 or month == 9 or month == 11: lastDay = 30 # This elif loop uses the leap year formula at account for leap years elif month == 2: if (year % 4) == 0: if (year % 100) == 0: if (year % 400) == 0: lastDay = 29 else: lastDay = 28 else: lastDay = 29 else: lastDay = 28 numDays = self.nums(1,lastDay) # Assigns menu to the day drop down menu and deletes all of the options in the menu menu = self.optionmenu_day['menu'] menu.delete(0, 'end') # Loop for generating the new day menu for day in numDays: menu.add_command(label=day, command=lambda d = day: self.day.set(d)) self.day.set(1) # Function that creates the range of numbers for the drop down menu def nums(self, numStart, numEnd): num = range(numStart, numEnd + 1) return num # Function that assigns the price and quantity to an item def saveQuanAndPrice(self): self.item.price = self.pricePaidEntry.get() self.item.quantity = self.quantityPurchasedEntry.get() self.saveDate() self.sequence(self.confirmation) # Function that assigns the purchase date to an item def saveDate(self): self.item.purchaseMonth = self.month.get() self.item.purchaseDay = self.day.get() self.item.purchaseYear = self.year.get() self.item.purchaseDate = ("%s/%s/%s" % (self.item.purchaseMonth, self.item.purchaseDay, self.item.purchaseYear)) # Function that displays the user inputted information def confirmation(self): self.master.title("Confirm %s information" % self.item.name) name = Label(root, text="Name of item: ") name.place(x = 100, y = 50) itemName = Label(root, text=self.item.name) itemName.place(x = 100, y = 65) type = Label(root, text="%s type: " % self.item.name) type.place(x = 100, y = 90) itemType = Label(root, text=self.item.itemType) itemType.place(x = 100, y = 105) quantity = Label(root, text="How many %s were bought?" % self.item.name) quantity.place(x = 100, y = 130) itemQuantity = Label(root, text=self.item.quantity) itemQuantity.place(x = 100, y = 145) price = Label(root, text="How much did the %s %s cost?" % (self.item.quantity, self.item.name)) price.place(x = 100, y = 170) itemPrice = Label(root, text=self.item.price) itemPrice.place(x = 100, y = 185) date = Label(root, text="When were %s bought?" % self.item.name) date.place(x = 100, y = 210) itemDate = Label(root, text=self.item.purchaseDate) itemDate.place(x = 100, y = 225) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.addToInventory)) backButton.place(x = 50, y = 350) startOverButton = Button(root, text = "Start Over", command=lambda: self.sequence(self.createOptionButtons)) startOverButton.place(x = 200, y = 350) confirmButton = Button(root, text = "Confirm", command=lambda: self.sequence(self.addToDatabase)) confirmButton.place(x = 320, y = 350) # Adds the item to the database def addToDatabase(self): self.inventoryDB.insertInvetory(self.item) return self.successful() # Displays a success message when the item is added def successful(self): self.master.title("%s was added successfully!" % self.item.name) succMessage = Message(root, text = "%s was successfully added to the %s list!" % (self.item.name, self.item.itemType)) succMessage.place(x = 150, y = 150) startOverButton = Button(root, text = "Start Over", command=lambda: self.sequence(self.createOptionButtons))#self.saveNameAndType(itemName)))#(self.saveNameAndType(itemName))) # (itemName)))# lambda: self.sequence(self.test)) #This button will send the user to the add inventory page startOverButton.place(x = 150, y = 350) # Used to view the inventory def viewInveroty(self): # Creates the label called chooseTypeLabel and a drop down menu called chooseItemType chooseTypeLabel = Label(root, text = "Item's type: ") chooseTypeLabel.place(x = 110, y = 160) self.chooseItemType = StringVar(root) # The drop down menu is created and assigned to chooseItemType self.chooseItemType.set("Tree") # Tree is set to the default option in the drop down menu typeChoices = OptionMenu(root, self.chooseItemType, "Tree", "Animal", "Machine", "All") # Options Tree, Animal, Machine, and ALL are added to the drop down menu typeChoices.place(x = 190, y = 160) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.createOptionButtons)) # This button will return the user to the expenses option page backButton.place(x = 50, y = 350) nextButton = Button(root, text = "Next", command=lambda: self.sequence(self.displayGeneralInventory))#self.saveNameAndType(itemName)))#(self.saveNameAndType(itemName))) # (itemName)))# lambda: self.sequence(self.test)) #This button will send the user to the add inventory page nextButton.place(x = 350, y = 350) # Used to create the inventory table def displayGeneralInventory(self): # This creates a table using the function Treeview self.tree = Treeview(height="20", columns=("Name", "Current Quantity")) self.tree.pack() self.tree.heading('#1', text = "Name", anchor = CENTER) self.tree.heading('#2', text = "Current Quantity", anchor = CENTER) self.tree.column('#1', minwidth=0, width = 100) self.tree.column('#2', minwidth=0, width = 100) self.tree.column('#0', minwidth=0, width = 0) itemType = self.chooseItemType.get() if(itemType == "All"): self.obtainData("Tree") self.obtainData("Animal") self.obtainData("Machine") else: self.obtainData(itemType) # Adds database data to the inventory table def obtainData(self, type): for row in (self.inventoryDB.getOverviewInventory(type)): name = row[0] totalQuantity = row[1] # Inserts data into the table. Each entry is tagged with the name and the type # This is done in order to make identifying the entries easier for when detailed # tables are requested self.tree.insert("", "end", values = (name,totalQuantity), tag= [name, type]) # Creates a bak function that is used in the displayGeneralInventory functions self.backFunction = self.displayGeneralInventory # Binds a double click function to the Treeview table. If an entry is double clicked, # the function displayGeneralInventory is ran self.tree.bind("<Double-1>", self.displayDetailedInventory) backButton = Button(root, text="Back", command=lambda: self.sequence(self.viewInveroty)) # This button will return the user to the main page. Still working on it. backButton.place(x = 50, y = 350) # Creates table when an entry is double clicked def displayDetailedInventory(self, event): # The selected item's tag are extracted and assigned to name and type itemSelected = self.tree.selection() name = self.tree.item(itemSelected,"tag")[0] type = self.tree.item(itemSelected, "tag")[1] for child in root.winfo_children(): child.destroy() self.createDisplayTable() self.obtainDetailedData(name, type) # Adds detailed database data to the inventory table def obtainDetailedData(self,name, type): for row in (self.inventoryDB.getDetailedInventory(type, name)): name = row[0] purchaseDate = row[1] Quantity = row[3] Price = row[4] self.tree.insert("", "end", values = (name,purchaseDate,Quantity, Price)) backButton = Button(root, text="Back", command=lambda: self.sequence(self.backFunction)) backButton.place(x = 50, y = 350) # Creates the view total cost by month and year buttons def viewTotalCost(self): viewMonth = Button(root, text="View by month", command=lambda: self.sequence(self.viewByMonth)) viewMonth.place(x = 120, y = 100) viewYear = Button(root, text="View by year", command=lambda: self.sequence(self.viewByYear)) viewYear.place(x = 120, y = 150) backButton = Button(root, text="Back", command=lambda: self.sequence(self.createOptionButtons))#displayGeneralInventory)) # This button will return the user to the main page. Still working on it. backButton.place(x = 50, y = 350) # Creates the options for the user to select a month and year def viewByMonth(self): monthLabel = Label(root, text="Month") yearLabel = Label(root, text="Year") self.month = IntVar(self) self.year = IntVar(self) numMonths = self.nums(1, 12) numYears = self.nums(2015, 2030) self.optionmenu_month = OptionMenu(root, self.month, *numMonths) self.optionmenu_year = OptionMenu(root, self.year, *numYears) self.month.set(numMonths[0]) self.year.set(numYears[0]) self.optionmenu_month.place(x = 100, y = 100) self.optionmenu_year.place(x = 150, y = 100) monthLabel.place(x = 100, y = 140) yearLabel.place(x = 150, y = 140) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.viewTotalCost)) # This button will return the user to the expenses option page backButton.place(x = 50, y = 350) nextButton = Button(root, text = "Next", command= self.viewTotalCostMonth)#self.viewTotalCostMonth)#self.saveNameAndType(itemName)))#(self.saveNameAndType(itemName))) # (itemName)))# lambda: self.sequence(self.test)) #This button will send the user to the add inventory page nextButton.place(x = 350, y = 350) # Creates database table and inserts the respective values by month and year def viewTotalCostMonth(self): self.createDisplayTable() self.totalPrice = 0 month = self.month.get() year = self.year.get() self.lengthMonth = len(str(month)) self.searchDate = str(month) + "/" + str(year) InventoryDB = getDatabaseConnection() database = InventoryDB.cursor() self.insertData("DetailedTreeInventory", "Tree", database, "Month") self.insertData("DetailedAnimalInventory", "Animal", database, "Month") self.insertData("DetailedMachineInventory", "Machine", database, "Month") InventoryDB.close() totalPriceLabel = Label(root, text=("Total price for " + calendar.month_name[month] + " in " + str(year) + " is: " + str(self.totalPrice))) totalPriceLabel.place(x = 100, y = 350) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.viewByMonth)) # This button will return the user to the expenses option page backButton.place(x = 50, y = 350) # Creates the option for the user to select the year def viewByYear(self): yearLabel = Label(root, text="Year") self.year = IntVar(self) numYears = self.nums(2015, 2030) self.optionmenu_year = OptionMenu(root, self.year, *numYears) self.year.set(numYears[0]) self.optionmenu_year.place(x = 100, y = 100) yearLabel.place(x = 100, y = 140) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.viewTotalCost)) # This button will return the user to the expenses option page backButton.place(x = 50, y = 350) nextButton = Button(root, text = "Next", command= self.viewTotalCostYear)#self.viewTotalCostMonth)#self.saveNameAndType(itemName)))#(self.saveNameAndType(itemName))) # (itemName)))# lambda: self.sequence(self.test)) #This button will send the user to the add inventory page nextButton.place(x = 350, y = 350) # Creates database table and inserts the respective values by year def viewTotalCostYear(self): self.createDisplayTable() self.totalPrice = 0 year = self.year.get() InventoryDB = getDatabaseConnection() database = InventoryDB.cursor() self.insertData("DetailedTreeInventory", "Tree", database, "Year") self.insertData("DetailedAnimalInventory", "Animal", database, "Year") self.insertData("DetailedMachineInventory", "Machine", database, "Year") totalPriceLabel = Label(root, text="Total price for " + str(year) + " is: " + str(self.totalPrice)) totalPriceLabel.place(x = 100, y = 350) backButton = Button(root, text = "Back", command=lambda: self.sequence(self.viewByYear)) # This button will return the user to the expenses option page backButton.place(x = 50, y = 350) # Inserts the detailed values into the detailed table def insertData(self, table, type, database, yearOrMonth): if yearOrMonth == "Year": for row in database.execute("SELECT * FROM %s" % table ): itemdate = row[1] if ( str(self.year.get()) == itemdate[-4:]): name = row[0] purchaseDate = row[1] Quantity = row[3] Price = row[4] self.tree.insert("", "end", values = (name,purchaseDate,Quantity, Price),tag = [name, type] ) self.totalPrice = self.totalPrice + Price self.backFunction = self.viewTotalCostYear else: for row in database.execute("SELECT * FROM %s" % table ): itemdate = row[1] if (self.searchDate == (itemdate[0:(self.lengthMonth + 1)] + itemdate[-4:])): name = row[0] purchaseDate = row[1] Quantity = row[3] Price = row[4] self.tree.insert("", "end", values = (name,purchaseDate,Quantity, Price), tag = [name, type]) self.totalPrice = self.totalPrice + Price self.backFunction = self.viewTotalCostMonth # If entry is double clicked, the table will acknoledge the click and display the detailed table self.tree.bind("<Double-1>", self.displayDetailedInventory) def createDisplayTable(self): for child in root.winfo_children(): child.destroy() self.tree = Treeview(height="15", columns=("Name", "Purchase Date", "Quantity", "Price"))#, "Description")) self.tree.pack() self.tree.heading('#1', text = "Name", anchor = CENTER) self.tree.heading('#2', text = "Purchase Date", anchor = CENTER) self.tree.heading('#3', text = "Quantity", anchor = CENTER) self.tree.heading('#4', text = "Price", anchor = CENTER) self.tree.column('#1', minwidth=0, width = 95) self.tree.column('#2', minwidth=0, width = 95) self.tree.column('#3', minwidth=0, width = 95) self.tree.column('#4', minwidth=0, width = 95) self.tree.column('#0', minwidth=0, width = 0) # This is a helper function that will delete the current widgets of the frame def sequence(self, run): for child in root.winfo_children(): child.destroy() run() def __init__(self, master=None): Frame.__init__(self, master) self.place(); self.inventoryDB = InventoryDatabase() # self.inventoryDB.createTable() self.createOptionButtons()
class DialogOpenArchive(Toplevel): def __init__(self, parent, openType, filesource, filenames, title, colHeader, showAltViewButton=False): if isinstance(parent, Cntlr): cntlr = parent parent = parent.parent # parent is cntlrWinMain else: # parent is a Toplevel dialog cntlr = parent.cntlr super(DialogOpenArchive, self).__init__(parent) self.parent = parent self.showAltViewButton = showAltViewButton parentGeometry = re.match("(\d+)x(\d+)[+]?([-]?\d+)[+]?([-]?\d+)", parent.geometry()) dialogX = int(parentGeometry.group(3)) dialogY = int(parentGeometry.group(4)) self.accepted = False self.transient(self.parent) frame = Frame(self) treeFrame = Frame(frame, width=500) vScrollbar = Scrollbar(treeFrame, orient=VERTICAL) hScrollbar = Scrollbar(treeFrame, orient=HORIZONTAL) self.treeView = Treeview(treeFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set) self.treeView.grid(row=0, column=0, sticky=(N, S, E, W)) hScrollbar["command"] = self.treeView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.treeView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) treeFrame.columnconfigure(0, weight=1) treeFrame.rowconfigure(0, weight=1) treeFrame.grid(row=0, column=0, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.treeView.focus_set() if openType not in (PLUGIN, PACKAGE): cntlr.showStatus(_("loading archive {0}").format(filesource.url)) self.filesource = filesource self.filenames = filenames self.selection = filesource.selection self.hasToolTip = False selectedNode = None if openType == ENTRY_POINTS: try: metadataFiles = filesource.taxonomyPackageMetadataFiles ''' take first for now if len(metadataFiles) != 1: raise IOError(_("Taxonomy package contained more than one metadata file: {0}.") .format(', '.join(metadataFiles))) ''' metadataFile = metadataFiles[0] metadata = filesource.url + os.sep + metadataFile self.metadataFilePrefix = os.sep.join(os.path.split(metadataFile)[:-1]) if self.metadataFilePrefix: self.metadataFilePrefix += "/" # zip contents have /, never \ file seps self.taxonomyPkgMetaInf = '{}/META-INF/'.format( os.path.splitext(os.path.basename(filesource.url))[0]) self.taxonomyPackage = parsePackage(cntlr, filesource, metadata, os.sep.join(os.path.split(metadata)[:-1]) + os.sep) if self.taxonomyPackage["entryPoints"]: # may have instance documents too self.packageContainedInstances = [] packageContentTypeCounts = {} for suffix in (".xhtml", ".htm", ".html"): for potentialInstance in filesource.dir: if potentialInstance.endswith(".xhtml"): _type = "Inline Instance" self.packageContainedInstances.append([potentialInstance, _type]) packageContentTypeCounts[potentialInstance] = packageContentTypeCounts.get(potentialInstance, 0) + 1 if self.packageContainedInstances: break if self.packageContainedInstances: # add sequences to any duplicated entry types for _type, count in packageContentTypeCounts.items(): if count > 1: _dupNo = 0 for i in range(len(self.packageContainedInstances)): if self.packageContainedInstances[i][0] == _type: _dupNo += 1 self.packageContainedInstances[i][0] = "{} {}".format(_type, _dupNo) else: # may be a catalog file with no entry oint names openType = ARCHIVE # no entry points to show, just archive self.showAltViewButton = False except Exception as e: self.close() err = _("Failed to parse metadata; the underlying error was: {0}").format(e) messagebox.showerror(_("Malformed taxonomy package"), err) cntlr.addToLog(err) return if openType not in (PLUGIN, PACKAGE): cntlr.showStatus(None) if openType in (DISCLOSURE_SYSTEM, PLUGIN, PACKAGE): y = 3 else: y = 1 okButton = Button(frame, text=_("OK"), command=self.ok) cancelButton = Button(frame, text=_("Cancel"), command=self.close) okButton.grid(row=y, column=2, sticky=(S,E,W), pady=3) cancelButton.grid(row=y, column=3, sticky=(S,E,W), pady=3, padx=3) if self.showAltViewButton: self.altViewButton = Button(frame, command=self.showAltView) self.altViewButton.grid(row=y, column=0, sticky=(S,W), pady=3, padx=3) self.loadTreeView(openType, colHeader, title) self.geometry("+{0}+{1}".format(dialogX+50,dialogY+100)) frame.grid(row=0, column=0, sticky=(N,S,E,W)) frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) window = self.winfo_toplevel() window.columnconfigure(0, weight=1) window.rowconfigure(0, weight=1) self.bind("<Return>", self.ok) self.bind("<Escape>", self.close) self.toolTipText = StringVar() if self.hasToolTip: self.treeView.bind("<Motion>", self.motion, '+') self.treeView.bind("<Leave>", self.leave, '+') self.toolTipText = StringVar() self.toolTip = ToolTip(self.treeView, textvariable=self.toolTipText, wraplength=640, follow_mouse=True, state="disabled") self.toolTipRowId = None self.protocol("WM_DELETE_WINDOW", self.close) self.grab_set() self.wait_window(self) def loadTreeView(self, openType, title, colHeader): self.title(title) self.openType = openType selectedNode = None # clear previous treeview entries for previousNode in self.treeView.get_children(""): self.treeView.delete(previousNode) # set up treeView widget and tabbed pane if openType in (ARCHIVE, DISCLOSURE_SYSTEM, PLUGIN, PACKAGE): if openType in (PLUGIN, PACKAGE): width = 770 else: width = 500 self.treeView.column("#0", width=width, anchor="w") self.treeView.heading("#0", text=colHeader) self.isRss = getattr(self.filesource, "isRss", False) if self.isRss: self.treeView.column("#0", width=350, anchor="w") self.treeView["columns"] = ("descr", "date", "instDoc") self.treeView.column("descr", width=50, anchor="center", stretch=False) self.treeView.heading("descr", text="Form") self.treeView.column("date", width=170, anchor="w", stretch=False) self.treeView.heading("date", text="Pub Date") self.treeView.column("instDoc", width=200, anchor="w", stretch=False) self.treeView.heading("instDoc", text="Instance Document") elif openType == PLUGIN: self.treeView.column("#0", width=150, anchor="w") self.treeView["columns"] = ("name", "vers", "descr", "license") self.treeView.column("name", width=150, anchor="w", stretch=False) self.treeView.heading("name", text="Name") self.treeView.column("vers", width=60, anchor="w", stretch=False) self.treeView.heading("vers", text="Version") self.treeView.column("descr", width=300, anchor="w", stretch=False) self.treeView.heading("descr", text="Description") self.treeView.column("license", width=60, anchor="w", stretch=False) self.treeView.heading("license", text="License") elif openType == PACKAGE: self.treeView.column("#0", width=200, anchor="w") self.treeView["columns"] = ("vers", "descr", "license") self.treeView.column("vers", width=100, anchor="w", stretch=False) self.treeView.heading("vers", text="Version") self.treeView.column("descr", width=400, anchor="w", stretch=False) self.treeView.heading("descr", text="Description") self.treeView.column("license", width=70, anchor="w", stretch=False) self.treeView.heading("license", text="License") else: self.treeView["columns"] = tuple() loadedPaths = [] for i, filename in enumerate(self.filenames): if isinstance(filename,tuple): if self.isRss: form, date, instDoc = filename[2:5] elif openType == PLUGIN: name, vers, descr, license = filename[3:7] elif openType == PACKAGE: vers, descr, license = filename[3:6] filename = filename[0] # ignore tooltip self.hasToolTip = True if filename.endswith("/"): filename = filename[:-1] path = filename.split("/") if not self.isRss and len(path) > 1 and path[:-1] in loadedPaths: parent = "file{0}".format(loadedPaths.index(path[:-1])) else: parent = "" node = self.treeView.insert(parent, "end", "file{0}".format(i), text=path[-1]) if self.isRss: self.treeView.set(node, "descr", form) self.treeView.set(node, "date", date) self.treeView.set(node, "instDoc", os.path.basename(instDoc)) elif openType == PLUGIN: self.treeView.set(node, "name", name) self.treeView.set(node, "vers", vers) self.treeView.set(node, "descr", descr) self.treeView.set(node, "license", license) elif openType == PACKAGE: self.treeView.set(node, "vers", vers) self.treeView.set(node, "descr", descr) self.treeView.set(node, "license", license) if self.selection == filename: selectedNode = node loadedPaths.append(path) elif openType == ENTRY_POINTS: self.treeView.column("#0", width=200, anchor="w") self.treeView.heading("#0", text="Name") self.treeView["columns"] = ("url",) self.treeView.column("url", width=300, anchor="w") self.treeView.heading("url", text="URL") for fileType, fileUrl in getattr(self, "packageContainedInstances", ()): self.treeView.insert("", "end", fileUrl, values=fileType, text=fileUrl or urls[0][2]) for name, urls in sorted(self.taxonomyPackage["entryPoints"].items(), key=lambda i:i[0][2]): self.treeView.insert("", "end", name, values="\n".join(url[1] for url in urls), text=name or urls[0][2]) self.hasToolTip = True else: # unknown openType return None if selectedNode: self.treeView.see(selectedNode) self.treeView.selection_set(selectedNode) if self.showAltViewButton: self.altViewButton.config(text=_("Show Files") if openType == ENTRY_POINTS else _("Show Entries")) def ok(self, event=None): selection = self.treeView.selection() if len(selection) > 0: if hasattr(self, "taxonomyPackage"): # load file source remappings self.filesource.mappedPaths = self.taxonomyPackage["remappings"] filename = None if self.openType in (ARCHIVE, DISCLOSURE_SYSTEM): filename = self.filenames[int(selection[0][4:])] if isinstance(filename,tuple): if self.isRss: filename = filename[4] else: filename = filename[0] elif self.openType == ENTRY_POINTS: epName = selection[0] #index 0 is the remapped Url, as opposed to the canonical one used for display # Greg Acsone reports [0] does not work for Corep 1.6 pkgs, need [1], old style packages filenames = [] for _url, _type in self.packageContainedInstances: # check if selection was an inline instance if _type == epName: filenames.append(_url) if not filenames: # else if it's a named taxonomy entry point for url in self.taxonomyPackage["entryPoints"][epName]: filename = url[0] if not filename.endswith("/"): # check if it's an absolute URL rather than a path into the archive if not isHttpUrl(filename) and self.metadataFilePrefix != self.taxonomyPkgMetaInf: # assume it's a path inside the archive: filename = self.metadataFilePrefix + filename filenames.append(filename) if filenames: self.filesource.select(filenames) self.accepted = True self.close() return elif self.openType in (PLUGIN, PACKAGE): filename = self.filenames[int(selection[0][4:])][2] if filename is not None and not filename.endswith("/"): if hasattr(self, "taxonomyPackage"): # attempt to unmap the filename to original file # will be mapped again in loading, but this allows schemaLocation to be unmapped for prefix, remapping in self.taxonomyPackage["remappings"].items(): if isHttpUrl(remapping): remapStart = remapping else: remapStart = self.metadataFilePrefix + remapping if filename.startswith(remapStart): # set unmmapped file filename = prefix + filename[len(remapStart):] break if self.openType in (PLUGIN, PACKAGE): self.filesource.selection = filename else: self.filesource.select(filename) self.accepted = True self.close() def close(self, event=None): self.parent.focus_set() self.destroy() def showAltView(self, event=None): if self.openType == ENTRY_POINTS: self.loadTreeView(ARCHIVE, _("Select Entry Point"), _("File")) else: self.loadTreeView(ENTRY_POINTS, _("Select Archive File"), _("File")) def leave(self, *args): self.toolTipRowId = None def motion(self, *args): tvRowId = self.treeView.identify_row(args[0].y) if tvRowId != self.toolTipRowId: text = None if self.openType in (ARCHIVE, DISCLOSURE_SYSTEM, PLUGIN, PACKAGE): self.toolTipRowId = tvRowId if tvRowId and len(tvRowId) > 4: try: text = self.filenames[ int(tvRowId[4:]) ] if isinstance(text, tuple): text = (text[1] or "").replace("\\n","\n") except (KeyError, ValueError): pass elif self.openType == ENTRY_POINTS: try: text = "{0}\n{1}".format(tvRowId, "\n".join(url[1] for url in self.taxonomyPackage["entryPoints"][tvRowId])) except KeyError: pass self.setToolTip(text) def setToolTip(self, text): self.toolTip._hide() if text: self.toolTipText.set(text) self.toolTip.configure(state="normal") self.toolTip._schedule() else: self.toolTipText.set("") self.toolTip.configure(state="disabled")
class ReplayTutor2(Tutor): """ ReplayTutor: a tutor for testing/backup purposes, that re-sends messages to plugins. """ def __init__(self, entity_id, api_key, logger, run_once=None, args=None): super().__init__(entity_id, api_key, self.main_callback, run_once=run_once) self.run_once = run_once self.logger = logger self.student_id_value = None self.session_id_value = None self.root = None self.status = None self.student_id = None self.session_id = None self.problem_name = None self.step_name = None self.transaction_id = None self.outcome = None self.skillbox = None self.button = None self.import_button = None self.kt_button = None self.attr_name = None self.attr_value = None self.attr_button = None self.skill_id = None self.kt_button = None self.response_box = None self.json_in = None def post_connect(self): self.send("tutorgen.add_student",{},self.new_student_callback) def setup_gui(self): #main window self.root = Tk() self.root.wm_title("Transaction Replay Tutor") self.root.minsize(400,400) #menu menubar = Menu(self.root) menubar.add_command(label="Import Datashop File", command=self.import_datashop_file) menubar.add_command(label="Quit", command=self.root.quit) self.root.config(menu=menubar) #listbox w = Label(self.root, text="Transaction") w.pack(fill=X) frame = Frame() scrollbar = Scrollbar(frame, orient=VERTICAL) self.treeview = Treeview(frame,yscrollcommand=scrollbar.set) self.treeview["columns"] = ("problem_name","step_text","transaction_text","skill_names","outcome") self.treeview.heading("problem_name",text="Problem Name") self.treeview.heading("step_text",text="Step Text") self.treeview.heading("transaction_text",text="Transaction Text") self.treeview.heading("skill_names",text="Skill Names") self.treeview.heading("outcome",text="Outcome") self.treeview.bind('<<TreeviewSelect>>', self.populate_form) scrollbar.config(command=self.treeview.yview) scrollbar.pack(side=RIGHT, fill=Y) self.treeview.pack(side=LEFT, fill=BOTH, expand=1) frame.pack(fill=BOTH) #spacer frame separator = Frame(height=2, bd=1, relief=SUNKEN) separator.pack(fill=X, padx=5, pady=5) #student id w = Label(self.root, text="Student ID") w.pack(fill=X) self.student_id = Entry(self.root,state=DISABLED) self.student_id.pack(fill=X) #ssession id w = Label(self.root, text="Session ID") w.pack(fill=X) self.session_id = Entry(self.root,state=DISABLED) self.session_id.pack(fill=X) bigframe = Frame() bigframe.pack(fill=X,padx =5, ipady=5) leftframe = Frame(bigframe) leftframe.pack(side=LEFT,fill=X,expand=1) rightframe= Frame(bigframe) rightframe.pack(side=RIGHT,fill=X,expand=1) #Entry fields ##problem name w = Label(leftframe, text="Problem Name") w.pack(fill=X) self.problem_name = Entry(leftframe) self.problem_name.pack(fill=X) ##step name w = Label(leftframe, text="Step Name") w.pack(fill=X) self.step_name = Entry(leftframe) self.step_name.pack(fill=X) ##Transaction ID w = Label(leftframe, text="Transaction ID") w.pack(fill=X) self.transaction_id = Entry(leftframe) self.transaction_id.pack(fill=X) ##Outcome w = Label(leftframe, text="Outcome") w.pack(fill=X) self.outcome = Entry(leftframe) self.outcome.pack(fill=X) ##skill names w = Label(rightframe, text="Skill Models and Names") w.pack(fill=X) self.skillbox = Text(rightframe,height=8) self.skillbox.pack() #Submit button self.button = Button(self.root, text="Send", command=self.submit_transaction, state=DISABLED) self.button.pack() #Load button self.import_button = Button(self.root, text="Import", command=self.import_datashop_file) self.import_button.pack() #spacer frame separator = Frame(height=2, bd=1, relief=SUNKEN) separator.pack(fill=X, padx=5, pady=5) bigframe = Frame() bigframe.pack(fill=X) leftframe = Frame(bigframe,bd=1) leftframe.pack(side=LEFT,expand=1, padx =5, ipady=5) rightframe= Frame(bigframe,bd=1) rightframe.pack(side=RIGHT,expand=1, padx =5, ipady=5) #student attribute w = Label(leftframe, text="Student Attribute") w.pack(fill=X) self.attr_name = Entry(leftframe) self.attr_name.pack(fill=X) w = Label(leftframe, text="Value") w.pack(fill=X) self.attr_value = Entry(leftframe) self.attr_value.pack(fill=X) self.attr_button = Button(leftframe, text="Set", command=self.set_attribute, state=DISABLED) self.attr_button.pack() b = Button(leftframe, text="Get", command=self.get_attribute) b.pack() b = Button(leftframe, text="Add Problem", command=self.add_problem) b.pack() #kt_trace w = Label(rightframe, text="Skill ID") w.pack(fill=X) self.skill_id = Entry(rightframe) self.skill_id.pack(fill=X) self.kt_button = Button(rightframe, text="Trace", command=self.kt_trace, state=DISABLED) self.kt_button.pack() b = Button(rightframe, text="Reset", command=self.kt_reset) b.pack() #response box w = Label(self.root, text="Responses") w.pack(fill=X) self.response_box = Text(height=8) self.response_box.pack() #status self.status = Label(text="Status: Idle", bd=1, relief=SUNKEN, anchor=W) self.status.pack(side=BOTTOM, fill=X) def main_loop(self): again = True if not self.callback(): again = False responses = self._poll_responses() if not self._dispatch_responses(responses): again = False if again: self.root.after(self.poll_wait, self.main_loop) else: raise Exception("Error in main loop") def import_datashop_file(self): filename = filedialog.askopenfilename() with open(filename,"r") as filein: header_line = filein.readline() headers = header_line.split("\t") filelen = file_len(filename) count =0 with open(filename,"r") as filein: filein.readline() #skip header line while 1: line = filein.readline() if not line: break rt.status.config(text="Status: Importing Datashop file... " + str(count) + " / " + str(filelen)) rt.status.update_idletasks() count+=1 values = line.split("\t") transaction = dict(zip(headers,values)) skills = get_skills(transaction) #("problem_name","step_text","transaction_text","skill_names","outcome") rt.treeview.insert("","end",text= "Transaction", values=(transaction["Problem Name"],transaction["Step Name"],transaction["Transaction Id"],json.dumps(skills),transaction["Outcome"])) rt.status.config(text="Status: Idle") rt.status.update_idletasks() print("file " + filename) def add_problem(self): mid = self.send("tutorgen.add_problem",{ "problem_name":"some problem", "problem_text":"some problem text", }, self.transaction_response_callback) print(str(mid) + str(datetime.now())) def kt_trace(self): correct=False if self.outcome.get().lower() == "correct": correct = True mid = self.send("tutorgen.kt_trace",{ "student_id":self.student_id.get(), "correct":correct, "skill_id":self.skill_id.get(), }, self.transaction_response_callback) print(str(mid) + str(datetime.now())) def kt_reset(self): mid = self.send("tutorgen.kt_reset",{ "student_id":self.student_id.get(), "skill_id":self.skill_id.get(), }, self.transaction_response_callback) print(str(mid) + str(datetime.now())) def set_attribute(self): mid = self.send("tutorgen.set_attribute",{ "student_id":self.student_id.get(), "attribute_name":self.attr_name.get(), "attribute_value":self.attr_value.get(), }, self.transaction_response_callback) self.attr_name.delete(0,END) self.attr_value.delete(0,END) print(str(mid) + str(datetime.now())) def get_attribute(self): mid = self.send("tutorgen.get_attribute",{ "student_id":self.student_id.get(), "attribute_name":self.attr_name.get(), }, self.transaction_response_callback) print(str(mid) + str(datetime.now())) def populate_form(self,evt): w = evt.widget item = w.selection()[0] values = w.item(item)["values"] self.problem_name.delete(0,END) self.problem_name.insert(INSERT,values[0]) self.step_name.delete(0,END) self.step_name.insert(INSERT,values[1]) self.transaction_id.delete(0,END) self.transaction_id.insert(INSERT,values[2]) self.skillbox.delete("0.0",END) self.json_in = json.loads(values[3]) #save for later json_out = json.dumps(self.json_in, sort_keys=True,indent=4, separators=(',', ': ')) self.skillbox.insert("0.0",json_out) self.outcome.delete(0,END) self.outcome.insert(INSERT,values[4]) def new_student_callback(self,response): self.student_id_value = response["student_id"] self.session_id_value = response["session_id"] self.student_id.config(state=NORMAL) self.student_id.insert(INSERT,str(self.student_id_value)) self.session_id.config(state=NORMAL) self.session_id.insert(INSERT,str(self.session_id_value)) self.button.config(state=NORMAL) self.import_button.config(state=NORMAL) self.attr_button.config(state=NORMAL) self.kt_button.config(state=NORMAL) def transaction_response_callback(self,response): #messagebox.showinfo("info", "Got a response: " + json.dumps(response, sort_keys=True,indent=4, separators=(',', ': '))) self.response_box.insert(END,"\n==========================================") self.response_box.insert(END,json.dumps(response, sort_keys=True,indent=4, separators=(',', ': '))) def submit_transaction(self): skill_ids = {} skill_names = {} for skill_model, skill_name in self.json_in.items(): skill_ids[skill_name] = "" skill_names[skill_model] = skill_name transaction = { "problem_name":self.problem_name.get(), "step_text":self.step_name.get(), "transaction_text":self.transaction_id.get(), "session_id":self.session_id.get(), 'skill_ids': skill_ids, 'skill_names': skill_names, 'student_id':self.student_id.get(), 'outcome': self.outcome.get(), } print(transaction) self.send_transaction(transaction, self.transaction_response_callback) def main_callback(self): return True
class BioInfo(Tk): def __init__(self): Tk.__init__(self) self.wm_title("BioInfo : comparaison des listes") self.resizable(width=FALSE, height=FALSE) self.SortDir = False # Lists Types self.typeList1 = None self.typeList2 = None # Frame content self.frameContent = Frame(self) self.frameContent.pack(side=TOP, fill=X) # ScrollBar scrollbar = Scrollbar(self.frameContent, orient=VERTICAL) scrollbar.pack(side=RIGHT, fill=Y) # Result Content self.dataCols = ('microArn_A', 'microArn_B', 'FoldC', 'p-Value', 'Note') self.tree = Treeview(self.frameContent, columns=self.dataCols, show = 'headings', yscrollcommand=scrollbar.set) # configure column headings for c in self.dataCols: self.tree.heading(c, text=c, command=lambda c=c: self.columnSort(c, self.SortDir)) self.tree.column(c, width=10) self.tree.pack(side=LEFT, fill=X, expand="yes") scrollbar.config(command=self.tree.yview) # Frame Lists self.frameLists = Frame(self) self.frameLists.pack(side=LEFT) # Frame Forms self.frameForms = Frame(self) self.frameForms.pack(side=LEFT, padx=20) #Liste n°1 selection self.frameList1 = Frame(self.frameLists) self.frameList1.pack() self.typeListStr1 = StringVar(self.frameList1) self.typeListStr1.set(str(ListBioType.TypeA)) self.buttonTypeList1 = OptionMenu(self.frameList1, self.typeListStr1, str(ListBioType.TypeA), str(ListBioType.TypeB)).pack(side=LEFT) self.entrylist1 = Entry(self.frameList1, width=30) self.entrylist1.pack(side=LEFT) self.buttonBrowseList1 = Button(self.frameList1, text="Parcourir", command=self.load_fileList1, width=10) self.buttonBrowseList1.pack(side=LEFT, padx=5) # List n°2 selection self.frameList2 = Frame(self.frameLists) self.frameList2.pack(side=BOTTOM) self.typeListStr2 = StringVar(self.frameList2) self.typeListStr2.set(str(ListBioType.TypeB)) self.buttonTypeList2 = OptionMenu(self.frameList2, self.typeListStr2, str(ListBioType.TypeA), str(ListBioType.TypeB)).pack(side=LEFT) self.entrylist2 = Entry(self.frameList2, width=30) self.entrylist2.pack(side=LEFT) self.buttonBrowseList2 = Button(self.frameList2, text="Parcourir", command=self.load_fileList2, width=10) self.buttonBrowseList2.pack(side=LEFT, padx=5) # Form pValue self.framePVal = Frame(self.frameForms) self.framePVal.pack() Label(self.framePVal, text="pValue").pack(side=LEFT) self.entryPVal = Entry(self.framePVal, width=6) self.entryPVal.pack(side=LEFT) # Form foldC self.frameFoldC = Frame(self.frameForms) self.frameFoldC.pack() Label(self.frameFoldC, text="foldCh").pack(side=LEFT) self.entryFoldC = Entry(self.frameFoldC, width=6) self.entryFoldC.pack(side=LEFT) # Form note self.frameNote = Frame(self.frameForms) self.frameNote.pack() Label(self.frameNote, text="note ").pack(side=LEFT) self.entryNote = Entry(self.frameNote, width=6) self.entryNote.pack(side=LEFT) # Bouton comparer self.buttonComparer = Button(self, text="Comparer", command=self.compare, width=10, state=DISABLED) self.buttonComparer.pack(fill= X, expand="yes", padx=20, pady=(10,0)) #Bouton exporter self.buttonExport = Button(self, text="Exporter", command=self.export, width=10, state=DISABLED) self.buttonExport.pack(fill= X, expand="yes", padx=20) # Réinitialiser self.buttonReset = Button(self, text="Réinitialiser", command=self.reset, width=10) self.buttonReset.pack(fill= X, expand="yes", padx=20, pady=(0,10)) # file members self.list1 = None self.list2 = None def load_fileList1(self): fname = askopenfilename(filetypes=(("CSV files", "*.csv"), ("All files", "*.*") )) if fname: self.entrylist1.delete(0, END) self.list1 = fname self.entrylist1.insert(0,fname) self.buttonComparer.config(state=NORMAL) def load_fileList2(self): fname = askopenfilename(filetypes=(("CSV files", "*.csv"), ("All files", "*.*") )) if fname: self.entrylist2.delete(0, END) self.list2 = fname self.entrylist2.insert(0,fname) self.buttonComparer.config(state=NORMAL) else: showerror("Erreur : fichier B", "La liste B est introuvable") def resetTree (self): for i in self.tree.get_children(): self.tree.delete(i) def reset(self): self.list1 = None self.entrylist1.delete(0, END) self.list2 = None self.entrylist2.delete(0, END) self.entryPVal.delete(0,END) self.entryFoldC.delete(0, END) self.entryNote.delete(0, END) self.typeList1 = None self.typeList2 = None self.buttonExport.config(state=DISABLED) self.buttonComparer.config(state=DISABLED) self.resetTree() def isValidfoldC(self, s): try: float(s) return True except ValueError: return False def isValidPValue(self, s): try: f = float(s) if f >= 0 and f <= 1: return True else: return False except: return False def isValidNote (self, s): try: f = int(s) return True except: return False def compare(self): self.buttonExport.config(state=NORMAL) # Détermination type Listes # List 1 if self.typeListStr1.get() == str(ListBioType.TypeA): self.typeList1 = ListBioType.TypeA elif self.typeListStr1.get() == str(ListBioType.TypeB): self.typeList1 = ListBioType.TypeB else: self.typeList1 = None # List 2 if self.typeListStr2.get() == str(ListBioType.TypeA): self.typeList2 = ListBioType.TypeA elif self.typeListStr2.get() == str(ListBioType.TypeB): self.typeList2 = ListBioType.TypeB else: self.typeList2 = None if not self.isValidfoldC(self.entryFoldC.get()) and not self.entryFoldC.get() == "": showerror("Erreur : foldC","La valeur fold Change n'est pas un nombre") elif not self.isValidPValue(self.entryPVal.get()) and not self.entryPVal.get() == "": showerror("Erreur : pValue","La valeur pValue n'est pas un nombre compris entre 0 et 1") elif not self.isValidNote(self.entryNote.get()) and not self.entryNote.get() == "": showerror("Erreur : note", "La valeur note n'est pas un nombre entier") # (List A and No List) or (No List and List A) elif ((self.list1 is not None and self.typeList1 == ListBioType.TypeA) and (self.list2 is None)) or\ ((self.list2 is not None and self.typeList2 == ListBioType.TypeA) and (self.list1 is None)): self.resetTree() try: listComp = ListComparator(self.list1, self.list2, self.entryPVal.get(), self.entryFoldC.get(), self.entryNote.get()) for e in listComp.getFilterListA(): self.tree.insert('', 'end', values=e) except IndexError: showerror("Erreur : liste A invalide", "Le fichier liste A n'est pas un fichier valide") # (List B and No List) or (No List and List B) elif ((self.list1 is not None and self.typeList1 == ListBioType.TypeB) and (self.list2 is None)) or\ ((self.list2 is not None and self.typeList2 == ListBioType.TypeB) and (self.list1 is None)): self.resetTree() try: listComp = ListComparator(self.list1, self.list2, self.entryPVal.get(), self.entryFoldC.get()) for e in listComp.getFilterListB(): self.tree.insert('', 'end', values=e) except IndexError: showerror("Erreur : liste A invalide", "Le fichier liste A n'est pas un fichier valide") # (List A and List B) or (List B and List A) elif ((self.list1 is not None and self.typeList1 == ListBioType.TypeA) and \ (self.list2 is not None and self.typeList2 == ListBioType.TypeB)) or \ ((self.list1 is not None and self.typeList1 == ListBioType.TypeB) and \ (self.list2 is not None and self.typeList2 == ListBioType.TypeA)): self.resetTree() listA = "" listB = "" if self.typeList1 == ListBioType.TypeA: listA = self.list1 else: listA = self.list2 if self.typeList1 == ListBioType.TypeB: listB = self.list1 else: listB = self.list2 try: listComp = ListComparator(listA, listB, self.entryPVal.get(), self.entryFoldC.get(), self.entryNote.get()) for e in listComp.getDiffAandB(): self.tree.insert('', 'end', values=e) except IndexError: showerror("Erreur : liste A ou B invalide", "Le fichier liste A ou B n'est pas un fichier valide") # (List A and List A) elif ((self.list1 is not None and self.typeList1 == ListBioType.TypeA) and \ (self.list2 is not None and self.typeList2 == ListBioType.TypeA)): self.resetTree() try: listComp = ListComparator(self.list1, self.list2, self.entryPVal.get(), self.entryFoldC.get(), self.entryNote.get()) for e in listComp.getDiffAandA(): self.tree.insert('', 'end', values=e) except IndexError: showerror("Erreur : liste A ou B invalide", "Le fichier liste A ou B n'est pas un fichier valide") # (List B and List B) elif ((self.list1 is not None and self.typeList1 == ListBioType.TypeB) and \ (self.list2 is not None and self.typeList2 == ListBioType.TypeB)): self.resetTree() try: listComp = ListComparator(self.list1, self.list2, self.entryPVal.get(), self.entryFoldC.get()) for e in listComp.getDiffBandB(): self.tree.insert('', 'end', values=e) except IndexError: showerror("Erreur : liste A ou B invalide", "Le fichier liste A ou B n'est pas un fichier valide") else: showerror("Erreur : Combinaisons de listes invalides", "Votre choix de types de listes ne correspond à aucune combinaison possible, contacter le developpeur") def export(self): if len(self.tree.get_children()) == 0: showinfo("Export", "Il n'y a rien à exporter") return fname = asksaveasfilename(filetypes=(("CSV files", "*.csv"), ("All files", "*.*") )) if fname: resExp = [] for it in self.tree.get_children(): resExp.append(self.tree.item(it)["values"]) expTabToCSV = TreeExportator(resExp, fname) expTabToCSV.export() showinfo("Export", "Exportation au format CSV réussi") def columnSort (self, col, descending=False): data = [(self.tree.set(child, col), child) for child in self.tree.get_children('')] data.sort(reverse=descending) for indx, item in enumerate(data): self.tree.move(item[1], '', indx) # reverse sort direction for next sort operation self.SortDir = not descending
class Window: def fillTree(self,path, parent, list): for file in os.listdir(path): abspath = os.path.join(path,file) color = "" treelist = None for mini in list: if abspath in mini: color = 'red' treelist = mini else: for lk in mini: if abspath in lk: color = 'purple' child = None if color == 'red': child = self.tree.insert(parent,'end',text=file,open=False,tags=(abspath,'red',str(treelist)),) elif color == 'purple': child = self.tree.insert(parent,'end',text=file,open=False,tags=(abspath,'purple')) else: child = self.tree.insert(parent,'end',text=file,open=False,tags=(abspath,'white')) if(os.path.isdir(abspath)): self.tree.insert(child,'end',text='',open=False) def __init__(self,list,dirlist): self.root = Tk() self.root.wm_title("Duplicate_Files") self.min = None self.list = list self.root.geometry('600x600+0+0') self.tree = Treeview(self.root ,height=15) self.tree.pack(expand='yes',fill='both') self.tree.heading('#0',text="files") self.tree.tag_configure('red',foreground='red') self.tree.tag_configure('purple',foreground='#cc00ff') self.tree.bind("<Double-1>",self.onDoubleClick) self.tree.bind("<<TreeviewOpen>>",self.onOpen) self.tree.bind("<<TreeviewClose>>",self.onClose) for path in dirlist: branch = self.tree.insert('','end',text=path,open=True,tags=(path,'white')) self.fillTree(path,branch,list) self.root.mainloop() def onDoubleClick(self,event): item = self.tree.selection()[0] print ("clicked" + str(self.tree.item(item,'tags')[0])) if str(self.tree.item(item,'tags')[1]) == "red": list_of_files = ast.literal_eval(str(self.tree.item(item,'tags')[2])) if self.min != None: if self.min.mini.winfo_exists(): self.min.mini.destroy() self.min = MiniWindow(self.root,list_of_files) def onOpen(self,event): item = self.tree.selection()[0] if self.tree.parent(item) != '': if len(self.tree.get_children(item))>0: self.tree.delete(self.tree.get_children(item)) abspath = str(self.tree.item(item,'tags')[0]) if(os.path.isdir(abspath)): self.fillTree(abspath, item,self.list) def onClose(self,event): item = self.tree.selection()[0] if self.tree.parent(item) != '': if len(self.tree.get_children(item))>0: self.tree.delete(self.tree.get_children(item))
class IncomeGUI(Frame): inDB = incomeDB() def createIncome(self): addIncome = Button(self, text="Add income", command=lambda: self.sequence(self.addMonth)) addIncome.pack(fill=X, padx=10, pady=20) incomeButton = Button(self, text="View income", command =lambda: self.sequence(self.viewIncome)) incomeButton.pack(fill=X, padx=10, pady=5) backButton = Button(self, text="Back") backButton.pack(side=BOTTOM) def addMonth(self): monthlabel = Label(self, text = "Select Month: ") monthlabel.pack() self.monthChoice = IntVar(self) months = self.numberings(1, 12) self.monthChoice.set(1) self.monthInput = OptionMenu(self, self.monthChoice, *months) self.monthInput.pack() yearlabel = Label(self, text = "Select Year: ") yearlabel.pack() self.yearChoice = IntVar(self) years = self.numberings(2000, 2020) self.yearChoice.set(2000) self.yearInput = OptionMenu(self, self.yearChoice, *years) self.yearInput.pack() nextButton = Button(self, text="Next", command=lambda: self.sequence(self.addIncome)) nextButton.pack() backButton = Button(self, text="Back", command=lambda: self.sequence( self.createIncome)) backButton.pack() def addIncome(self): month = self.monthChoice.get() self.income = income(month) self.income.year = self.yearChoice.get() amountlabel = Label(self, text="Amount of items sold this month: ") amountlabel.pack() self.amountinput = Entry(self) self.amountinput.pack() incomelabel = Label(self, text="Income earned: ") incomelabel.pack() self.incomeinput = Entry(self) self.incomeinput.pack() nextButton = Button(self, text="Next", command= self.saveDetails) nextButton.pack() backButton = Button(self, text="Back", command=lambda: self.sequence( self.createIncome)) backButton.pack() def saveDetails(self): self.income.amount = self.amountinput.get() self.income.income = self.incomeinput.get() self.sequence(self.confirmation) def confirmation(self): year = Label(self, text="Year: ") year.pack() yearin = Label(self, text=self.income.year) yearin.pack() month = Label(self, text="Month: ") month.pack() monthin = Label(self, text=self.income.month) monthin.pack() quantity = Label(self, text="Amount of items sold this month: ") quantity.pack() itemQuantity = Label(self, text=self.income.amount) itemQuantity.pack() price = Label(self, text="Income earned: ") price.pack() itemPrice = Label(self, text=self.income.income) itemPrice.pack() nextButton = Button(self, text="Next", command=lambda: self.sequence(self.addToIncomeDatabase)) nextButton.pack() backButton = Button(self, text="Back", command=lambda: self.sequence( self.createIncome)) backButton.pack() def addToIncomeDatabase(self): self.incomeDB.insertIntoDB(self.income) addedMessage = Message(self, text = "Added to database!") addedMessage.pack() endSessionButton = Button(self, text = "End Session", command=lambda: self.sequence(self.createIncome)) endSessionButton.pack() def viewIncome(self): self.tree = Treeview(height="20", columns=("Year", "Month", "Income")) self.tree.pack() self.tree.heading('#1', text = "Year", anchor = CENTER) self.tree.heading('#2', text = "Month", anchor = CENTER) self.tree.heading('#3', text = "Income", anchor = CENTER) self.tree.column('#1', minwidth=0, width = 100) self.tree.column('#2', minwidth=0, width = 100) self.tree.column('#3', minwidth=0, width = 100) self.tree.column('#0', minwidth=0, width = 0) for row in (self.incomeDB.getInfo()): year = row[1] month = row[0] income = row[3] self.tree.insert("", "end", values = (year,month,income)) backButton = Button(self, text="Back", command=lambda: self.sequence( self.createIncome)) backButton.pack() def sequence(self, funct): for child in self.winfo_children(): child.destroy() funct() def numberings(self, first, last): num = range(first, last + 1) return num def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.createIncome() self.incomeDB = incomeDB() #self.incomeDB.createDB() self.master.title("Income")
class MainWindow(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.eventHandler = EventHandler(self) self.parent = parent self.initUI() def initUI(self): self.parent.title("File synchronizer") Style().configure("TButton", padding=(0, 5, 0, 5), font="serif 10") # 3X3 Grid self.columnconfigure(0, pad=3, weight=1) self.columnconfigure(1, pad=3) self.columnconfigure(2, pad=3, weight=1) self.rowconfigure(0, pad=3) self.rowconfigure(1, pad=3, weight=1) self.rowconfigure(2, pad=3) ltf = Frame(self) ltf.grid(row=0, column=0, sticky=W + E) # 1X4 Grid ltf.columnconfigure(0, pad=3) ltf.columnconfigure(1, pad=3, weight=1) ltf.columnconfigure(2, pad=3, weight=1) ltf.columnconfigure(3, pad=3) ltf.rowconfigure(0, pad=3, weight=1) llabel = Label(ltf, text="Direcotry:") llabel.grid(row=0, column=0, sticky=W + E) self.leftDir = Entry(ltf) self.leftDir.bind("<Return>", self.eventHandler.leftDirChanged) self.leftDir.grid(row=0, column=1, columnspan=2, sticky=W + E) # Left browse button lBtn = Button(ltf, text="browse...", command=self.eventHandler.chooseLeftDirectory) lBtn.grid(row=0, column=3, sticky=E) rtf = Frame(self) rtf.grid(row=0, column=2, sticky=W + E) # 1X4 Grid rtf.columnconfigure(0, pad=3) rtf.columnconfigure(1, pad=3, weight=1) rtf.columnconfigure(2, pad=3, weight=1) rtf.columnconfigure(3, pad=3) rtf.rowconfigure(0, pad=3, weight=1) rlabel = Label(rtf, text="Direcotry:") rlabel.grid(row=0, column=0, sticky=W + E) self.rightDir = Entry(rtf) self.rightDir.bind("<Return>", self.eventHandler.rightDirChanged) self.rightDir.grid(row=0, column=1, columnspan=2, sticky=W + E) # Right browse button rBtn = Button(rtf, text="browse...", command=self.eventHandler.chooseRightDirectory) rBtn.grid(row=0, column=3, sticky=E) # Left TreeView frame ltf1 = Frame(self) ltf1.grid(row=1, column=0, sticky=N + S + W + E) # 2 X 2 Grid ltf1.columnconfigure(0, pad=3, weight=1) ltf1.columnconfigure(1, pad=3) ltf1.rowconfigure(0, pad=3, weight=1) ltf1.rowconfigure(1, pad=3) self.ltree = Treeview(ltf1, columns=("fullpath", "type", "size"), displaycolumns="size") self.ltree.grid(row=0, column=0, sticky=E + W + S + N) lysb = ttk.Scrollbar(ltf1, orient=VERTICAL, command=self.ltree.yview) lysb.grid(row=0, column=1, sticky=NS) lxsb = ttk.Scrollbar(ltf1, orient=HORIZONTAL, command=self.ltree.xview) lxsb.grid(row=1, column=0, columnspan=3, sticky=EW) self.ltree["yscroll"] = lysb.set self.ltree["xscroll"] = lxsb.set self.ltree.heading("#0", text="Directory Structure", anchor="w") self.ltree.heading("size", text="File Size", anchor="w") self.ltree.column("size", stretch=0, width=100) self.ltree.bind("<<TreeviewOpen>>", self.eventHandler.openTree) # Right TreeView frame rtf1 = Frame(self) rtf1.grid(row=1, column=2, sticky=N + S + W + E) # 2 X 2 Grid rtf1.columnconfigure(0, pad=3, weight=1) rtf1.columnconfigure(1, pad=3) rtf1.rowconfigure(0, pad=3, weight=1) rtf1.rowconfigure(1, pad=3) self.rtree = Treeview(rtf1, columns=("fullpath", "type", "size"), displaycolumns="size") self.rtree.grid(row=0, column=0, sticky=E + W + S + N) rysb = ttk.Scrollbar(rtf1, orient=VERTICAL, command=self.ltree.yview) rysb.grid(row=0, column=1, sticky=NS) rxsb = ttk.Scrollbar(rtf1, orient=HORIZONTAL, command=self.ltree.xview) rxsb.grid(row=1, column=0, columnspan=3, sticky=EW) self.rtree["yscroll"] = rysb.set self.rtree["xscroll"] = rxsb.set self.rtree.heading("#0", text="Directory Structure", anchor="w") self.rtree.heading("size", text="File Size", anchor="w") self.rtree.column("size", stretch=0, width=100) self.rtree.bind("<<TreeviewOpen>>", self.eventHandler.openTree) # Command Button frame btnf = Frame(self) btnf.grid(row=1, column=1, sticky=W + E + N + S) btnf.columnconfigure(0, pad=3, weight=1) btnf.rowconfigure(0, pad=3, weight=1) btnf.rowconfigure(1, pad=3, weight=1) btnf.rowconfigure(2, pad=3, weight=1) btnf.rowconfigure(3, pad=3, weight=1) btnf.rowconfigure(4, pad=3, weight=1) btnf.rowconfigure(5, pad=3, weight=1) btnf.rowconfigure(6, pad=3, weight=1) btnf.rowconfigure(7, pad=3, weight=1) l2rBtn = Button(btnf, text="Left >> Right", command=self.eventHandler.left2RightSynch) l2rBtn.grid(row=1, column=0, sticky=W + E) syncBtn = Button(btnf, text="<< Sync >>", command=self.eventHandler.leftRightSynch) syncBtn.grid(row=3, column=0, sticky=W + E) r2lBtn = Button(btnf, text="Left << Right", command=self.eventHandler.right2LeftSynch) r2lBtn.grid(row=5, column=0, sticky=W + E) closeBtn = Button(self, text="Close", command=self.eventHandler.quit) closeBtn.grid(row=2, column=2, sticky=E) self.pack(fill=BOTH, expand=1)
class DialogPluginManager(Toplevel): def __init__(self, mainWin, modulesWithNewerFileDates): super(DialogPluginManager, self).__init__(mainWin.parent) self.ENABLE = _("Enable") self.DISABLE = _("Disable") self.parent = mainWin.parent self.cntlr = mainWin # copy plugins for temporary display self.pluginConfig = PluginManager.pluginConfig self.pluginConfigChanged = False self.uiClassMethodsChanged = False self.modelClassesChanged = False self.disclosureSystemTypesChanged = False self.hostSystemFeaturesChanged = False self.modulesWithNewerFileDates = modulesWithNewerFileDates parentGeometry = re.match("(\d+)x(\d+)[+]?([-]?\d+)[+]?([-]?\d+)", self.parent.geometry()) dialogX = int(parentGeometry.group(3)) dialogY = int(parentGeometry.group(4)) self.title(_("Plug-in Manager")) frame = Frame(self) # left button frame buttonFrame = Frame(frame, width=40) buttonFrame.columnconfigure(0, weight=1) addLabel = Label(buttonFrame, text=_("Find plug-in modules:"), wraplength=60, justify="center") addLocalButton = Button(buttonFrame, text=_("Locally"), command=self.findLocally) ToolTip(addLocalButton, text=_("File chooser allows selecting python module files to add (or reload) plug-ins, from the local file system."), wraplength=240) addWebButton = Button(buttonFrame, text=_("On Web"), command=self.findOnWeb) ToolTip(addWebButton, text=_("Dialog to enter URL full path to load (or reload) plug-ins, from the web or local file system."), wraplength=240) addLabel.grid(row=0, column=0, pady=4) addLocalButton.grid(row=1, column=0, pady=4) addWebButton.grid(row=2, column=0, pady=4) buttonFrame.grid(row=0, column=0, rowspan=2, sticky=(N, S, W), padx=3, pady=3) # right tree frame (plugins already known to arelle) modulesFrame = Frame(frame, width=700) vScrollbar = Scrollbar(modulesFrame, orient=VERTICAL) hScrollbar = Scrollbar(modulesFrame, orient=HORIZONTAL) self.modulesView = Treeview(modulesFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=7) self.modulesView.grid(row=0, column=0, sticky=(N, S, E, W)) self.modulesView.bind('<<TreeviewSelect>>', self.moduleSelect) hScrollbar["command"] = self.modulesView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.modulesView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) modulesFrame.columnconfigure(0, weight=1) modulesFrame.rowconfigure(0, weight=1) modulesFrame.grid(row=0, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.modulesView.focus_set() self.modulesView.column("#0", width=120, anchor="w") self.modulesView.heading("#0", text=_("Name")) self.modulesView["columns"] = ("author", "ver", "status", "date", "update", "descr", "license") self.modulesView.column("author", width=100, anchor="w", stretch=False) self.modulesView.heading("author", text=_("Author")) self.modulesView.column("ver", width=50, anchor="w", stretch=False) self.modulesView.heading("ver", text=_("Version")) self.modulesView.column("status", width=50, anchor="w", stretch=False) self.modulesView.heading("status", text=_("Status")) self.modulesView.column("date", width=70, anchor="w", stretch=False) self.modulesView.heading("date", text=_("File Date")) self.modulesView.column("update", width=50, anchor="w", stretch=False) self.modulesView.heading("update", text=_("Update")) self.modulesView.column("descr", width=200, anchor="w", stretch=False) self.modulesView.heading("descr", text=_("Description")) self.modulesView.column("license", width=70, anchor="w", stretch=False) self.modulesView.heading("license", text=_("License")) classesFrame = Frame(frame) vScrollbar = Scrollbar(classesFrame, orient=VERTICAL) hScrollbar = Scrollbar(classesFrame, orient=HORIZONTAL) self.classesView = Treeview(classesFrame, xscrollcommand=hScrollbar.set, yscrollcommand=vScrollbar.set, height=5) self.classesView.grid(row=0, column=0, sticky=(N, S, E, W)) hScrollbar["command"] = self.classesView.xview hScrollbar.grid(row=1, column=0, sticky=(E,W)) vScrollbar["command"] = self.classesView.yview vScrollbar.grid(row=0, column=1, sticky=(N,S)) classesFrame.columnconfigure(0, weight=1) classesFrame.rowconfigure(0, weight=1) classesFrame.grid(row=1, column=1, columnspan=4, sticky=(N, S, E, W), padx=3, pady=3) self.classesView.focus_set() self.classesView.column("#0", width=200, anchor="w") self.classesView.heading("#0", text=_("Class")) self.classesView["columns"] = ("modules",) self.classesView.column("modules", width=500, anchor="w", stretch=False) self.classesView.heading("modules", text=_("Modules")) # bottom frame module info details moduleInfoFrame = Frame(frame, width=700) moduleInfoFrame.columnconfigure(1, weight=1) self.moduleNameLabel = Label(moduleInfoFrame, wraplength=600, justify="left", font=font.Font(family='Helvetica', size=12, weight='bold')) self.moduleNameLabel.grid(row=0, column=0, columnspan=4, sticky=W) self.moduleAuthorHdr = Label(moduleInfoFrame, text=_("author:"), state=DISABLED) self.moduleAuthorHdr.grid(row=1, column=0, sticky=W) self.moduleAuthorLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleAuthorLabel.grid(row=1, column=1, columnspan=3, sticky=W) self.moduleDescrHdr = Label(moduleInfoFrame, text=_("description:"), state=DISABLED) self.moduleDescrHdr.grid(row=2, column=0, sticky=W) self.moduleDescrLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleDescrLabel.grid(row=2, column=1, columnspan=3, sticky=W) self.moduleClassesHdr = Label(moduleInfoFrame, text=_("classes:"), state=DISABLED) self.moduleClassesHdr.grid(row=3, column=0, sticky=W) self.moduleClassesLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleClassesLabel.grid(row=3, column=1, columnspan=3, sticky=W) ToolTip(self.moduleClassesLabel, text=_("List of classes that this plug-in handles."), wraplength=240) self.moduleUrlHdr = Label(moduleInfoFrame, text=_("URL:"), state=DISABLED) self.moduleUrlHdr.grid(row=4, column=0, sticky=W) self.moduleUrlLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleUrlLabel.grid(row=4, column=1, columnspan=3, sticky=W) ToolTip(self.moduleUrlLabel, text=_("URL of plug-in module (local file path or web loaded file)."), wraplength=240) self.moduleDateHdr = Label(moduleInfoFrame, text=_("date:"), state=DISABLED) self.moduleDateHdr.grid(row=5, column=0, sticky=W) self.moduleDateLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleDateLabel.grid(row=5, column=1, columnspan=3, sticky=W) ToolTip(self.moduleDateLabel, text=_("Date of currently loaded module file (with parenthetical node when an update is available)."), wraplength=240) self.moduleLicenseHdr = Label(moduleInfoFrame, text=_("license:"), state=DISABLED) self.moduleLicenseHdr.grid(row=6, column=0, sticky=W) self.moduleLicenseLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleLicenseLabel.grid(row=6, column=1, columnspan=3, sticky=W) self.moduleImportsHdr = Label(moduleInfoFrame, text=_("imports:"), state=DISABLED) self.moduleImportsHdr.grid(row=7, column=0, sticky=W) self.moduleImportsLabel = Label(moduleInfoFrame, wraplength=600, justify="left") self.moduleImportsLabel.grid(row=7, column=1, columnspan=3, sticky=W) self.moduleEnableButton = Button(moduleInfoFrame, text=self.ENABLE, state=DISABLED, command=self.moduleEnable) ToolTip(self.moduleEnableButton, text=_("Enable/disable plug in."), wraplength=240) self.moduleEnableButton.grid(row=8, column=1, sticky=E) self.moduleReloadButton = Button(moduleInfoFrame, text=_("Reload"), state=DISABLED, command=self.moduleReload) ToolTip(self.moduleReloadButton, text=_("Reload/update plug in."), wraplength=240) self.moduleReloadButton.grid(row=8, column=2, sticky=E) self.moduleRemoveButton = Button(moduleInfoFrame, text=_("Remove"), state=DISABLED, command=self.moduleRemove) ToolTip(self.moduleRemoveButton, text=_("Remove plug in from plug in table (does not erase the plug in's file)."), wraplength=240) self.moduleRemoveButton.grid(row=8, column=3, sticky=E) moduleInfoFrame.grid(row=2, column=0, columnspan=5, sticky=(N, S, E, W), padx=3, pady=3) moduleInfoFrame.config(borderwidth=4, relief="groove") okButton = Button(frame, text=_("Close"), command=self.ok) ToolTip(okButton, text=_("Accept and changes (if any) and close dialog."), wraplength=240) cancelButton = Button(frame, text=_("Cancel"), command=self.close) ToolTip(cancelButton, text=_("Cancel changes (if any) and close dialog."), wraplength=240) okButton.grid(row=3, column=3, sticky=(S,E), pady=3) cancelButton.grid(row=3, column=4, sticky=(S,E), pady=3, padx=3) enableDisableFrame = Frame(frame) enableDisableFrame.grid(row=3, column=1, sticky=(S,W), pady=3) enableAllButton = Button(enableDisableFrame, text=_("Enable All"), command=self.enableAll) ToolTip(enableAllButton, text=_("Enable all plug ins."), wraplength=240) disableAllButton = Button(enableDisableFrame, text=_("Disable All"), command=self.disableAll) ToolTip(disableAllButton, text=_("Disable all plug ins."), wraplength=240) enableAllButton.grid(row=1, column=1) disableAllButton.grid(row=1, column=2) self.loadTreeViews() self.geometry("+{0}+{1}".format(dialogX+50,dialogY+100)) frame.grid(row=0, column=0, sticky=(N,S,E,W)) frame.columnconfigure(0, weight=0) frame.columnconfigure(1, weight=1) frame.rowconfigure(0, weight=1) window = self.winfo_toplevel() window.columnconfigure(0, weight=1) window.rowconfigure(0, weight=1) self.bind("<Return>", self.ok) self.bind("<Escape>", self.close) self.protocol("WM_DELETE_WINDOW", self.close) self.grab_set() self.wait_window(self) def loadTreeViews(self): self.selectedModule = None # clear previous treeview entries for previousNode in self.modulesView.get_children(""): self.modulesView.delete(previousNode) def loadSubtree(parentNode, moduleItems): for moduleItem in sorted(moduleItems, key=lambda item: item[0]): moduleInfo = moduleItem[1] if parentNode or not moduleInfo.get("isImported"): nodeName = moduleItem[0] if parentNode: nodeName = parentNode + GROUPSEP + nodeName name = moduleInfo.get("name", nodeName) node = self.modulesView.insert(parentNode, "end", nodeName, text=name) self.modulesView.set(node, "author", moduleInfo.get("author")) self.modulesView.set(node, "ver", moduleInfo.get("version")) self.modulesView.set(node, "status", moduleInfo.get("status")) self.modulesView.set(node, "date", moduleInfo.get("fileDate")) if name in self.modulesWithNewerFileDates: self.modulesView.set(node, "update", _("available")) self.modulesView.set(node, "descr", moduleInfo.get("description")) self.modulesView.set(node, "license", moduleInfo.get("license")) if moduleInfo.get("imports"): loadSubtree(node, [(importModuleInfo["name"],importModuleInfo) for importModuleInfo in moduleInfo["imports"]]) loadSubtree("", self.pluginConfig.get("modules", {}).items()) # clear previous treeview entries for previousNode in self.classesView.get_children(""): self.classesView.delete(previousNode) for i, classItem in enumerate(sorted(self.pluginConfig.get("classes", {}).items())): className, moduleList = classItem node = self.classesView.insert("", "end", className, text=className) self.classesView.set(node, "modules", ', '.join(moduleList)) self.moduleSelect() # clear out prior selection def ok(self, event=None): if self.pluginConfigChanged: PluginManager.pluginConfig = self.pluginConfig PluginManager.pluginConfigChanged = True PluginManager.reset() # force reloading of modules if self.uiClassMethodsChanged or self.modelClassesChanged or self.disclosureSystemTypesChanged or self.hostSystemFeaturesChanged: # may require reloading UI affectedItems = "" if self.uiClassMethodsChanged: affectedItems += _("menus of the user interface") if self.modelClassesChanged: if affectedItems: affectedItems += _(" and ") affectedItems += _("model objects of the processor") if self.disclosureSystemTypesChanged: if affectedItems: affectedItems += _(" and ") affectedItems += _("disclosure system types") if self.hostSystemFeaturesChanged: if affectedItems: affectedItems += _(" and ") affectedItems += _("host system features") if messagebox.askyesno(_("User interface plug-in change"), _("A change in plug-in class methods may have affected {0}. " "Please restart Arelle to due to these changes. \n\n" "Should Arelle restart itself now " "(if there are any unsaved changes they would be lost!)?" ).format(affectedItems), parent=self): self.cntlr.uiThreadQueue.put((self.cntlr.quit, [None, True])) self.close() def close(self, event=None): self.parent.focus_set() self.destroy() def moduleSelect(self, *args): node = (self.modulesView.selection() or (None,))[0] if node: node = node.rpartition(GROUPSEP)[2] # drop leading path names for module name moduleInfo = self.pluginConfig.get("modules", {}).get(node) if moduleInfo: self.selectedModule = node name = moduleInfo["name"] self.moduleNameLabel.config(text=name) self.moduleAuthorHdr.config(state=ACTIVE) self.moduleAuthorLabel.config(text=moduleInfo["author"]) self.moduleDescrHdr.config(state=ACTIVE) self.moduleDescrLabel.config(text=moduleInfo["description"]) self.moduleClassesHdr.config(state=ACTIVE) self.moduleClassesLabel.config(text=', '.join(moduleInfo["classMethods"])) self.moduleUrlHdr.config(state=ACTIVE) self.moduleUrlLabel.config(text=moduleInfo["moduleURL"]) self.moduleDateHdr.config(state=ACTIVE) self.moduleDateLabel.config(text=moduleInfo["fileDate"] + " " + (_("(an update is available)") if name in self.modulesWithNewerFileDates else "")) self.moduleLicenseHdr.config(state=ACTIVE) self.moduleLicenseLabel.config(text=moduleInfo["license"]) if moduleInfo.get("imports"): self.moduleImportsHdr.config(state=ACTIVE) _text = ", ".join(mi["name"] for mi in moduleInfo["imports"][:3]) if len(moduleInfo["imports"]) >= 3: _text += ", ..." self.moduleImportsLabel.config(text=_text) _buttonState = DISABLED if moduleInfo.get("isImported") else ACTIVE self.moduleEnableButton.config(state=_buttonState, text={"enabled":self.DISABLE, "disabled":self.ENABLE}[moduleInfo["status"]]) self.moduleReloadButton.config(state=_buttonState) self.moduleRemoveButton.config(state=_buttonState) else: self.selectedModule = None self.moduleNameLabel.config(text="") self.moduleAuthorHdr.config(state=DISABLED) self.moduleAuthorLabel.config(text="") self.moduleDescrHdr.config(state=DISABLED) self.moduleDescrLabel.config(text="") self.moduleClassesHdr.config(state=DISABLED) self.moduleClassesLabel.config(text="") self.moduleUrlHdr.config(state=DISABLED) self.moduleUrlLabel.config(text="") self.moduleDateHdr.config(state=DISABLED) self.moduleDateLabel.config(text="") self.moduleLicenseHdr.config(state=DISABLED) self.moduleLicenseLabel.config(text="") self.moduleImportsHdr.config(state=DISABLED) self.moduleImportsLabel.config(text="") self.moduleEnableButton.config(state=DISABLED, text=self.ENABLE) self.moduleReloadButton.config(state=DISABLED) self.moduleRemoveButton.config(state=DISABLED) def findLocally(self): initialdir = self.cntlr.pluginDir # default plugin directory if not self.cntlr.isMac: # can't navigate within app easily, always start in default directory initialdir = self.cntlr.config.setdefault("pluginOpenDir", initialdir) filename = self.cntlr.uiFileDialog("open", parent=self, title=_("Choose plug-in module file"), initialdir=initialdir, filetypes=[(_("Python files"), "*.py")], defaultextension=".py") if filename: # check if a package is selected (any file in a directory containing an __init__.py #if (os.path.basename(filename) == "__init__.py" and os.path.isdir(os.path.dirname(filename)) and # os.path.isfile(filename)): # filename = os.path.dirname(filename) # refer to the package instead self.cntlr.config["pluginOpenDir"] = os.path.dirname(filename) moduleInfo = PluginManager.moduleModuleInfo(filename) self.loadFoundModuleInfo(moduleInfo, filename) def findOnWeb(self): url = DialogURL.askURL(self) if url: # url is the in-cache or local file moduleInfo = PluginManager.moduleModuleInfo(url) self.cntlr.showStatus("") # clear web loading status self.loadFoundModuleInfo(moduleInfo, url) def loadFoundModuleInfo(self, moduleInfo, url): if moduleInfo and moduleInfo.get("name"): self.addPluginConfigModuleInfo(moduleInfo) self.loadTreeViews() else: messagebox.showwarning(_("Module is not itself a plug-in or in a directory with package __init__.py plug-in. "), _("File does not itself contain a python program with an appropriate __pluginInfo__ declaration: \n\n{0}") .format(url), parent=self) def checkIfImported(self, moduleInfo): if moduleInfo.get("isImported"): messagebox.showwarning(_("Plug-in is imported by a parent plug-in. "), _("Plug-in has a parent, please request operation on the parent: \n\n{0}") .format(moduleInfo.get("name")), parent=self) return True return False def removePluginConfigModuleInfo(self, name): moduleInfo = self.pluginConfig["modules"].get(name) if moduleInfo: if self.checkIfImported(moduleInfo): return; def _removePluginConfigModuleInfo(moduleInfo): _name = moduleInfo.get("name") if _name: for classMethod in moduleInfo["classMethods"]: classMethods = self.pluginConfig["classes"].get(classMethod) if classMethods and _name in classMethods: classMethods.remove(_name) if not classMethods: # list has become unused del self.pluginConfig["classes"][classMethod] # remove class if classMethod.startswith("CntlrWinMain.Menu"): self.uiClassMethodsChanged = True # may require reloading UI elif classMethod == "ModelObjectFactory.ElementSubstitutionClasses": self.modelClassesChanged = True # model object factor classes changed elif classMethod == "DisclosureSystem.Types": self.disclosureSystemTypesChanged = True # disclosure system types changed elif classMethod.startswith("Proxy."): self.hostSystemFeaturesChanged = True # system features (e.g., proxy) changed for importModuleInfo in moduleInfo.get("imports", EMPTYLIST): _removePluginConfigModuleInfo(importModuleInfo) self.pluginConfig["modules"].pop(_name, None) _removePluginConfigModuleInfo(moduleInfo) self.pluginConfigChanged = True def addPluginConfigModuleInfo(self, moduleInfo): if self.checkIfImported(moduleInfo): return; name = moduleInfo.get("name") self.removePluginConfigModuleInfo(name) # remove any prior entry for this module def _addPlugin(moduleInfo): _name = moduleInfo.get("name") if _name: self.modulesWithNewerFileDates.discard(_name) # no longer has an update available self.pluginConfig["modules"][_name] = moduleInfo # add classes for classMethod in moduleInfo["classMethods"]: classMethods = self.pluginConfig["classes"].setdefault(classMethod, []) if name not in classMethods: classMethods.append(_name) if classMethod.startswith("CntlrWinMain.Menu"): self.uiClassMethodsChanged = True # may require reloading UI elif classMethod == "ModelObjectFactory.ElementSubstitutionClasses": self.modelClassesChanged = True # model object factor classes changed elif classMethod == "DisclosureSystem.Types": self.disclosureSystemTypesChanged = True # disclosure system types changed elif classMethod.startswith("Proxy."): self.hostSystemFeaturesChanged = True # system features (e.g., proxy) changed for importModuleInfo in moduleInfo.get("imports", EMPTYLIST): _addPlugin(importModuleInfo) _addPlugin(moduleInfo) self.pluginConfigChanged = True def moduleEnable(self): if self.selectedModule in self.pluginConfig["modules"]: moduleInfo = self.pluginConfig["modules"][self.selectedModule] if self.checkIfImported(moduleInfo): return; def _moduleEnable(moduleInfo): if self.moduleEnableButton['text'] == self.ENABLE: moduleInfo["status"] = "enabled" elif self.moduleEnableButton['text'] == self.DISABLE: moduleInfo["status"] = "disabled" for importModuleInfo in moduleInfo.get("imports", EMPTYLIST): _moduleEnable(importModuleInfo) _moduleEnable(moduleInfo) if self.moduleEnableButton['text'] == self.ENABLE: self.moduleEnableButton['text'] = self.DISABLE elif self.moduleEnableButton['text'] == self.DISABLE: self.moduleEnableButton['text'] = self.ENABLE self.pluginConfigChanged = True self.loadTreeViews() def moduleReload(self): if self.selectedModule in self.pluginConfig["modules"]: url = self.pluginConfig["modules"][self.selectedModule].get("moduleURL") if url: moduleInfo = PluginManager.moduleModuleInfo(url, reload=True) if moduleInfo: if self.checkIfImported(moduleInfo): return; self.addPluginConfigModuleInfo(moduleInfo) self.loadTreeViews() self.cntlr.showStatus(_("{0} reloaded").format(moduleInfo["name"]), clearAfter=5000) else: messagebox.showwarning(_("Module error"), _("File or module cannot be reloaded: \n\n{0}") .format(url), parent=self) def moduleRemove(self): if self.selectedModule in self.pluginConfig["modules"]: self.removePluginConfigModuleInfo(self.selectedModule) self.pluginConfigChanged = True self.loadTreeViews() def enableAll(self): self.enableDisableAll(True) def disableAll(self): self.enableDisableAll(False) def enableDisableAll(self, doEnable): for module in self.pluginConfig["modules"]: if not module.get("isImported"): moduleInfo = self.pluginConfig["modules"][module] def _enableDisableAll(moduleInfo): if doEnable: moduleInfo["status"] = "enabled" else: moduleInfo["status"] = "disabled" for importModuleInfo in moduleInfo.get("imports", EMPTYLIST): _enableDisableAll(importModuleInfo) _enableDisableAll(moduleInfo) if doEnable: self.moduleEnableButton['text'] = self.DISABLE else: self.moduleEnableButton['text'] = self.ENABLE self.pluginConfigChanged = True self.loadTreeViews()