def create_canvas(self): canvas=Canvas(self,scrollregion=(-1520,-22200,1520,22200),bg='white') #创建canvas canvas.pack(side=LEFT, fill=BOTH, ipadx=2, ipady=2, expand=1) # 放置canvas的位置 frame_send=Frame(canvas,background='yellow') frame_send.pack(side=TOP,fill=NONE,expand=0) frame_res=Frame(canvas,background='green') #把frame放在canvas里 frame_res.pack(side=TOP, fill=NONE, expand=NO) #frame的长宽,和canvas差不多的 vbar=Scrollbar(canvas,orient=VERTICAL) #竖直滚动条 vbar.pack(side=RIGHT, fill=Y, ipadx=2, ipady=2, expand=0) vbar.configure(command=canvas.yview) hbar=Scrollbar(canvas,orient=HORIZONTAL)#水平滚动条 hbar.pack(side=BOTTOM, fill=X, ipadx=2, ipady=2, expand=0) hbar.configure(command=canvas.xview) canvas.config(xscrollcommand=hbar.set,yscrollcommand=vbar.set) #设置 canvas.create_window((120,240), window=frame_res) #create_window self.create_frame_send(frame_send,frame_res) self.after(1000,print(""))
def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E")
def _create_body_(self): # 创建行号栏 (takefocus=0 屏蔽焦点) self.line_number_bar = Text(self, width=4, padx=3, takefocus=0, border=0, background='#F0E68C', state='disabled') self.line_number_bar.pack(side='left', fill='y') # 创建文本输入框(undo是否启用撤销机制) self.content_text = Text(self, wrap='word', undo=True) self.content_text.pack(expand='yes', fill='both') self.content_text.bind('<Control-N>', self.new_file) self.content_text.bind('<Control-n>', self.new_file) self.content_text.bind('<Control-O>', self.open_file) self.content_text.bind('<Control-o>', self.open_file) self.content_text.bind('<Control-S>', self.save) self.content_text.bind('<Control-s>', self.save) self.content_text.bind('<Control-A>', self.select_all) self.content_text.bind('<Control-a_input>', self.select_all) self.content_text.bind('<Control-f>', self.find_text) self.content_text.bind('<Control-F>', self.find_text) self.content_text.bind('<Any-KeyPress>', lambda e: self._update_line_num()) self.bind_all('<KeyPress-F1>', lambda e: self.show_messagebox("帮助")) self.content_text.tag_configure('active_line', background='#EEEEE0') # 创建滚动条 scroll_bar = Scrollbar(self.content_text) scroll_bar["command"] = self.content_text.yview self.content_text["yscrollcommand"] = scroll_bar.set scroll_bar.pack(side='right', fill='y')
def manage_command_output(cli, stdout, stderr): """Display stdin or stderr and close the connection""" stdout.channel.recv_exit_status() if stderr is not None: errs = stderr.readlines() for err in errs: print(err) cli.close() lines = stdout.readlines() loading = True while loading is True: progress.pack(anchor='center') bar() response = "" for line in lines: response = response + line cli.close() loading = False progress.pack_forget() root = Tk() root.title('Response') scroll = Scrollbar(root) scroll.pack(side=tk.RIGHT, fill=tk.Y) text = Text(root) text.pack(side=tk.LEFT, fill=tk.Y) scroll.config(command=text.yview) text.config(yscrollcommand=scroll.set) text.insert(INSERT, response) root.mainloop()
def mostra_ranking(parent): columns = ("zero", "um", "dois", "tres") tabela = Treeview(parent, selectmode='browse', show="headings", columns=columns) tabela.column("zero", width=200) tabela.column("um", width=70) tabela.column("dois", width=100) tabela.column("tres", width=70) tabela.heading("zero", text="Jogador", anchor='center') tabela.heading("um", text="Recorde", anchor='center') tabela.heading("dois", text="Pontuação Total", anchor='center') tabela.heading("tres", text="Posição", anchor='center') tabela.pack(side='left', fill=BOTH, pady=10, padx=10) vsb = Scrollbar(parent, orient="vertical", command=tabela.yview) vsb.pack(side='left', fill='y') tabela.configure(yscrollcommand=vsb.set) atualiza_lista_jogadores(tabela) return tabela
class Scrollable(Frame): def __init__(self, master, outer_kwargs={}): Frame.__init__(self, master, **outer_kwargs) self.master = master self.canvas = Canvas(self, borderwidth=0, highlightthickness=0) self.frame = Frame(self.canvas, borderwidth=0) self.scrollbar = Scrollbar(self, orient=VERTICAL, command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.scrollbar.set) self.scrollbar.pack(side=RIGHT, fill=Y, expand=False) self.canvas.pack(side=LEFT, fill=BOTH, expand=True) self.canvas.create_window((0, 0), window=self.frame, tag='self.frame') self.frame.bind( '<Configure>', lambda event: self.canvas.configure( scrollregion=self.canvas.bbox('all'))) self.canvas.bind( '<Configure>', lambda event: self.canvas.itemconfig('self.frame', width=event.width)) self.canvas.bind_all( '<MouseWheel>', lambda event: self.canvas.yview_scroll( -2 * event.delta // 120, 'units')) self.canvas.yview_moveto(0) def scroll_to(self, coord: float): self.canvas.yview_moveto(coord) def get_coord(self): return self.canvas.yview()
class ScrolledListbox(Listbox): """ A scrolled listbox, based on tkinter.scrolledtext.ScrolledText """ def __init__(self, master=None, **kw): self.frame = Frame(master) self.vbar = Scrollbar(self.frame) self.vbar.pack(side=RIGHT, fill=Y) kw.update({'yscrollcommand': self.vbar.set}) Listbox.__init__(self, self.frame, **kw) self.pack(side=LEFT, fill=BOTH, expand=True) self.vbar['command'] = self.yview # Copy geometry methods of self.frame without overriding Listbox # methods -- hack! text_meths = vars(Listbox).keys() methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys() methods = methods.difference(text_meths) for m in methods: if m[0] != '_' and m != 'config' and m != 'configure': setattr(self, m, getattr(self.frame, m)) def __str__(self): return str(self.frame)
def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E")
def init_details(self, window): # Create details button def details(): if helper_frame.hidden: helper_frame.grid() helper_frame.hidden = False self.run_button.grid(row=17) else: helper_frame.grid_remove() helper_frame.hidden = True self.run_button.grid(row=16) details_button = Button(window, text="Details", command=details) details_button.grid(row=15, column=0, sticky="W", padx=PAD_X) # Details Menu helper_frame = Frame(window, width=window.winfo_width() - PAD_X * 2, height=100) helper_frame.pack_propagate(False) self.details_text = Text(helper_frame, width=0, height=0) details_scroll = Scrollbar(helper_frame, command=self.details_text.yview) details_scroll.pack(side=RIGHT, fill="y") self.details_text.configure(yscrollcommand=details_scroll.set) self.details_text.pack(fill="both", expand=True) helper_frame.grid(row=16, column=0, padx=PAD_X, pady=10) helper_frame.grid_remove() helper_frame.hidden = True
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()
class CimReadme(Toplevel): def __init__(self, parent): Toplevel.__init__(self, parent) self.configure(borderwidth=0) self.geometry("+%d+%d" % ( parent.winfo_rootx()+30, parent.winfo_rooty()+30)) self.vbar = Scrollbar(self) self.text = Text(self, wrap='word', borderwidth='0p') self.vbar['command'] = self.text.yview self.vbar.pack(side=RIGHT, fill='y') self.text['yscrollcommand'] = self.vbar.set self.text.pack(expand=1, fill="both") try: f = open(README_PATH) self.text.delete(1.0) self.text.insert(1.0, f.read()) self.text.delete('end - 1 chars') except: showerror("Error", "Cannot load README!") self.text.config(state='disabled') self.title('README') self.protocol("WM_DELETE_WINDOW", self.close) self.parent = parent self.bind('<Escape>', self.close) def close(self, event=None): self.destroy() def show(parent): dlg = CimReadme(parent) dlg.lift() dlg.focus_set()
class ScrolledFrame(Frame): def __init__(self, master=None, **kw): self.frame = Frame(master) self.vbar = Scrollbar(self.frame) self.vbar.pack(side='right', fill='y') self.canvas = Canvas(self.frame, yscrollcommand=self.vbar.set, borderwidth=0, relief='flat', highlightthickness=0, height=400, width=300) super().__init__(self.canvas, **kw) self.canvas.pack(side='left', fill='both') self.vbar.configure(command=self.canvas.yview) self.canvas.create_window((4, 4), window=self, anchor='nw') self.bind( "<Configure>", lambda e: self.canvas.config(scrollregion=self.canvas.bbox("all"))) frame_meths = vars(Frame).keys() methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys() methods = methods.difference(frame_meths) for m in methods: if m[0] != '_' and m != 'config' and m != 'configure': setattr(self, m, getattr(self.frame, m))
class FrameDataTable(Treeview): def __init__(self, master, *args, logobject=None, **kwargs): super().__init__(master, *args, columns=HEADERS, height=10, **kwargs) self.vsb = Scrollbar(self, orient="vertical", command=self.yview) self.vsb.pack(side='right', fill='y') self.hsb = Scrollbar(self, orient="horizontal", command=self.xview) self.hsb.pack(side='bottom', fill='x') self.config(yscrollcommand=self.vsb.set) self.config(xscrollcommand=self.hsb.set) self['show'] = 'headings' for col in HEADERS: self.heading(col, text=col.title(), command=lambda c=col: self.sortby(c, 0)) self.column(col, width=50) def sortby(self, col, descending): """sort tree contents when a column header is clicked on""" data = [(self.set(child, col), child) for child in self.get_children('')] if col == '#': data.sort(key=lambda t: int(t[0]), reverse=descending) else: data.sort(reverse=descending) for i, item in enumerate(data): self.move(item[1], '', i) # switch the heading so it will sort in the opposite direction self.heading(col, command=lambda col=col: self.sortby(col, int(not descending))) def new_table(self, content): print("new table content: ", content)
def __init__(self, frame, fig, width=16): # Base class initialization Frame.__init__(self, frame) self.frame = frame self.fig = fig # Instance variable for tkinter canvas self.tk_cnv = Canvas(self.frame, highlightthickness=0) self.tk_cnv.pack(side="left", anchor="nw", fill="both", expand=True) # Instance variable for the scroll-bar v_scroll = Scrollbar(self.frame) v_scroll.pack(side="right", anchor="ne", fill="y", expand=False) v_scroll.config(command=self.tk_cnv.yview, width=width) v_scroll.activate("slider") # Instance variable for the matplotlib canvas self.mpl_cnv = FigCanvas(fig, self.frame) self.mpl_cnv_widget = self.mpl_cnv.get_tk_widget() self.tk_cnv.config(yscrollcommand=v_scroll.set) self.tk_cnv.bind("<Configure>", self.__fill_canvas) # self.bind("<Enter>", self._bound_to_mousewheel) # self.bind("<Leave>", self._unbound_to_mousewheel) # Assign frame generated by the class to the canvas # and create a scrollable window for it. self.windows_item = \ self.tk_cnv.create_window(-80, 900, window=self.mpl_cnv_widget, anchor="nw", tag="self.mpl_widget") self.tk_cnv.config(scrollregion=self.tk_cnv.bbox("all"))
class TextViewer(Toplevel): "A simple text viewer dialog for IDLE." def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): """Show the given text in a scrollable window with a 'close' button. If modal is left True, users cannot interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. _utest - bool; don't wait_window when running unittest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # Place dialog below parent if running htest. self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) # TODO: get fg/bg from theme. self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() # Bind keys for closing this dialog. self.bind('<Return>',self.Ok) self.bind('<Escape>',self.Ok) self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() if not _utest: self.wait_window() def CreateWidgets(self): "Create Frame with Text (with vertical Scrollbar) and Button." frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
class TextViewer(Toplevel): """A simple text viewer dialog for IDLE """ def __init__(self, parent, title, text, modal=True, _htest=False): """Show the given text in a scrollable window with a 'close' button If modal option set to False, user can interact with other windows, otherwise they will be unable to interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # place dialog below parent if running htest self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) #elguavas - config placeholders til config stuff completed self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() #key bindings for this dialog self.bind('<Return>',self.Ok) #dismiss dialog self.bind('<Escape>',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
class TextViewer(Toplevel): """A simple text viewer dialog for IDLE """ def __init__(self, parent, title, text, modal=True, _htest=False): """Show the given text in a scrollable window with a 'close' button If modal option set to False, user can interact with other windows, otherwise they will be unable to interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # place dialog below parent if running htest self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) #elguavas - config placeholders til config stuff completed self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() #key bindings for this dialog self.bind('<Return>',self.Ok) #dismiss dialog self.bind('<Escape>',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
class ChatText(Text): def __init__(self, master, **kwargs): self.master = Frame(master) self.font = Font(family="Helvetica", size=DEFAULT_FONT_SIZE) self.font_bold = Font(family="Helvetica", size=DEFAULT_FONT_SIZE, weight=BOLD) Text.__init__(self, self.master, font=self.font, state=DISABLED, **kwargs) self.scrollbar = Scrollbar(self.master, orient=VERTICAL, command=self.yview) self.search_frame = SearchFrame(self.master) self.configure(yscrollcommand=self.scrollbar.set) self.images: dict = {} self.declare_tags() def declare_tags(self): for color in default_colors: self.tag_configure(color, foreground=color, font=self.font_bold) self.tag_configure('search_result', background='lightgreen') def pack(self, **kwargs): self.master.pack(**kwargs) self.search_frame.pack(side=BOTTOM, fill=X) self.scrollbar.pack(side=RIGHT, fill=Y) Text.pack(self, side=LEFT, fill=BOTH, expand=True) def repack(self): self.search_frame.pack_forget() self.scrollbar.pack_forget() Text.pack_forget(self) self.search_frame.pack(side=BOTTOM, fill=X) self.scrollbar.pack(side=RIGHT, fill=Y) Text.pack(self, side=LEFT, fill=BOTH, expand=True) def append_message(self, username: str, fragments: list, color: str, autoscroll: bool = True): self.configure(state=NORMAL) if color not in default_colors: self.tag_configure(color, foreground=color, font=self.font_bold) self.insert(END, username, color) self.insert(END, ' : ') for fragment in fragments: if 'emoticon' in fragment: emote_id = fragment.get('emoticon').get('emoticon_id') image = self.images.get(emote_id) if image is None: image_path = get_emote(emote_id) image = ImageTk.PhotoImage(Image.open(image_path)) self.images[emote_id] = image self.image_create(END, image=image, padx=2, pady=2) else: self.insert(END, fragment.get('text'), fragment.get('tag')) if autoscroll: self.yview_moveto(1.0) self.insert(END, '\n') self.configure(state=DISABLED) def clear(self): self.configure(state=NORMAL) self.delete(1.0, END) self.configure(state=DISABLED)
def __init__(self, parent): tk.Frame.__init__(self, parent, background="#333333") self.parent = parent self.name = 'name' self.parent.title("CDDA Translator") self.mod = tk.StringVar() self.mod.set("Current mod: " + configs.get('Mods', 'mod')) modbar = tk.Frame(self, background="#424242") modbar.pack(side="top", fill="x") toolbar = tk.Frame(self, background="light grey") toolbar.pack(side="top", fill="y") self.text = tk.Text(self, wrap="word") self.text.pack(side="top", fill="both", expand=True) self.text.tag_configure("stderr", foreground="#b22222") scroll = Scrollbar(command=self.text.yview) scroll.pack(side="right", fill="y") self.text.config(yscrollcommand=scroll.set) self.pack(fill=tk.BOTH, expand=1) self.centerWindow() sys.stdout = TextRedirector(self.text, "stdout") sys.stderr = TextRedirector(self.text, "stderr") btn_file = Button(self, text="Select mod", command=self.select_mod, width=14) btn_file.pack(in_=toolbar, side="left", padx=3, pady=1) btn_settings = Button(self, text='Extract strings', command=self.extractor, width=14) btn_settings.pack(in_=toolbar, side="left", padx=3, pady=1) btn_convert = Button(self, text='Update strings', command=self.converter, width=14) btn_convert.pack(in_=toolbar, side="left", padx=3, pady=1) btn_convert = Button(self, text='Rewrite json', command=self.rewrite, width=14) btn_convert.pack(in_=toolbar, side="left", padx=3, pady=1) dynlabel = Label(self, textvariable=self.mod, background="#424242", foreground="#dddddd", font="Courier 10 bold") dynlabel.pack(in_=modbar, side="bottom", fill="y", anchor=tk.NW)
def __init__(self, **kwargs): super(ScrollingFrame, self).__init__(**kwargs) style = Style() canvas = Canvas(master=self) scrollbar = Scrollbar(master=self, command=canvas.yview) canvas.configure(yscrollcommand=scrollbar.set) self.inner = inner = Frame(master=canvas) self.inner.bind( '<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all'))) inner_id = canvas.create_window((0, 0), window=self.inner, anchor='nw') canvas.pack(side='left', fill='both', expand=True) scrollbar.pack(side='right', fill='y') def _bind_mouse(event=None): canvas.bind_all("<4>", _on_mousewheel) canvas.bind_all("<5>", _on_mousewheel) canvas.bind_all("<MouseWheel>", _on_mousewheel) def _unbind_mouse(event=None): canvas.unbind_all("<4>") canvas.unbind_all("<5>") canvas.unbind_all("<MouseWheel>") def _on_mousewheel(event): """Linux uses event.num; Windows / Mac uses event.delta""" if event.num == 4 or event.delta > 0: canvas.yview_scroll(-1, "units") elif event.num == 5 or event.delta < 0: canvas.yview_scroll(1, "units") def _configure_inner(event): # update the scrollbars to match the size of the inner frame size = (inner.winfo_reqwidth(), inner.winfo_reqheight()) canvas.config(scrollregion="0 0 %s %s" % size) if inner.winfo_reqwidth() != canvas.winfo_width(): # update the canvas's width to fit the inner frame canvas.config(width=inner.winfo_reqwidth()) inner.bind('<Configure>', _configure_inner) def _configure_canvas(event): if inner.winfo_reqwidth() != canvas.winfo_width(): # update the inner frame's width to fill the canvas canvas.itemconfigure(inner_id, width=canvas.winfo_width()) canvas.bind('<Configure>', _configure_canvas) canvas.bind("<Enter>", _bind_mouse) canvas.bind("<Leave>", _unbind_mouse)
class ShowStatus: def __init__(self, title): self.root = mtk.Tk() self.root.geometry("340x500") self.root.title(f"[{title}]下载进度") def createUI(self, func): # 日志信息 self.logBox = mtk.LabelFrame(self.root, text="下载进度", fg="blue") self.logBox.place(x=20, y=20, width=300, height=280) title = ['1', '2', '3'] self.box = ttk.Treeview(self.logBox, columns=title, show='headings') self.box.place(x=15, y=15, width=275, height=225) self.box.column('1', width=30, anchor='center') self.box.column('2', width=165, anchor='center') self.box.column('3', width=80, anchor='center') self.box.heading('1', text='序号') self.box.heading('2', text='文章标题') self.box.heading('3', text='状态') self.VScroll1 = Scrollbar(self.box, orient='vertical', command=self.box.yview) self.VScroll1.pack(side="right", fill="y") self.box.configure(yscrollcommand=self.VScroll1.set) self.logInfoBox = mtk.LabelFrame(self.root, text="日志信息", fg="blue") self.logInfoBox.place(x=20, y=310, width=300, height=150) # 下载进度 self.logText = scrolledtext.ScrolledText(self.logInfoBox, fg="green") self.logText.place(x=15, y=10, width=275, height=110) self.logText.bind(sequence="<Double-Button-1>", func=lambda x: self.thread_it(func)) def addLog(self, msg): self.logText.insert(mtk.END, "{} {}\n".format(datetime.now().strftime("%H:%M:%S"), msg)) self.logText.yview_moveto(1.0) def deleteTree(self): x = self.box.get_children() for item in x: self.box.delete(item) @staticmethod def thread_it(func, *args): t = threading.Thread(target=func, args=args) t.setDaemon(True) t.start() # def start(self): # self.root.mainloop() # if __name__ == '__main__': # app = ShowStatus(1111) # app.start()
def progress( self ): o=os.popen("cd {0} && snakemake --dryrun --rerun-incomplete > {0}/Reports/checkpoint".format(self.workpath.get())) o.close() F=open("{0}/Reports/checkpoint".format(self.workpath.get()),"r").read() rules2={} rules=re.findall(r'rule .+:',F) for i in rules: i=re.sub("rule ","",i) i=re.sub(":","",i) rules2[i]=0 F=open("{0}/Reports/{1}.dot".format(self.workpath.get(), self.Pipeline.get() ),"r").read() for i in rules2.keys(): F=re.sub(r'('+i+')(\".+?)\".+?\"',r'\1_pending\2"0.0 0.0 0.0"',F) # F=re.sub(i,"",F) G=open("{0}/Reports/{1}-{2}.dot".format(self.workpath.get(),self.Pipeline.get(),"progress"),"w") G.write(F) G.close() o=os.popen("cd {0}/Reports && dot -Tpng -o {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.dot;convert {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.gif".format(self.workpath.get(),self.Pipeline.get())) # tkinter.messagebox.showerror("o",o) PL=self.Pipeline.get() #pipelineget() gf=Toplevel() gf.title("CCBR Pipeliner: {0} Progress Graph".format(PL)) cgf = Canvas(gf,bg="white") # gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,1000,5000)) try: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) except: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def progress( self ): o=os.popen("cd {0} && snakemake --dryrun --rerun-incomplete > {0}/Reports/checkpoint".format(self.workpath.get())) o.close() F=open("{0}/Reports/checkpoint".format(self.workpath.get()),"r").read() rules2={} rules=re.findall(r'rule .+:',F) for i in rules: i=re.sub("rule ","",i) i=re.sub(":","",i) rules2[i]=0 F=open("{0}/Reports/{1}.dot".format(self.workpath.get(), self.Pipeline.get() ),"r").read() for i in rules2.keys(): F=re.sub(r'('+i+')(\".+?)\".+?\"',r'\1_pending\2"0.0 0.0 0.0"',F) # F=re.sub(i,"",F) G=open("{0}/Reports/{1}-{2}.dot".format(self.workpath.get(),self.Pipeline.get(),"progress"),"w") G.write(F) G.close() o=os.popen("cd {0}/Reports && dot -Tpng -o {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.dot;convert {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.gif".format(self.workpath.get(),self.Pipeline.get())) # tkinter.messagebox.showerror("o",o) PL=self.Pipeline.get() #pipelineget() gf=Toplevel() gf.title("CCBR Pipeliner: {0} Progress Graph".format(PL)) cgf = Canvas(gf,bg="white") # gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,1000,5000)) try: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) except: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
class EntryOptionsWindow: def __init__(self, ls: str, tk: Tk, select_path=False) -> None: self.select_path = select_path self.List = ls self.Tk = tk self.Root = Toplevel(self.Tk) self.Root.withdraw() self.Frame = Frame(self.Root) self.Box = Listbox(self.Frame, selectmode='extended', width=54, height=24) for i in globals()[self.List]: self.Box.insert(END, i) self.Scroll = Scrollbar(self.Frame, command=self.Box.yview) self.Entry = Entry(self.Frame) self.ButtonAdd = Button(self.Frame, text='Добавить', command=self.__add_item) self.ButtonDel = Button(self.Frame, text='Удалить', command=self.__del_item) self.ButtonDone = Button(self.Frame, text='Готово', command=self.__save_list) self.ButtonExit = Button(self.Frame, text='Отмена', command=self.Root.destroy) def __add_item(self) -> None: if self.select_path: text = filedialog.askdirectory() else: text = self.Entry.get() if text: self.Box.insert(END, text) self.Entry.delete(0, END) def __del_item(self) -> None: select = list(self.Box.curselection()) select.reverse() for i in select: self.Box.delete(i) def __save_list(self) -> None: globals()[self.List] = list(self.Box.get(0, END)) self.Root.destroy() def main(self) -> None: center_win(self.Root, '500x400') self.Root.deiconify() self.Root.title(f'Editing {self.List}') self.Box.pack(side='left', expand=True) self.Scroll.pack(side='left', fill='y') self.Box.config(yscrollcommand=self.Scroll.set) self.Frame.pack(side='left', padx=10) if not self.select_path: self.Entry.pack(anchor='n') self.ButtonAdd.pack(fill='x') self.ButtonDel.pack(fill='x') self.ButtonDone.pack(fill='x') self.ButtonExit.pack(fill='x') self.Root.mainloop()
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) sbar = Scrollbar(self) list = Listbox(self) sbar.config(command=list.yview) list.config(yscrollcommand=sbar.set) sbar.pack(side='right', fill='y') list.pack(side='left', expand='yes', fill='both') list.bind('<<ListboxSelect>>', self._on_listbox_click) self.__list_click_callback = None self.__list = list self.__sbar = sbar
def _add_scrollbars(self): for orient in self.scrollbars: if orient == 'x': xsb = Scrollbar(self.master, orient=HORIZONTAL, command=self.xview) xsb.pack(side=BOTTOM, fill=X) self.configure(xscroll=xsb.set) if orient == 'y': ysb = Scrollbar(self.master, orient=VERTICAL, command=self.yview) ysb.pack(side=RIGHT, fill=Y) self.configure(yscroll=ysb.set)
class Page3(Frame): '''Note: the canvas used is from tkinter but the rest of the widgets are from ttk ''' def __init__(self, master): Frame.__init__(self, master) self.style = Style() self.style.configure('TButton', takefocus=0) self.canvas = Canvas(self, background='#471d0f') self.scroll_history = Scrollbar(self, orient='vertical', command=self.canvas.yview) self.moving_frame = Frame(self.canvas) self.canvas.create_window((0, 0), window=self.moving_frame, anchor='nw') self.moving_frame.bind( "<Configure>", lambda event: self.canvas.configure( scrollregion=self.canvas.bbox("all"))) self.canvas.configure(yscrollcommand=self.scroll_history.set) self.update_button = Button(self.moving_frame, text='Update History', command=self.update_history) self.scroll_history.pack(fill='both', side='right') self.canvas.pack(fill='both', side='left', expand=True) self.update_button.pack(anchor='ne', fill='x', expand=True) # Label(self.moving_frame, text='HISTORY HERE').pack(anchor='ne', fill='x') self.grid(row=0, column=0) def update_history(self): if Task.tasks: for task in Task.tasks: if task.on_display == False: history_instance = LabelFrame(self.moving_frame, text=task.task_name) Label( history_instance, text= f'Task Duration: {datetime.timedelta(seconds=task.task_duration)}' ).pack() Label( history_instance, text=f'Break Duration: {task.break_duration}').pack() Label(history_instance, text=f'Made on: {task.init_date}').pack() history_instance.pack(anchor='n', fill='both') task.on_display = True
def __init__(self, container, *args, **kwargs): super().__init__(container, *args, **kwargs) canvas = tk.Canvas(self) scrollbar = Scrollbar(self, orient="vertical", command=canvas.yview) self.scrollable_frame = Frame(canvas) self.scrollable_frame.bind( "<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
def __init__(self): """Initialise manager.""" Tk.__init__(self) self.title("GUI Test Manager") self.geometry("400x300") ## Dictionary of Toplevel tests who are current active. self.active_tests = {} ## List of all available test classes. self.all_tests = [] # Create widgets to show list of available tests. Label(self, text="Available Tests", font=("Comic Sans MS", "24")).pack(padx=3, pady=3) Label(self, text="Click a test to open it, and again to close it.", font=["Comic Sans MS"]).pack() # Create container for listbox and scrollbar. list_frame = Frame(self) list_frame.pack(fill="both", expand=1, padx=3, pady=3) # Add scrollbar for Listbox. list_scrollbar = Scrollbar(list_frame, orient="vertical") list_scrollbar.pack(side="right", fill="y") # Create Listbox next to scrollbar. self.all_tests_list = Listbox(list_frame, selectmode="multiple", yscrollcommand=list_scrollbar.set, selectborderwidth=5, font=("Comic Sans MS", "16", "italic"), activestyle="none", takefocus=1, cursor="pirate") # Bind the event for 0ms after a click, so the listbox can process first. self.all_tests_list.bind( "<ButtonPress-1>", lambda e: self.after(0, lambda e=e: self.on_test_list_pressed(e))) self.all_tests_list.pack(side="left", fill="both", expand=1) # Link scrollbar and listbox scroll commands. list_scrollbar.config(command=self.all_tests_list.yview) # Perform initial refresh. self.refresh_available()
def __init__(self, parent, manager): """ CsvFrame constructor """ top = self.top = tkinter.Toplevel(parent) self.__parent = parent self.__manager = manager top_frame = tkinter.Frame(top, borderwidth=2, relief=tkinter.GROOVE) top_frame.pack(side=tkinter.TOP, fill=tkinter.X, padx=5, pady=5) label_data = Label(top_frame, text="Data: ") label_data.grid(row=1, column=1, padx=5, pady=5) data_select_combo3 = tkinter.StringVar() self.combo_data = Combobox(top_frame, textvariable=data_select_combo3, values=manager.get_field_names(), state='readonly', postcommand=lambda: self.combo_data.configure(values=manager.get_field_names())) self.combo_data.grid(row=1, column=2, padx=5, pady=5) edit_button = Button(top_frame, text="Edit header", command=self.edit_header, width=20) edit_button.grid(row=1, column=3, columnspan=1, rowspan=1, padx=5, pady=5) # TODO change values for combobox transform_select_combo4 = tkinter.StringVar() self.combo_transform = Combobox(top_frame, textvariable=transform_select_combo4, values=["rad_to_deg", "deg_to_rad"], state='readonly') self.combo_transform.grid(row=1, column=4, padx=5, pady=5) transform_button = Button(top_frame, text="Transform data", command=self.transform_data, width=20) transform_button.grid(row=1, column=5, columnspan=1, rowspan=1, padx=5, pady=5) table_frame = Frame(top) table_frame.pack(side=tkinter.BOTTOM, expand=True, fill=tkinter.BOTH) scrollbar_x = Scrollbar(table_frame, orient=tkinter.HORIZONTAL) scrollbar_y = Scrollbar(table_frame, orient=tkinter.VERTICAL) self.tree = Treeview(table_frame, columns=manager.get_field_names(), show="headings", selectmode="extended", yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set) scrollbar_y.config(command=self.tree.yview) scrollbar_y.pack(side=tkinter.RIGHT, fill=tkinter.Y) scrollbar_x.config(command=self.tree.xview) scrollbar_x.pack(side=tkinter.BOTTOM, fill=tkinter.X) self.fill_data() self.tree.pack(expand=True, fill=tkinter.BOTH) self.top.protocol("WM_DELETE_WINDOW", self.quit)
def show_list(elements, tk): # Scrollbar scrollbar = Scrollbar(tk) scrollbar.pack(side=RIGHT, fill=Y) # Listbox widget mylist = Listbox(tk, yscrollcommand=scrollbar.set) mylist.pack(fill=BOTH, expand=1) scrollbar.config(command=mylist.yview) # Add elements to listbox for item in elements: mylist.insert(END, "Título: " + item[0]) mylist.insert(END, "Link: " + item[1]) mylist.insert(END, "Autor: " + item[2]) mylist.insert(END, "Fecha de publicación: " + str(item[3])) if item[4] is not None: mylist.insert(END, "Contenido: " + item[4]) mylist.insert(END, "")
def __init__(self, *args, **kwargs): Frame.__init__(self, *args, **kwargs) canvas = Canvas(self) xbar = Scrollbar(self, orient='horizontal') xbar.config(command=canvas.xview) canvas.config(xscrollcommand=xbar.set) xbar.pack(side='bottom', fill='x') ybar = Scrollbar(self) ybar.config(command=canvas.yview) canvas.config(yscrollcommand=ybar.set) ybar.pack(side='right', fill='y') canvas.pack(expand='yes', fill='both') self.__canvas = canvas
def make_widgets(self, horizontal_scroll=False): text = TextWinHotkey(self, relief='sunken') ybar = Scrollbar(self) ybar.config(command=text.yview) ybar.pack(side='right', fill='y') if horizontal_scroll: xbar = Scrollbar(self) xbar.config(command=text.xview, orient='horizontal') xbar.pack(side='bottom', fill='x') text.config(xscrollcommand=xbar.set) text.config(yscrollcommand=ybar.set) text.pack(side='left', expand='yes', fill='both') self.text = text # To Do: change the attribute name.
class ScrollableFrame(Frame): def __init__(self, root): Frame.__init__(self, root) self.canvas = ResizingCanvas(self, borderwidth=0) self.frame = Frame(self.canvas) self.vsb = Scrollbar( self, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.canvas.pack(side="left", fill="both", expand=True) self.canvas.create_window( (4, 4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.OnFrameConfigure) def OnFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' # print "OnFrameConfigure" self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def __init__(self, container, *args, **kwargs): super().__init__(container, *args, **kwargs) frameTHeader = Frame(self) frameTHeader.pack(side=TOP, fill="x") frameTBody = Frame(self) frameTBody.pack(fill="both", expand=True) canvas_table_header = tk.Canvas(frameTHeader, height=20) self.scrollable_theader = Frame(canvas_table_header) self.scrollable_theader.bind( "<Configure>", lambda e: canvas_table_header.configure( scrollregion=canvas_table_header.bbox("all") ) ) canvas_table_body = tk.Canvas(frameTBody) def multiple_xview(*args): canvas_table_header.xview(*args) canvas_table_body.xview(*args) scrollbar_horizontal = Scrollbar(frameTBody, orient="horizontal", command=multiple_xview) scrollbar_vertical = Scrollbar(frameTBody, orient="vertical", command=canvas_table_body.yview) self.scrollable_frame = Frame(canvas_table_body) self.scrollable_frame.bind( "<Configure>", lambda e: canvas_table_body.configure( scrollregion=canvas_table_body.bbox("all") ) ) canvas_table_header.create_window((0, 0), window=self.scrollable_theader, anchor="nw") canvas_table_header.configure(xscrollcommand=scrollbar_horizontal.set) canvas_table_body.create_window((0, 0), window=self.scrollable_frame, anchor="nw") canvas_table_body.configure(yscrollcommand=scrollbar_vertical.set, xscrollcommand=scrollbar_horizontal.set) scrollbar_vertical.pack(side="right", fill="y") scrollbar_horizontal.pack(side="bottom", fill="x") canvas_table_header.pack(fill="x", expand=True) canvas_table_body.pack( fill="both", expand=True)
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 __init__(self, parent, *args, **kw): Frame.__init__(self, parent, *args, **kw) # create a canvas object and a vertical scrollbar for scrolling it vscrollbar = Scrollbar(self, orient=VERTICAL) vscrollbar.pack(fill=Y, side=RIGHT, expand=False) self.canvas = canvas = StyledCanvas( self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) canvas.pack(side=LEFT, fill=BOTH, expand=True) vscrollbar.config(command=canvas.yview) # reset the view canvas.xview_moveto(0) canvas.yview_moveto(0) # create a frame inside the canvas which will be scrolled with it self.interior = interior = Frame(canvas) interior_id = canvas.create_window(0, 0, window=interior, anchor=N+W) # track changes to the canvas and frame width and sync them, # also updating the scrollbar def _configure_interior(event): # update the scrollbars to match the size of the inner frame size = (interior.winfo_reqwidth(), interior.winfo_reqheight()) canvas.config(scrollregion="0 0 %s %s" % size) if interior.winfo_reqwidth() != canvas.winfo_width(): # update the canvas's width to fit the inner frame canvas.config(width=interior.winfo_reqwidth()) interior.bind('<Configure>', _configure_interior) def _configure_canvas(event): if interior.winfo_reqwidth() != canvas.winfo_width(): # update the inner frame's width to fill the canvas canvas.itemconfigure(interior_id, width=canvas.winfo_width()) canvas.bind('<Configure>', _configure_canvas) MouseWheel(self).add_scrolling(canvas, yscrollbar=vscrollbar)
def workflow(self): PL=self.Pipeline.get() #pipelineget() gf=Toplevel() #MkaS=os.popen("./makeasnake.py 2>&1 | tee -a "+workpath.get()+"/Reports/makeasnake.log").read() gf.title("CCBR Pipeliner: "+ PL + " Workflow Graph") cgf = Canvas(gf,bg="white") #gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,5000,20000)) img = PhotoImage(file=self.workpath.get()+"/Reports/"+PL+".gif") cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def __init__(self): Tk.__init__(self) saveload.SaveLoadMixin.__init__(self) self.title("ARE") self.rprocess = Popen(["R","--interactive", "--no-save"], stdin=PIPE, stdout=PIPE, stderr=STDOUT) # Left-right split split = PanedWindow(self, sashwidth=6) split.pack(fill=BOTH, expand=True) # Editor (left hand side) lexer = get_lexer_by_name("r") self.editor = editor.SyntaxHighlightingText(split, lexer) self.editor.bind("<F5>", self.editorlinerunner) self.editor.bind("<Control-F5>", self.editorallrunner) split.add(self.editor) # Right hand side: console output... rhs = Frame(split) consoleframe = Frame(rhs) self.console = rconsole.ConsoleDisplay(consoleframe, process=self.rprocess) self.console.pack(side=LEFT, fill=BOTH, expand=True) scrollbar = Scrollbar(consoleframe, command=self.console.yview) self.console.config(yscrollcommand=scrollbar.set) scrollbar.pack(side=LEFT, fill=Y) consoleframe.pack(fill=BOTH, expand=True) # ...and input self.input = Text(rhs, height=4, background="white") self.input.pack(fill=X) self.input.bind("<Return>", self.inputeater) # Use shift-enter for multi-line entry, so allow default action self.input.bind("<Shift-Return>", lambda e: None) split.add(rhs) # Menus menubar = Menu(self) filemenu = Menu(menubar, tearoff=False) filemenu.add_command(label="New", command=self.newfile) filemenu.add_command(label="Open (Ctrl-O)", command=self.askopen) filemenu.add_command(label="Save (Ctrl-S)", command=self.quietsave) filemenu.add_command(label="Save as (Ctrl-Shift-S)", command=self.asksave) menubar.add_cascade(label="File", menu=filemenu) menubar.add_command(label="Run line/selection (F5)", command=self.editorlinerunner) menubar.add_command(label="Run all (Ctrl-F5)", command=self.editorallrunner) self.config(menu=menubar) # Keyboard shortcuts self.bind("<Control-s>", self.quietsave) self.bind("<Control-S>", self.asksave) # Capital S = Shift-S self.bind("<Control-o>", self.askopen) # Show the window self.editor.focus_set()
class CimFilePage(Notebook): def __init__(self, parent): Notebook.__init__(self, parent, style='Type.TNotebook') logger = logging.getLogger(__name__) s = Style() s.configure('Type.TNotebook', tabposition="se") self.page_tiborcim = Frame(self) self.page_python = Frame(self) self.add(self.page_tiborcim, text='Tiborcim') self.add(self.page_python, text='Python') self.text_tiborcim = CimTiborcimText(self.page_tiborcim, self) self.vbar_python = Scrollbar(self.page_python, name='vbar_python') self.xbar_python = Scrollbar(self.page_python, name='xbar_python', orient="horizontal") self.text_python = Text(self.page_python, wrap="none", state="disabled", borderwidth='0p') self.vbar_python['command'] = self.text_python.yview self.vbar_python.pack(side="right", fill="y") self.text_python['yscrollcommand'] = self.vbar_python.set self.xbar_python['command'] = self.text_python.xview self.xbar_python.pack(side="bottom", fill="x") self.text_python['xscrollcommand'] = self.xbar_python.set self.text_python.pack(expand=1, fill="both") self.viewmode = "tiborcim" self.saved = True self.filename = None def save_file(self): if self.filename is None: self.save_file_as() else: self.saved = True; self.text_tiborcim.edit_modified(False) f = open(self.filename, "w") f.write(self.text_tiborcim.get("1.0", "end")) f.close() def convert_file(self): from tiborcim.tibc import compiler as tibc # Should warn if unsaved... com = tibc(self.text_tiborcim.get("1.0", "end")) try: self.text_python.config(state="normal") self.text_python.delete("1.0", "end") self.text_python.insert("end", ''.join(com.output)) self.text_python.config(state="disabled") except: logging.warning("That's Odd") def save_file_as(self): f = asksaveasfile(mode='w', defaultextension=".tibas", filetypes=(("Tiborcim", "*.tibas"),("All files", "*.*") )) if f is not None: self.filename = f.name self.save_file() def load_file(self, name): self.filename = name logging.debug('Load ' + name) try: f = open(name) self.text_tiborcim.delete("1.0") self.text_tiborcim.insert("1.0", f.read()) self.text_tiborcim.delete('end - 1 chars') self.saved = True; f.close() except: showerror("Open Source File", "Failed to read file\n'%s'" % name) return def view_tiborcim(self, event=None): self.select(self.page_tiborcim) self.viewmode = "tiborcim" def view_python(self, event=None): self.select(self.page_python) self.viewmode = "python" def get_file(self): filebit = self.filename.split(sep) if len(filebit) == 1: filebit = self.filename.split(altsep) return filebit[len(filebit) - 1]; def close(self): if not self.saved: if askokcancel("Unsaved Changes", "Somefiles havent been saved!"): logging.debug("Close Anyway") return True else: self.save_file() return False else: return True
class BibleReferenceBox( Frame, BibleBox ): """ """ def __init__( self, parentWindow, parentApp, internalBible, referenceObject ): if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.__init__( {}, {}, {}, {} )").format( parentWindow, parentApp, internalBible.name, referenceObject ) ) self.parentWindow, self.parentApp, self.internalBible, self.referenceObject = parentWindow, parentApp, internalBible, referenceObject #self.parentApp = self.parentWindow.parentApp Frame.__init__( self, parentWindow ) BibleBox.__init__( self, self.parentApp ) # Set some dummy values required soon self._viewRadioVar, self._groupRadioVar = tk.IntVar(), tk.StringVar() self.groupCode = BIBLE_GROUP_CODES[0] # Put into first/default BCV group self.contextViewMode = DEFAULT self.viewMode = DEFAULT self.currentVerseKey = SimpleVerseKey( 'UNK','1','1' ) # Unknown book if self.contextViewMode == DEFAULT: self.contextViewMode = 'ByVerse' self.parentWindow.viewVersesBefore, self.parentWindow.viewVersesAfter = 2, 6 # Create a title bar titleBar = Frame( self ) Button( titleBar, text=_('Close'), command=self.doClose ).pack( side=tk.RIGHT ) ## Try to get the title width somewhere near correct (if moduleID is a long path) #adjModuleID = moduleID #self.update() # so we can get the geometry #width = parseWindowSize( self.parentWindow.geometry() )[0] - 60 # Allow for above button #if len(adjModuleID)*10 > width: # Note: this doesn't adjust if the window size is changed #print( "BRB here1", len(adjModuleID), width, repr(adjModuleID) ) #x = len(adjModuleID)*100/width # not perfect (too small) for narrow windows #adjModuleID = '…' + adjModuleID[int(x):] #print( "BRB here2", len(adjModuleID), x, repr(adjModuleID) ) #titleText = '{} ({})'.format( adjModuleID, boxType.replace( 'BibleReferenceBox', '' ) ) titleText = self.referenceObject.getShortText() self.titleLabel = tk.Label( titleBar, text=titleText ) self.titleLabel.pack( side=tk.TOP, fill=tk.X ) titleBar.pack( side=tk.TOP, fill=tk.X ) # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) self.textBox = tk.Text( self, height=4, yscrollcommand=self.vScrollbar.set ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.X ) # Full width self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Set-up our standard Bible styles for USFMKey, styleDict in self.parentApp.stylesheet.getTKStyles().items(): self.textBox.tag_configure( USFMKey, **styleDict ) # Create the style # Add our extra specialised styles self.textBox.tag_configure( 'contextHeader', background='pink', font='helvetica 6 bold' ) self.textBox.tag_configure( 'context', background='pink', font='helvetica 6' ) self.pack( expand=tk.YES, fill=tk.BOTH ) # Pack the frame # Set-up our Bible system and our callables self.BibleOrganisationalSystem = BibleOrganizationalSystem( "GENERIC-KJV-66-ENG" ) # temp self.getNumChapters = self.BibleOrganisationalSystem.getNumChapters self.getNumVerses = lambda b,c: 99 if c=='0' or c==0 else self.BibleOrganisationalSystem.getNumVerses( b, c ) self.isValidBCVRef = self.BibleOrganisationalSystem.isValidBCVRef self.getFirstBookCode = self.BibleOrganisationalSystem.getFirstBookCode self.getPreviousBookCode = self.BibleOrganisationalSystem.getPreviousBookCode self.getNextBookCode = self.BibleOrganisationalSystem.getNextBookCode self.getBBB = self.BibleOrganisationalSystem.getBBB self.getBookName = self.BibleOrganisationalSystem.getBookName self.getBookList = self.BibleOrganisationalSystem.getBookList self.maxChapters, self.maxVerses = 150, 150 # temp self.verseCache = OrderedDict() self.updateShownReferences( self.referenceObject ) # end of BibleReferenceBox.__init__ def createStandardKeyboardBindings( self ): """ Create keyboard bindings for this widget. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createStandardKeyboardBindings()") ) for name,command in ( ('SelectAll',self.doSelectAll), ('Copy',self.doCopy), ('Find',self.doFind), ('Refind',self.doRefind), ('Info',self.doShowInfo), ('Close',self.doClose) ): self.createStandardKeyboardBinding( name, command ) # end of BibleReferenceBox.createStandardKeyboardBindings() def xxxgotoBCV( self, BBB, C, V ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.gotoBCV( {} {}:{} from {} )").format( BBB, C, V, self.currentVerseKey ) ) # We really need to convert versification systems here adjBBB, adjC, adjV, adjS = self.BibleOrganisationalSystem.convertToReferenceVersification( BBB, C, V ) self.parentWindow.gotoGroupBCV( self.groupCode, adjBBB, adjC, adjV ) # then the App will update me by calling updateShownBCV # end of BibleReferenceBox.gotoBCV def getContextVerseData( self, verseKey ): """ Fetches and returns the internal Bible data for the given reference. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.getContextVerseData( {} )").format( verseKey ) ) if self.internalBible is not None: try: return self.internalBible.getContextVerseData( verseKey ) except KeyError: logging.critical( exp("BibleReferenceBox.getContextVerseData for {} {} got a KeyError!") \ .format( self.boxType, verseKey ) ) # end of BibleReferenceBox.getContextVerseData def XXXgetSwordVerseKey( self, verseKey ): #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getSwordVerseKey( {} )").format( verseKey ) ) BBB, C, V = verseKey.getBCV() return self.parentApp.SwordInterface.makeKey( BBB, C, V ) # end of BibleReferenceBox.getSwordVerseKey def getCachedVerseData( self, verseKey ): """ Checks to see if the requested verse is in our cache, otherwise calls getContextVerseData (from the superclass) to fetch it. The cache keeps the newest or most recently used entries at the end. When it gets too large, it drops the first entry. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getCachedVerseData( {} )").format( verseKey ) ) verseKeyHash = verseKey.makeHash() if verseKeyHash in self.verseCache: #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( " " + exp("Retrieved from BibleReferenceBox cache") ) self.verseCache.move_to_end( verseKeyHash ) #print( " returning", self.verseCache[verseKeyHash][0] ) return self.verseCache[verseKeyHash] verseContextData = self.getContextVerseData( verseKey ) self.verseCache[verseKeyHash] = verseContextData if len(self.verseCache) > MAX_CACHED_VERSES: #print( "Removing oldest cached entry", len(self.verseCache) ) self.verseCache.popitem( last=False ) return verseContextData # end of BibleReferenceBox.getCachedVerseData def XXXXgetBeforeAndAfterBibleData( self, newVerseKey ): """ Returns the requested verse, the previous verse, and the next n verses. """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.getBeforeAndAfterBibleData( {} )").format( newVerseKey ) ) assert( isinstance( newVerseKey, SimpleVerseKey ) ) BBB, C, V = newVerseKey.getBCV() intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() prevBBB, prevIntC, prevIntV = BBB, intC, intV previousVersesData = [] for n in range( -self.parentWindow.viewVersesBefore, 0 ): failed = False #print( " getBeforeAndAfterBibleData here with", n, prevIntC, prevIntV ) if prevIntV > 0: prevIntV -= 1 elif prevIntC > 0: prevIntC -= 1 try: prevIntV = self.getNumVerses( prevBBB, prevIntC ) except KeyError: if prevIntC != 0: # we can expect an error for chapter zero logging.critical( exp("getBeforeAndAfterBibleData failed at"), prevBBB, prevIntC ) failed = True #if not failed: #if BibleOrgSysGlobals.debugFlag: print( " Went back to previous chapter", prevIntC, prevIntV, "from", BBB, C, V ) else: prevBBB = self.BibleOrganisationalSystem.getPreviousBookCode( BBB ) if prevBBB is None: failed = True else: prevIntC = self.getNumChapters( prevBBB ) prevIntV = self.getNumVerses( prevBBB, prevIntC ) if BibleOrgSysGlobals.debugFlag: print( " Went back to previous book", prevBBB, prevIntC, prevIntV, "from", BBB, C, V ) if not failed and prevIntV is not None: #print( "getBeforeAndAfterBibleData XXX", repr(prevBBB), repr(prevIntC), repr(prevIntV) ) assert( prevBBB and isinstance(prevBBB, str) ) previousVerseKey = SimpleVerseKey( prevBBB, prevIntC, prevIntV ) previousVerseData = self.getCachedVerseData( previousVerseKey ) if previousVerseData: previousVersesData.insert( 0, (previousVerseKey,previousVerseData,) ) # Put verses in backwards # Determine the next valid verse numbers nextBBB, nextIntC, nextIntV = BBB, intC, intV nextVersesData = [] for n in range( 0, self.parentWindow.viewVersesAfter ): try: numVerses = self.getNumVerses( nextBBB, nextIntC ) except KeyError: numVerses = None # for an invalid BBB nextIntV += 1 if numVerses is None or nextIntV > numVerses: nextIntV = 1 nextIntC += 1 # Need to check................................ nextVerseKey = SimpleVerseKey( nextBBB, nextIntC, nextIntV ) nextVerseData = self.getCachedVerseData( nextVerseKey ) if nextVerseData: nextVersesData.append( (nextVerseKey,nextVerseData,) ) verseData = self.getCachedVerseData( newVerseKey ) return verseData, previousVersesData, nextVersesData # end of BibleReferenceBox.getBeforeAndAfterBibleData def XXXsetCurrentVerseKey( self, newVerseKey ): """ Called to set the current verse key. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.setCurrentVerseKey( {} )").format( newVerseKey ) ) self.parentApp.setDebugText( "BRW setCurrentVerseKey..." ) assert( isinstance( newVerseKey, SimpleVerseKey ) ) self.currentVerseKey = newVerseKey BBB = self.currentVerseKey.getBBB() self.maxChapters = self.getNumChapters( BBB ) self.maxVerses = self.getNumVerses( BBB, self.currentVerseKey.getChapterNumber() ) # end of BibleReferenceBox.setCurrentVerseKey def updateShownReferences( self, newReferenceObject ): """ Updates self in various ways depending on the contextViewMode held by the enclosing window. The new verse references are in the reference versification system in one of these objects: SimpleVerseKey (accepts 'GEN_1:1' or 'GEN','1','1') SimpleVersesKey (accepts 'MAT_6:1,4') VerseRangeKey (accepts 'JNA_2:1-7') Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceBox.updateShownReferences( {} ) for {}".format( newReferenceObject, self.internalBible.name ) ) assert( isinstance( newReferenceObject, SimpleVerseKey ) or isinstance( newReferenceObject, SimpleVersesKey ) or isinstance( newReferenceObject, VerseRangeKey )) for j, referenceVerse in enumerate( newReferenceObject ): #print( " refVerse", j, referenceVerse ) assert( isinstance( referenceVerse, SimpleVerseKey ) ) refBBB, refC, refV, refS = referenceVerse.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) #print( " newVK", newVerseKey ) # Set firstFlag as False (rather than j==0) so don't get context displayed self.displayAppendVerse( False, newVerseKey, self.getCachedVerseData( newVerseKey ), lastFlag=False ) #self.setCurrentVerseKey( newVerseKey ) #self.clearText() # Leaves the text box enabled #startingFlag = True ## Safety-check in case they edited the settings file #if 'DBP' in self.boxType and self.contextViewMode in ('ByBook','ByChapter',): #print( exp("updateShownReferences: Safety-check converted {} contextViewMode for DBP").format( repr(self.contextViewMode) ) ) #self._viewRadioVar.set( 3 ) # ByVerse #self.changeBibleContextView() #if self.contextViewMode == 'BeforeAndAfter': #bibleData = self.getBeforeAndAfterBibleData( newVerseKey ) #if bibleData: #verseData, previousVerses, nextVerses = bibleData #for verseKey,previousVerseData in previousVerses: #self.displayAppendVerse( startingFlag, verseKey, previousVerseData ) #startingFlag = False #self.displayAppendVerse( startingFlag, newVerseKey, verseData, currentVerse=True ) #for verseKey,nextVerseData in nextVerses: #self.displayAppendVerse( False, verseKey, nextVerseData ) #elif self.contextViewMode == 'ByVerse': #self.displayAppendVerse( True, newVerseKey, self.getCachedVerseData( newVerseKey ), currentVerse=True ) #elif self.contextViewMode == 'BySection': #self.displayAppendVerse( True, newVerseKey, self.getCachedVerseData( newVerseKey ), currentVerse=True ) #BBB, C, V = newVerseKey.getBCV() #intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() #print( "\nBySection is not finished yet -- just shows a single verse!\n" ) # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ##for thisC in range( 0, self.getNumChapters( BBB ) ): ##try: numVerses = self.getNumVerses( BBB, thisC ) ##except KeyError: numVerses = 0 ##for thisV in range( 0, numVerses ): ##thisVerseKey = SimpleVerseKey( BBB, thisC, thisV ) ##thisVerseData = self.getCachedVerseData( thisVerseKey ) ##self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, ##currentVerse=thisC==intC and thisV==intV ) ##startingFlag = False #elif self.contextViewMode == 'ByBook': #BBB, C, V = newVerseKey.getBCV() #intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() #for thisC in range( 0, self.getNumChapters( BBB ) ): #try: numVerses = self.getNumVerses( BBB, thisC ) #except KeyError: numVerses = 0 #for thisV in range( 0, numVerses ): #thisVerseKey = SimpleVerseKey( BBB, thisC, thisV ) #thisVerseData = self.getCachedVerseData( thisVerseKey ) #self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, #currentVerse=thisC==intC and thisV==intV ) #startingFlag = False #elif self.contextViewMode == 'ByChapter': #BBB, C, V = newVerseKey.getBCV() #intV = newVerseKey.getVerseNumberInt() #try: numVerses = self.getNumVerses( BBB, C ) #except KeyError: numVerses = 0 #for thisV in range( 0, numVerses ): #thisVerseKey = SimpleVerseKey( BBB, C, thisV ) #thisVerseData = self.getCachedVerseData( thisVerseKey ) #self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, currentVerse=thisV==intV ) #startingFlag = False #else: #logging.critical( exp("BibleReferenceBox.updateShownBCV: Bad context view mode {}").format( self.contextViewMode ) ) #if BibleOrgSysGlobals.debugFlag: halt # Unknown context view mode self.textBox['state'] = tk.DISABLED # Don't allow editing # end of BibleReferenceBox.updateShownReferences def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeReferenceBox() # end of BibleReferenceBox.doClose def closeReferenceBox( self ): """ Called to finally and irreversibly remove this box from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.closeReferenceBox()") ) if self in self.parentWindow.referenceBoxes: self.parentWindow.referenceBoxes.remove( self ) self.destroy() else: # we might not have finished making our box yet if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.closeReferenceBox() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource box" )
class BibleReferenceCollectionWindow( BibleResourceWindow ): #class BibleReferenceCollectionWindow( ChildWindow ): def __init__( self, parentApp, internalBible ): """ Given a collection name, try to open an empty Bible resource collection window. """ if BibleOrgSysGlobals.debugFlag: print( "BibleReferenceCollectionWindow.__init__( {}, {} )".format( parentApp, internalBible.name ) ) self.parentApp, self.internalBible = parentApp, internalBible BibleResourceWindow.__init__( self, self.parentApp, 'BibleReferenceCollectionWindow', internalBible.name ) #ChildWindow.__init__( self, self.parentApp, 'BibleResource' ) #self.winType = 'InternalBibleReferenceBox' self.geometry( INITIAL_REFERENCE_COLLECTION_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_REFERENCE_COLLECTION_SIZE, MAXIMUM_REFERENCE_COLLECTION_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) # Get rid of the default widgets self.vScrollbar.destroy() self.textBox.destroy() # Make a frame inside a canvas inside our window (in order to get a scrollbar) self.canvas = tk.Canvas( self, borderwidth=0, background="#ffffff" ) self.frame = Frame( self.canvas ) #, background="#ffffff" ) self.vsb = Scrollbar( self, orient="vertical", command=self.canvas.yview ) self.canvas.configure( yscrollcommand=self.vsb.set ) self.vsb.pack( side="right", fill="y" ) self.canvas.pack( side=tk.LEFT, fill=tk.BOTH, expand=True ) self.canvas.create_window( (4,4), window=self.frame, anchor="nw", tags="self.frame" ) self.frame.bind( "<Configure>", self.OnFrameConfigure ) #self.BCVUpdateType = 'ReferencesMode' # Leave as default self.folderPath = self.filename = self.filepath = None self.referenceBoxes = BibleReferenceBoxes( self ) # end of BibleReferenceCollectionWindow.__init__ def OnFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure( scrollregion=self.canvas.bbox("all") ) def setFolderPath( self, newFolderPath ): """ Store the folder path for where our internal Bible files will be. We're still waiting for the filename. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.setFolderPath( {} )").format( repr(newFolderPath) ) ) assert( self.filename is None ) assert( self.filepath is None ) self.folderPath = newFolderPath # end of BibleReferenceCollectionWindow.setFolderPath def createMenuBar( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createMenuBar()") ) self.menubar = tk.Menu( self ) #self['menu'] = self.menubar self.config( menu=self.menubar ) # alternative fileMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=fileMenu, label='File', underline=0 ) #fileMenu.add_command( label='Info...', underline=0, command=self.doShowInfo, accelerator=self.parentApp.keyBindingDict['Info'][0] ) #fileMenu.add_separator() #fileMenu.add_command( label='Rename', underline=0, command=self.doRename ) #fileMenu.add_separator() fileMenu.add_command( label='Close', underline=0, command=self.doClose, accelerator=self.parentApp.keyBindingDict['Close'][0] ) # close this window if 0: editMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=editMenu, label='Edit', underline=0 ) editMenu.add_command( label='Copy', underline=0, command=self.doCopy, accelerator=self.parentApp.keyBindingDict['Copy'][0] ) editMenu.add_separator() editMenu.add_command( label='Select all', underline=0, command=self.doSelectAll, accelerator=self.parentApp.keyBindingDict['SelectAll'][0] ) searchMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=searchMenu, label='Search', underline=0 ) searchMenu.add_command( label='Goto line...', underline=0, command=self.doGotoLine, accelerator=self.parentApp.keyBindingDict['Line'][0] ) searchMenu.add_separator() searchMenu.add_command( label='Find...', underline=0, command=self.doFind, accelerator=self.parentApp.keyBindingDict['Find'][0] ) searchMenu.add_command( label='Find again', underline=5, command=self.doRefind, accelerator=self.parentApp.keyBindingDict['Refind'][0] ) gotoMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=gotoMenu, label='Goto', underline=0 ) #gotoMenu.add_command( label='Previous book', underline=-1, command=self.doGotoPreviousBook ) #gotoMenu.add_command( label='Next book', underline=-1, command=self.doGotoNextBook ) #gotoMenu.add_command( label='Previous chapter', underline=-1, command=self.doGotoPreviousChapter ) #gotoMenu.add_command( label='Next chapter', underline=-1, command=self.doGotoNextChapter ) #gotoMenu.add_command( label='Previous section', underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label='Next section', underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label='Previous verse', underline=-1, command=self.doGotoPreviousVerse ) #gotoMenu.add_command( label='Next verse', underline=-1, command=self.doGotoNextVerse ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Forward', underline=0, command=self.doGoForward ) #gotoMenu.add_command( label='Backward', underline=0, command=self.doGoBackward ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Previous list item', underline=0, state=tk.DISABLED, command=self.doGotoPreviousListItem ) #gotoMenu.add_command( label='Next list item', underline=0, state=tk.DISABLED, command=self.doGotoNextListItem ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Book', underline=0, command=self.doGotoBook ) #gotoMenu.add_separator() self._groupRadioVar.set( self.groupCode ) gotoMenu.add_radiobutton( label='Group A', underline=6, value='A', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group B', underline=6, value='B', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group C', underline=6, value='C', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group D', underline=6, value='D', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) self.viewMenu = tk.Menu( self.menubar, tearoff=False ) # Save this reference so we can disable entries later self.menubar.add_cascade( menu=self.viewMenu, label='View', underline=0 ) if self.contextViewMode == 'BeforeAndAfter': self._viewRadioVar.set( 1 ) #elif self.contextViewMode == 'BySection': self._viewRadioVar.set( 2 ) elif self.contextViewMode == 'ByVerse': self._viewRadioVar.set( 3 ) #elif self.contextViewMode == 'ByBook': self._viewRadioVar.set( 4 ) #elif self.contextViewMode == 'ByChapter': self._viewRadioVar.set( 5 ) else: print( self.contextViewMode ); halt self.viewMenu.add_radiobutton( label='Before and after...', underline=7, value=1, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='One section', underline=4, value=2, variable=self._viewRadioVar, command=self.changeBibleContextView ) self.viewMenu.add_radiobutton( label='Single verse', underline=7, value=3, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='Whole book', underline=6, value=4, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='Whole chapter', underline=6, value=5, variable=self._viewRadioVar, command=self.changeBibleContextView ) #if 'DBP' in self.winType: # disable excessive online use #self.viewMenu.entryconfigure( 'Whole book', state=tk.DISABLED ) #self.viewMenu.entryconfigure( 'Whole chapter', state=tk.DISABLED ) #resourcesMenu = tk.Menu( self.menubar, tearoff=False ) #self.menubar.add_cascade( menu=resourcesMenu, label=_('Resources'), underline=0 ) #resourcesMenu.add_command( label='Online (DBP)...', underline=0, command=self.doOpenDBPBibleResource ) #resourcesMenu.add_command( label='Sword module...', underline=0, command=self.doOpenSwordResource ) #resourcesMenu.add_command( label='Other (local)...', underline=1, command=self.doOpenInternalBibleResource ) toolsMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=toolsMenu, label='Tools', underline=0 ) toolsMenu.add_command( label='Options...', underline=0, command=self.notWrittenYet ) windowMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=windowMenu, label='Window', underline=0 ) windowMenu.add_command( label='Bring in', underline=0, command=self.notWrittenYet ) helpMenu = tk.Menu( self.menubar, name='help', tearoff=False ) self.menubar.add_cascade( menu=helpMenu, underline=0, label='Help' ) helpMenu.add_command( label='Help...', underline=0, command=self.doHelp, accelerator=self.parentApp.keyBindingDict['Help'][0] ) helpMenu.add_separator() helpMenu.add_command( label='About...', underline=0, command=self.doAbout, accelerator=self.parentApp.keyBindingDict['About'][0] ) # end of BibleReferenceCollectionWindow.createMenuBar def refreshTitle( self ): self.title( "[{}] {} Bible Reference Collection".format( self.groupCode, self.internalBible.name ) ) #self.currentVerseKey.getBBB(), self.currentVerseKey.getChapterNumber(), self.currentVerseKey.getVerseNumber() ) ) # end if BibleReferenceCollectionWindow.refreshTitle #def openDBPBibleReferenceBox( self, moduleAbbreviation, windowGeometry=None ): #""" #Create the actual requested DBP Bible resource window. #Returns the new DBPBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openDBPBibleReferenceBox()") ) #self.parentApp.setDebugText( "openDBPBibleReferenceBox..." ) #assert( moduleAbbreviation and isinstance( moduleAbbreviation, str ) and len(moduleAbbreviation)==6 ) ##tk.Label( self, text=moduleAbbreviation ).pack( side=tk.TOP, fill=tk.X ) #dBRB = DBPBibleReferenceBox( self, moduleAbbreviation ) #if windowGeometry: halt; dBRB.geometry( windowGeometry ) #if dBRB.DBPModule is None: #logging.critical( exp("Application.openDBPBibleReferenceBox: Unable to open resource {}").format( repr(moduleAbbreviation) ) ) #dBRB.destroy() #showerror( self, APP_NAME, _("Sorry, unable to open DBP resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #dBRB.updateShownBCV( self.parentApp.getVerseKey( dBRB.groupCode ) ) #self.referenceBoxes.append( dBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return dBRB ## end of BibleReferenceCollectionWindow.openDBPBibleReferenceBox #def openInternalBibleReferenceBox( self, modulePath, windowGeometry=None ): #""" #Create the actual requested local/internal Bible resource window. #Returns the new InternalBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openInternalBibleReferenceBox()") ) #self.parentApp.setDebugText( "openInternalBibleReferenceBox..." ) ##tk.Label( self, text=modulePath ).pack( side=tk.TOP, fill=tk.X ) #iBRB = InternalBibleReferenceBox( self, modulePath ) #if windowGeometry: halt; iBRB.geometry( windowGeometry ) #if iBRB.internalBible is None: #logging.critical( exp("Application.openInternalBibleReferenceBox: Unable to open resource {}").format( repr(modulePath) ) ) #iBRB.destroy() #showerror( self, APP_NAME, _("Sorry, unable to open internal Bible resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #iBRB.updateShownBCV( self.parentApp.getVerseKey( iBRB.groupCode ) ) #self.referenceBoxes.append( iBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return iBRB ## end of BibleReferenceCollectionWindow.openInternalBibleReferenceBox #def openBox( self, boxType, boxSource ): #""" #(Re)open a text box. #""" #if boxType == 'DBP': self.openDBPBibleReferenceBox( boxSource ) #elif boxType == 'Sword': self.openSwordBibleReferenceBox( boxSource ) #elif boxType == 'Internal': self.openInternalBibleReferenceBox( boxSource ) #elif BibleOrgSysGlobals.debugFlag: halt ## end of BibleReferenceCollectionWindow.openBox def updateShownBCV( self, newReferenceVerseKey ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownBCV( {} ) for".format( newReferenceVerseKey ), self.moduleID ) assert( isinstance( newReferenceVerseKey, SimpleVerseKey ) ) refBBB, refC, refV, refS = newReferenceVerseKey.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) self.updateShownReferences( mapReferencesVerseKey( newVerseKey ) ) # end of BibleReferenceCollectionWindow.updateShownBCV def updateShownReferences( self, newReferencesVerseKeys ): """ Updates self.textBox in various ways depending on the contextViewMode held by the enclosing window. The new verse key is in the reference versification system. Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownReferences( {}) for".format( newReferencesVerseKeys ), self.moduleID ) #print( "contextViewMode", self.contextViewMode ) assert( isinstance( newReferencesVerseKeys, list ) or newReferencesVerseKeys is None ) # Remove any previous resource boxes for referenceBox in self.referenceBoxes: referenceBox.destroy() self.referenceBoxes = BibleReferenceBoxes( self ) if newReferencesVerseKeys is not None: # open new resource boxes assert( isinstance( newReferencesVerseKeys, list ) ) for newReferencesVerseKey in newReferencesVerseKeys: assert( isinstance( newReferencesVerseKey, FlexibleVersesKey ) ) for verseKeyObject in newReferencesVerseKey: #print( " BRCWupdateShownReferences: {}".format( verseKeyObject ) ) referenceBox = BibleReferenceBox( self.frame, self.parentApp, self.internalBible, verseKeyObject ) self.referenceBoxes.append( referenceBox ) self.currentVerseKeys = newReferencesVerseKeys # The FlexibleVersesKey object self.refreshTitle() # end of BibleReferenceCollectionWindow.updateShownReferences def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of BibleReferenceCollectionWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo )
def run(*tests): root = tk.Tk() root.title('IDLE htest') root.resizable(0, 0) # a scrollable Label like constant width text widget. frameLabel = tk.Frame(root, padx=10) frameLabel.pack() text = tk.Text(frameLabel, wrap='word') text.configure(bg=root.cget('bg'), relief='flat', height=4, width=70) scrollbar = Scrollbar(frameLabel, command=text.yview) text.config(yscrollcommand=scrollbar.set) scrollbar.pack(side='right', fill='y', expand=False) text.pack(side='left', fill='both', expand=True) test_list = [] # List of tuples of the form (spec, callable widget) if tests: for test in tests: test_spec = globals()[test.__name__ + '_spec'] test_spec['name'] = test.__name__ test_list.append((test_spec, test)) else: for k, d in globals().items(): if k.endswith('_spec'): test_name = k[:-5] test_spec = d test_spec['name'] = test_name mod = import_module('idlelib.' + test_spec['file']) test = getattr(mod, test_name) test_list.append((test_spec, test)) test_name = tk.StringVar(root) callable_object = None test_kwds = None def next(): nonlocal test_name, callable_object, test_kwds if len(test_list) == 1: next_button.pack_forget() test_spec, callable_object = test_list.pop() test_kwds = test_spec['kwds'] test_kwds['parent'] = root test_name.set('Test ' + test_spec['name']) text.configure(state='normal') # enable text editing text.delete('1.0','end') text.insert("1.0",test_spec['msg']) text.configure(state='disabled') # preserve read-only property def run_test(): widget = callable_object(**test_kwds) try: print(widget.result) except AttributeError: pass button = tk.Button(root, textvariable=test_name, command=run_test) button.pack() next_button = tk.Button(root, text="Next", command=next) next_button.pack() next() root.mainloop()
class CimTiborcimText(Text): def __init__(self, parent, file=None): Text.__init__(self, parent, wrap=NONE, undo=True, maxundo=-1, borderwidth='0p') self.vbar = Scrollbar(parent, name='vbar_tiborcim') self.xbar = Scrollbar(parent, name='xbar_tiborcim', orient="horizontal") self.bind('<Button-3>',CimEditMenu, add='') self.vbar['command'] = self.yview self.vbar.pack(side="right", fill=Y) self['yscrollcommand'] = self.vbar.set self.xbar['command'] = self.xview self.xbar.pack(side="bottom", fill=X) self['xscrollcommand'] = self.xbar.set self.pack(expand=1, fill="both") self.tag_configure("keyword", foreground="#ff0000") self.tag_configure("string", foreground="#28a030") self.tag_configure("block", foreground="#0000ff") self.tag_configure("builtin", foreground="#9228a0") self.tag_configure("comment", foreground="#74787f") def text_changed(evt): if file is not None: file.saved = False line, col = self.index('insert').split('.') txt = self.get('%s.0' % line, '%s.end' % line) blocks = [ "WHILE", "WEND", # WHILE loop "SUB", "END SUB", # SUBs "IF", "ELSEIF", "ELSE", "END IF", "THEN",# IF control "FOR", "TO", "NEXT", # FOR loop "PYTHON", "END PYTHON" # PYTHON block ] builtins = [ "INT", "RND", "SHAKEN", "NOT", "AND", "OR" # Not implemented ] builtinvars = [ "STR\$", "INKEY\$", "RECEIVE\$" ] keywords = [ "SCREEN", "PSET", # Leds "RADIO\W(ON|OFF)", "BROADCAST", # Radio communications "PRINT", "SHOW", "IMAGE", "SLEEP" ] strings = [ "\"(.*?)\"", "'(.*?)'" ] self.tag_remove('builtin', '1.0', 'end') self.tag_remove('keyword', '1.0', 'end') self.tag_remove('string', '1.0', 'end') self.tag_remove('block', '1.0', 'end') for builtin in builtins: self.highlight_pattern("\y" + builtin + "\y(?=([^\"]*\"[^\"]*\")*[^\"]*$)", "builtin", '1.0', 'end', True) for builtinvar in builtinvars: self.highlight_pattern("\y" + builtinvar + "(?=([^\"]*\"[^\"]*\")*[^\"]*$)", "builtin", '1.0', 'end', True) for keyword in keywords: self.highlight_pattern("\y" + keyword + "\y(?=([^\"]*\"[^\"]*\")*[^\"]*$)", "keyword", '1.0', 'end', True) for string in strings: self.highlight_pattern(string + "(?=([^\"]*\"[^\"]*\")*[^\"]*$)", "string", '1.0', 'end', True) for block in blocks: self.highlight_pattern("\y" + block + "\y(?=([^\"]*\"[^\"]*\")*[^\"]*$)", "block", '1.0', 'end', True) self.highlight_pattern("^\'(.*?)$", "comment", '1.0', 'end', True) self.edit_modified(False) self.bind('<<Modified>>', text_changed) def highlight_pattern(self, pattern, tag, start="1.0", end="end", regexp=False): start = self.index(start) end = self.index(end) self.mark_set("matchStart", start) self.mark_set("matchEnd", start) self.mark_set("searchLimit", end) count = IntVar() while True: index = self.search(pattern, "matchEnd","searchLimit", count=count, regexp=regexp) if index == "": break if count.get() == 0: break self.mark_set("matchStart", index) self.mark_set("matchEnd", "%s+%sc" % (index, count.get())) self.tag_add(tag, "matchStart", "matchEnd")
class BibleReferenceCollectionWindow( ChildWindow, BibleResourceWindowAddon ): """ """ def __init__( self, parentApp, internalBible, defaultContextViewMode=BIBLE_CONTEXT_VIEW_MODES[0], defaultFormatViewMode=BIBLE_FORMAT_VIEW_MODES[0] ): """ Given a collection name, try to open an empty Bible resource collection window. """ if BibleOrgSysGlobals.debugFlag: print( "BibleReferenceCollectionWindow.__init__( {}, {} )".format( parentApp, internalBible.getAName() ) ) self.internalBible = internalBible ChildWindow.__init__( self, parentApp, genericWindowType='BibleResource' ) BibleResourceWindowAddon.__init__( self, 'BibleReferenceCollectionWindow', internalBible.getAName(), defaultContextViewMode, defaultFormatViewMode ) self.geometry( INITIAL_REFERENCE_COLLECTION_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_REFERENCE_COLLECTION_SIZE, MAXIMUM_REFERENCE_COLLECTION_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) # Get rid of the default widgets self.vScrollbar.destroy() self.textBox.destroy() # Make a frame inside a canvas inside our window (in order to get a scrollbar) self.canvas = tk.Canvas( self, borderwidth=0, background='pink' ) #background="#ffffff" ) self.vsb = Scrollbar( self, orient='vertical', command=self.canvas.yview ) self.canvas.configure( yscrollcommand=self.vsb.set ) self.vsb.pack( side=tk.RIGHT, fill=tk.Y ) self.canvas.pack( side=tk.LEFT, expand=tk.YES, fill=tk.BOTH ) self.canvasFrame = Frame( self.canvas ) #, background="#ffffff" ) #self.canvasFrame.columnconfigure( 0, weight=1 ) #self.canvasFrame.rowconfigure( 0, weight=1 ) self.window = self.canvas.create_window( (0,0), window=self.canvasFrame, anchor='nw', tags='self.canvasFrame' ) #self.columnconfigure( 0, weight=1 ) #self.rowconfigure( 0, weight=1 ) #self.canvasFrame.bind( '<Configure>', self.OnFrameConfigure ) self.canvas.bind('<Configure>', self.onCanvasConfigure ) #self.BCVUpdateType = 'ReferencesMode' # Leave as default self.folderPath = self.filename = self.filepath = None self.referenceBoxes = BibleReferenceBoxes( self ) if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.__init__ finished.") ) # end of BibleReferenceCollectionWindow.__init__ def onCanvasConfigure( self, event ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.onCanvasConfigure( {} )").format( event ) ) canvas_width = event.width #print( " Set canvas width to {}".format( canvas_width ) ) self.canvas.itemconfigure( self.window, width=event.width) self.canvas.configure( scrollregion=self.canvas.bbox( 'all' ) ) #self.canvas.itemconfigure( self.canvasFrame, width=canvas_width ) # end of BibleReferenceCollectionWindow.onCanvasConfigure #def OnFrameConfigure( self, event ): #""" #Reset the scroll region to encompass the inner frame. #""" #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("BibleReferenceCollectionWindow.OnFrameConfigure( {} )").format( event ) ) #self.canvas.configure( scrollregion=self.canvas.bbox( 'all' ) ) ## end of BibleReferenceCollectionWindow.OnFrameConfigure def setFolderPath( self, newFolderPath ): """ Store the folder path for where our internal Bible files will be. We're still waiting for the filename. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.setFolderPath( {!r} )").format( newFolderPath ) ) assert self.filename is None assert self.filepath is None self.folderPath = newFolderPath # end of BibleReferenceCollectionWindow.setFolderPath def createMenuBar( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.createMenuBar()") ) self.menubar = tk.Menu( self ) #self['menu'] = self.menubar self.configure( menu=self.menubar ) # alternative fileMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=fileMenu, label=_('File'), underline=0 ) #fileMenu.add_command( label=_('Info…'), underline=0, command=self.doShowInfo, accelerator=self.parentApp.keyBindingDict[_('Info')][0] ) #fileMenu.add_separator() #fileMenu.add_command( label=_('Rename'), underline=0, command=self.doRename ) #fileMenu.add_separator() fileMenu.add_command( label=_('Close'), underline=0, command=self.doClose, accelerator=self.parentApp.keyBindingDict[_('Close')][0] ) # close this window if 0: editMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=editMenu, label=_('Edit'), underline=0 ) editMenu.add_command( label=_('Copy'), underline=0, command=self.doCopy, accelerator=self.parentApp.keyBindingDict[_('Copy')][0] ) editMenu.add_separator() editMenu.add_command( label=_('Select all'), underline=0, command=self.doSelectAll, accelerator=self.parentApp.keyBindingDict[_('SelectAll')][0] ) searchMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=searchMenu, label=_('Search'), underline=0 ) searchMenu.add_command( label=_('Goto line…'), underline=0, command=self.doGotoWindowLine, accelerator=self.parentApp.keyBindingDict[_('Line')][0] ) searchMenu.add_separator() searchMenu.add_command( label=_('Find…'), underline=0, command=self.doBoxFind, accelerator=self.parentApp.keyBindingDict[_('Find')][0] ) searchMenu.add_command( label=_('Find again'), underline=5, command=self.doBoxRefind, accelerator=self.parentApp.keyBindingDict[_('Refind')][0] ) gotoMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=gotoMenu, label=_('Goto'), underline=0 ) #gotoMenu.add_command( label=_('Previous book'), underline=-1, command=self.doGotoPreviousBook ) #gotoMenu.add_command( label=_('Next book'), underline=-1, command=self.doGotoNextBook ) #gotoMenu.add_command( label=_('Previous chapter'), underline=-1, command=self.doGotoPreviousChapter ) #gotoMenu.add_command( label=_('Next chapter'), underline=-1, command=self.doGotoNextChapter ) #gotoMenu.add_command( label=_('Previous section'), underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label=_('Next section'), underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label=_('Previous verse'), underline=-1, command=self.doGotoPreviousVerse ) #gotoMenu.add_command( label=_('Next verse'), underline=-1, command=self.doGotoNextVerse ) #gotoMenu.add_separator() #gotoMenu.add_command( label=_('Forward'), underline=0, command=self.doGoForward ) #gotoMenu.add_command( label=_('Backward'), underline=0, command=self.doGoBackward ) #gotoMenu.add_separator() #gotoMenu.add_command( label=_('Previous list item'), underline=0, state=tk.DISABLED, command=self.doGotoPreviousListItem ) #gotoMenu.add_command( label=_('Next list item'), underline=0, state=tk.DISABLED, command=self.doGotoNextListItem ) #gotoMenu.add_separator() #gotoMenu.add_command( label=_('Book'), underline=0, command=self.doGotoBook ) #gotoMenu.add_separator() self._groupRadioVar.set( self._groupCode ) gotoMenu.add_radiobutton( label=_('Group A'), underline=6, value='A', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label=_('Group B'), underline=6, value='B', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label=_('Group C'), underline=6, value='C', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label=_('Group D'), underline=6, value='D', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) self.viewMenu = tk.Menu( self.menubar, tearoff=False ) # Save this reference so we can disable entries later self.menubar.add_cascade( menu=self.viewMenu, label=_('View'), underline=0 ) self.viewMenu.add_radiobutton( label=_('Before and after…'), underline=7, value=1, variable=self._contextViewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label=_('One section'), underline=4, value=2, variable=self._contextViewRadioVar, command=self.changeBibleContextView ) self.viewMenu.add_radiobutton( label=_('Single verse'), underline=7, value=3, variable=self._contextViewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label=_('Whole book'), underline=6, value=4, variable=self._contextViewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label=_('Whole chapter'), underline=6, value=5, variable=self._contextViewRadioVar, command=self.changeBibleContextView ) self.viewMenu.add_separator() self.viewMenu.add_radiobutton( label=_('Formatted'), underline=0, value=1, variable=self._formatViewRadioVar, command=self.changeBibleFormatView ) self.viewMenu.add_radiobutton( label=_('Unformatted'), underline=0, value=2, variable=self._formatViewRadioVar, command=self.changeBibleFormatView ) #if 'DBP' in self.windowType: # disable excessive online use #self.viewMenu.entryconfigure( 'Whole book', state=tk.DISABLED ) #self.viewMenu.entryconfigure( 'Whole chapter', state=tk.DISABLED ) #resourcesMenu = tk.Menu( self.menubar, tearoff=False ) #self.menubar.add_cascade( menu=resourcesMenu, label=_('Resources'), underline=0 ) #resourcesMenu.add_command( label=_('Online (DBP)…'), underline=0, command=self.doOpenDBPBibleResource ) #resourcesMenu.add_command( label=_('Sword module…'), underline=0, command=self.doOpenSwordResource ) #resourcesMenu.add_command( label=_('Other (local)…'), underline=1, command=self.doOpenInternalBibleResource ) toolsMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=toolsMenu, label=_('Tools'), underline=0 ) toolsMenu.add_command( label=_('Options…'), underline=0, command=self.notWrittenYet ) windowMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=windowMenu, label=_('Window'), underline=0 ) windowMenu.add_command( label=_('Bring in'), underline=0, command=self.notWrittenYet ) windowMenu.add_separator() windowMenu.add_command( label=_('Show main window'), underline=0, command=self.doShowMainWindow, accelerator=self.parentApp.keyBindingDict[_('ShowMain')][0] ) helpMenu = tk.Menu( self.menubar, name='help', tearoff=False ) self.menubar.add_cascade( menu=helpMenu, underline=0, label=_('Help') ) helpMenu.add_command( label=_('Help…'), underline=0, command=self.doHelp, accelerator=self.parentApp.keyBindingDict[_('Help')][0] ) helpMenu.add_separator() helpMenu.add_command( label=_('About…'), underline=0, command=self.doAbout, accelerator=self.parentApp.keyBindingDict[_('About')][0] ) # end of BibleReferenceCollectionWindow.createMenuBar def refreshTitle( self ): self.title( "[{}] {} Bible Reference Collection".format( self._groupCode, self.internalBible.getAName() ) ) #self.currentVerseKey.getBBB(), self.currentVerseKey.getChapterNumber(), self.currentVerseKey.getVerseNumber() ) ) # end if BibleReferenceCollectionWindow.refreshTitle #def openDBPBibleReferenceBox( self, moduleAbbreviation, windowGeometry=None ): #""" #Create the actual requested DBP Bible resource window. #Returns the new DBPBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openDBPBibleReferenceBox()") ) #self.parentApp.setDebugText( "openDBPBibleReferenceBox…" ) #assert moduleAbbreviation and isinstance( moduleAbbreviation, str ) and len(moduleAbbreviation)==6 ##tk.Label( self, text=moduleAbbreviation ).pack( side=tk.TOP, fill=tk.X ) #dBRB = DBPBibleReferenceBox( self, moduleAbbreviation ) #if windowGeometry: halt; dBRB.geometry( windowGeometry ) #if dBRB.DBPModule is None: #logging.critical( exp("Application.openDBPBibleReferenceBox: Unable to open resource {}").format( repr(moduleAbbreviation) ) ) #dBRB.destroy() #showError( self, APP_NAME, _("Sorry, unable to open DBP resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #dBRB.updateShownBCV( self.parentApp.getVerseKey( dBRB._groupCode ) ) #self.referenceBoxes.append( dBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return dBRB ## end of BibleReferenceCollectionWindow.openDBPBibleReferenceBox #def openInternalBibleReferenceBox( self, modulePath, windowGeometry=None ): #""" #Create the actual requested local/internal Bible resource window. #Returns the new InternalBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openInternalBibleReferenceBox()") ) #self.parentApp.setDebugText( "openInternalBibleReferenceBox…" ) ##tk.Label( self, text=modulePath ).pack( side=tk.TOP, fill=tk.X ) #iBRB = InternalBibleReferenceBox( self, modulePath ) #if windowGeometry: halt; iBRB.geometry( windowGeometry ) #if iBRB.internalBible is None: #logging.critical( exp("Application.openInternalBibleReferenceBox: Unable to open resource {}").format( repr(modulePath) ) ) #iBRB.destroy() #showError( self, APP_NAME, _("Sorry, unable to open internal Bible resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #iBRB.updateShownBCV( self.parentApp.getVerseKey( iBRB._groupCode ) ) #self.referenceBoxes.append( iBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return iBRB ## end of BibleReferenceCollectionWindow.openInternalBibleReferenceBox #def openBox( self, boxType, boxSource ): #""" #(Re)open a text box. #""" #if boxType == 'DBP': self.openDBPBibleReferenceBox( boxSource ) #elif boxType == 'Sword': self.openSwordBibleReferenceBox( boxSource ) #elif boxType == 'Internal': self.openInternalBibleReferenceBox( boxSource ) #elif BibleOrgSysGlobals.debugFlag: halt ## end of BibleReferenceCollectionWindow.openBox def updateShownBCV( self, newReferenceVerseKey, originator=None ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownBCV( {}, {} ) for".format( newReferenceVerseKey, originator ), self.moduleID ) assert isinstance( newReferenceVerseKey, SimpleVerseKey ) refBBB, refC, refV, refS = newReferenceVerseKey.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) self.updateShownReferences( mapReferencesVerseKey( newVerseKey ) ) # end of BibleReferenceCollectionWindow.updateShownBCV def updateShownReferences( self, newReferencesVerseKeys ): """ Updates self.textBox in various ways depending on the contextViewMode held by the enclosing window. The new verse key is in the reference versification system. Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownReferences( {} ) for".format( newReferencesVerseKeys ), self.moduleID ) #print( "contextViewMode", self._contextViewMode ) assert isinstance( newReferencesVerseKeys, list ) or newReferencesVerseKeys is None # Remove any previous resource boxes for referenceBox in self.referenceBoxes: referenceBox.destroy() self.referenceBoxes = BibleReferenceBoxes( self ) if newReferencesVerseKeys is not None: # open new resource boxes assert isinstance( newReferencesVerseKeys, list ) for newReferencesVerseKey in newReferencesVerseKeys: #print( "BibleReferenceCollectionWindow.updateShownReferences.newReferencesVerseKey", newReferencesVerseKey ) if newReferencesVerseKey is None: print( "BibleReferenceCollectionWindow.updateShownReferences.newReferencesVerseKey: Why do we have NONE here?" ) #, newReferencesVerseKeys ) else: assert isinstance( newReferencesVerseKey, FlexibleVersesKey ) for verseKeyObject in newReferencesVerseKey: #print( " BRCWupdateShownReferences: {}".format( verseKeyObject ) ) referenceBox = BibleReferenceBox( self, self.canvasFrame, self.parentApp, self.internalBible, verseKeyObject ) self.referenceBoxes.append( referenceBox ) self.currentVerseKeys = newReferencesVerseKeys # The FlexibleVersesKey object self.refreshTitle() # end of BibleReferenceCollectionWindow.updateShownReferences def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += '\n' + _("Help for {}").format( self.windowType ) helpInfo += '\n ' + _("Keyboard shortcuts:") for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) return tkBREAK # so we don't do the main window help also # end of BibleReferenceCollectionWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion + '\n' aboutInfo += '\n' + _("Information about {}").format( self.windowType ) + '\n' aboutInfo += '\n' + _("A Bible Reference Collection box can contain multiple different Scripture references all shown from the same resource translation or commentary.") ab = AboutBox( self, self.genericWindowType, aboutInfo ) return tkBREAK # so we don't do the main window about also
class ChildWindow( tk.Toplevel, ChildBox ): """ """ def __init__( self, parentApp, genericWindowType ): """ The genericWindowType is set here, but the more specific winType is set later by the subclass. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.__init__( {} {} )").format( parentApp, repr(genericWindowType) ) ) assert( parentApp ) assert( genericWindowType in ('BibleResource','LexiconResource','TextEditor','BibleEditor',) ) self.parentApp, self.genericWindowType = parentApp, genericWindowType tk.Toplevel.__init__( self, self.parentApp ) ChildBox.__init__( self, self.parentApp ) self.protocol( "WM_DELETE_WINDOW", self.closeChildWindow ) self.geometry( INITIAL_RESOURCE_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_RESOURCE_SIZE, MAXIMUM_RESOURCE_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) self.createMenuBar() self.createToolBar() self.createContextMenu() self.viewMode = DEFAULT self.settings = None # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) #if 'textBox' in dir(self): # we have one already -- presumably a specialised one #halt # We have one already #else: # let's make one self.textBox = tk.Text( self, yscrollcommand=self.vScrollbar.set, state=tk.DISABLED ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.BOTH ) self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Options for find, etc. self.optionsDict = {} self.optionsDict['caseinsens'] = True self.refreshTitle() # Must be in superclass # end of ChildWindow.__init__ def notWrittenYet( self ): errorBeep() showerror( self, _("Not implemented"), _("Not yet available, sorry") ) # end of ChildWindow.notWrittenYet def createMenuBar( self ): logging.critical( exp("PROGRAMMING ERROR: This 'createMenuBar' method MUST be overridden!") ) if BibleOrgSysGlobals.debugFlag: print( exp("This 'createMenuBar' method MUST be overridden!") ) halt def createContextMenu( self ): """ Can be overriden if necessary. """ self.contextMenu = tk.Menu( self, tearoff=0 ) self.contextMenu.add_command( label="Copy", underline=0, command=self.doCopy, accelerator=self.parentApp.keyBindingDict['Copy'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Select all", underline=7, command=self.doSelectAll, accelerator=self.parentApp.keyBindingDict['SelectAll'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Find...", underline=0, command=self.doFind, accelerator=self.parentApp.keyBindingDict['Find'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Close", underline=1, command=self.doClose, accelerator=self.parentApp.keyBindingDict['Close'][0] ) self.bind( "<Button-3>", self.showContextMenu ) # right-click #self.pack() # end of ChildWindow.createContextMenu def showContextMenu( self, event ): self.contextMenu.post( event.x_root, event.y_root ) # end of ChildWindow.showContextMenu def createToolBar( self ): """ Designed to be overridden. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("This 'createToolBar' method can be overridden!") ) pass # end of ChildWindow.createToolBar def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of ChildWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo ) # end of ChildWindow.doAbout def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeChildWindow() # end of ChildWindow.doClose def closeChildWindow( self ): """ Called to finally and irreversibly remove this window from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.closeChildWindow()") ) if self in self.parentApp.childWindows: self.parentApp.childWindows.remove( self ) self.destroy() else: # we might not have finished making our window yet if BibleOrgSysGlobals.debugFlag: print( exp("ChildWindow.closeChildWindow() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource window" )
class HTMLWindow( tk.Toplevel, ChildBox ): """ """ def __init__( self, parentWindow, filename=None ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.__init__( {}, {} )").format( parentWindow, repr(filename) ) ) assert( parentWindow ) self.parentWindow, self.initialFilename = parentWindow, filename tk.Toplevel.__init__( self, self.parentWindow ) ChildBox.__init__( self, self.parentWindow ) self.protocol( "WM_DELETE_WINDOW", self.closeHTMLWindow ) self.title( 'HTMLWindow' ) self.genericWindowType = 'HTMLWindow' self.winType = 'HTMLWindow' self.moduleID = 'HTML' self.geometry( INITIAL_HTML_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_HTML_SIZE, MAXIMUM_HTML_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) self._showStatusBarVar = tk.BooleanVar() self._showStatusBarVar.set( True ) self._statusTextVar = tk.StringVar() self._statusTextVar.set( '' ) # first initial value self.createMenuBar() self.createToolBar() self.createContextMenu() if self._showStatusBarVar.get(): self.createStatusBar() self.viewMode = DEFAULT self.settings = None # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) #if 'textBox' in dir(self): # we have one already -- presumably a specialised one #halt # We have one already #else: # let's make one self.textBox = HTMLText( self, yscrollcommand=self.vScrollbar.set, state=tk.DISABLED ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.BOTH ) self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Options for find, etc. self.optionsDict = {} self.optionsDict['caseinsens'] = True if filename: self.historyList = [ filename ] self.historyIndex = 1 # Number from the end (starting with 1) self.load( filename ) else: self.historyList = [] self.historyIndex = 0 # = None # end of HTMLWindow.__init__ def notWrittenYet( self ): errorBeep() showerror( self, _("Not implemented"), _("Not yet available, sorry") ) # end of HTMLWindow.notWrittenYet def createMenuBar( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.createMenuBar()") ) try: kBD = self.parentWindow.parentApp.keyBindingDict except AttributeError: kBD = self.parentApp.keyBindingDict self.menubar = tk.Menu( self ) #self['menu'] = self.menubar self.config( menu=self.menubar ) # alternative fileMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=fileMenu, label='File', underline=0 ) #fileMenu.add_command( label='New...', underline=0, command=self.notWrittenYet ) #fileMenu.add_command( label='Open...', underline=0, command=self.notWrittenYet ) #fileMenu.add_separator() #subfileMenuImport = tk.Menu( fileMenu ) #subfileMenuImport.add_command( label='USX', underline=0, command=self.notWrittenYet ) #fileMenu.add_cascade( label='Import', underline=0, menu=subfileMenuImport ) #subfileMenuExport = tk.Menu( fileMenu ) #subfileMenuExport.add_command( label='USX', underline=0, command=self.notWrittenYet ) #subfileMenuExport.add_command( label='HTML', underline=0, command=self.notWrittenYet ) #fileMenu.add_cascade( label='Export', underline=0, menu=subfileMenuExport ) #fileMenu.add_separator() fileMenu.add_command( label='Info...', underline=0, command=self.doShowInfo, accelerator=kBD['Info'][0] ) fileMenu.add_separator() fileMenu.add_command( label='Close', underline=0, command=self.doClose, accelerator=kBD['Close'][0] ) # close this window editMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=editMenu, label='Edit', underline=0 ) editMenu.add_command( label='Copy', underline=0, command=self.doCopy, accelerator=kBD['Copy'][0] ) editMenu.add_separator() editMenu.add_command( label='Select all', underline=0, command=self.doSelectAll, accelerator=kBD['SelectAll'][0] ) searchMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=searchMenu, label='Search', underline=0 ) searchMenu.add_command( label='Goto line...', underline=0, command=self.doGotoLine, accelerator=kBD['Line'][0] ) searchMenu.add_separator() searchMenu.add_command( label='Find...', underline=0, command=self.doFind, accelerator=kBD['Find'][0] ) searchMenu.add_command( label='Find again', underline=5, command=self.doRefind, accelerator=kBD['Refind'][0] ) viewMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=viewMenu, label='View', underline=0 ) viewMenu.add_checkbutton( label='Status bar', underline=0, variable=self._showStatusBarVar, command=self.doToggleStatusBar ) gotoMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=gotoMenu, label='Goto', underline=0 ) gotoMenu.add_command( label='Back', underline=0, command=self.doGoBackward ) gotoMenu.add_command( label='Forward', underline=0, command=self.doGoForward ) toolsMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=toolsMenu, label='Tools', underline=0 ) toolsMenu.add_command( label='Options...', underline=0, command=self.notWrittenYet ) windowMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=windowMenu, label='Window', underline=0 ) windowMenu.add_command( label='Bring in', underline=0, command=self.notWrittenYet ) helpMenu = tk.Menu( self.menubar, name='help', tearoff=False ) self.menubar.add_cascade( menu=helpMenu, underline=0, label='Help' ) helpMenu.add_command( label='Help...', underline=0, command=self.doHelp, accelerator=kBD['Help'][0] ) helpMenu.add_separator() helpMenu.add_command( label='About...', underline=0, command=self.doAbout, accelerator=kBD['About'][0] ) # end of HTMLWindow.createMenuBar def createContextMenu( self ): """ Can be overriden if necessary. """ try: kBD = self.parentWindow.parentApp.keyBindingDict except AttributeError: kBD = self.parentApp.keyBindingDict self.contextMenu = tk.Menu( self, tearoff=0 ) self.contextMenu.add_command( label="Copy", underline=0, command=self.doCopy, accelerator=kBD['Copy'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Select all", underline=7, command=self.doSelectAll, accelerator=kBD['SelectAll'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Find...", underline=0, command=self.doFind, accelerator=kBD['Find'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Close", underline=1, command=self.doClose, accelerator=kBD['Close'][0] ) self.bind( "<Button-3>", self.showContextMenu ) # right-click #self.pack() # end of HTMLWindow.createContextMenu def showContextMenu( self, event ): self.contextMenu.post( event.x_root, event.y_root ) # end of HTMLWindow.showContextMenu def createToolBar( self ): """ Designed to be overridden. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("This 'createToolBar' method can be overridden!") ) pass # end of HTMLWindow.createToolBar def createStatusBar( self ): """ Create a status bar containing only one text label at the bottom of the main window. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("createStatusBar()") ) Style().configure('HTMLStatusBar.TFrame', background='yellow') Style().configure( 'StatusBar.TLabel', background='white' ) #Style().map("Halt.TButton", foreground=[('pressed', 'red'), ('active', 'yellow')], #background=[('pressed', '!disabled', 'black'), ('active', 'pink')] ) self.statusBar = Frame( self, cursor='hand2', relief=tk.RAISED, style='HTMLStatusBar.TFrame' ) self.statusTextLabel = Label( self.statusBar, relief=tk.SUNKEN, textvariable=self._statusTextVar, style='StatusBar.TLabel' ) #, font=('arial',16,tk.NORMAL) ) self.statusTextLabel.pack( side=tk.LEFT, fill=tk.X ) # style='Halt.TButton', self.forwardButton = Button( self.statusBar, text='Forward', command=self.doGoForward ) self.forwardButton.pack( side=tk.RIGHT, padx=2, pady=2 ) self.backButton = Button( self.statusBar, text='Back', command=self.doGoBackward ) self.backButton.pack( side=tk.RIGHT, padx=2, pady=2 ) self.statusBar.pack( side=tk.BOTTOM, fill=tk.X ) #self.setReadyStatus() self.setStatus() # Clear it # end of HTMLWindow.createStatusBar def setStatus( self, newStatusText='' ): """ Set (or clear) the status bar text. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("setStatus( {} )").format( repr(newStatusText) ) ) #print( "SB is", repr( self._statusTextVar.get() ) ) if newStatusText != self._statusTextVar.get(): # it's changed #self.statusBarTextWidget['state'] = tk.NORMAL #self.statusBarTextWidget.delete( '1.0', tk.END ) #if newStatusText: #self.statusBarTextWidget.insert( '1.0', newStatusText ) #self.statusBarTextWidget['state'] = tk.DISABLED # Don't allow editing #self.statusText = newStatusText self._statusTextVar.set( newStatusText ) if self._showStatusBarVar.get(): self.statusTextLabel.update() # end of HTMLWindow.setStatus #def setWaitStatus( self, newStatusText ): #""" #Set the status bar text and change the cursor to the wait/hourglass cursor. #""" #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("setWaitStatus( {} )").format( repr(newStatusText) ) ) ##self.rootWindow.config( cursor='watch' ) # 'wait' can only be used on Windows #self.setStatus( newStatusText ) #self.update() ## end of HTMLWindow.setWaitStatus def setReadyStatus( self ): """ Sets the status line to "Ready" and sets the cursor to the normal cursor. """ self.setStatus( _("Ready") ) #self.config( cursor='' ) # end of HTMLWindow.setReadyStatus def doToggleStatusBar( self ): """ Display or hide the status bar. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("doToggleStatusBar()") ) if self._showStatusBarVar.get(): self.createStatusBar() else: self.statusBar.destroy() # end of HTMLWindow.doToggleStatusBar def load( self, filepath ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.load( {} )").format( filepath ) ) self.folderPath, self.filename = os.path.split( filepath ) with open( filepath, 'rt' ) as HTMLFile: fileContents = HTMLFile.read() match = re.search( '<title>(.+?)</title>', fileContents ) if match: #print( '0', repr(match.group(0)) ) # This includes the entire match, i.e., with the <title> tags, etc. #print( '1', repr(match.group(1)) ) # This is just the title title = match.group(1).replace( '\n', ' ' ).replace( '\r', ' ' ).replace( ' ', ' ' ) #print( "title", repr(title) ) self.title( title ) else: self.title( 'HTMLWindow' ) self.setAllText( fileContents ) # end of HTMLWindow.load def gotoLink( self, link ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.gotoLink( {} )").format( link ) ) if not os.path.isabs( link ): # relative filepath link = os.path.join( self.folderPath, link ) self.load( link ) self.historyList.append( link ) self.historyIndex = 1 # end of HTMLWindow.gotoLink def overLink( self, link ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.overLink( {} )").format( link ) ) self.setStatus( link ) # Display it # end of HTMLWindow.overLink def leaveLink( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.leaveLink()") ) self.setStatus() # Clear it # end of HTMLWindow.leaveLink def doGoForward( self ): """ """ if self.historyIndex > 1: self.historyIndex -= 1 self.load( self.historyList[ -self.historyIndex ] ) # end of BibleResourceWindow.doGoForward def doGoBackward( self ): """ """ if self.historyIndex < len( self.historyList ): self.historyIndex += 1 self.load( self.historyList[ -self.historyIndex ] ) # end of BibleResourceWindow.doGoBackward def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of HTMLWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo ) # end of HTMLWindow.doAbout def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeHTMLWindow() # end of HTMLWindow.doClose def closeHTMLWindow( self ): """ Called to finally and irreversibly remove this window from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.closeHTMLWindow()") ) try: cWs = self.parentWindow.parentApp.childWindows except AttributeError: cWs = self.parentApp.childWindows if self in cWs: cWs.remove( self ) self.destroy() else: # we might not have finished making our window yet if BibleOrgSysGlobals.debugFlag: print( exp("HTMLWindow.closeHTMLWindow() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentWindow.parentApp.setDebugText( "Closed HTML window" )
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 initUI(self): self.parent.title("Digital Cookbook") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1, side=BOTTOM) # Establish menu bar # menubar = Menu(self.parent) self.parent.config(menu=menubar) # Add file menu # filemenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="File", menu=filemenu) filemenu.add_command(label="Import recipe from XML file", command=self.xmlImport) filemenu.add_command(label="Add blank recipe to database", command=self.recipeAdd) filemenu.add_command(label="Delete recipe from database", command=self.recipeDelete) filemenu.add_command(label="Load recipe", command=self.recipeLoad) filemenu.add_command(label="Save recipe to database", command=self.recipeSave, accelerator="Ctrl+S") filemenu.add_separator() filemenu.add_command(label="Exit", command=self.onExit, accelerator="Ctrl+W") # Add help menu # helpmenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="Help", menu=helpmenu) helpmenu.add_command(label="About...", command=self.helpAbout) # Establish toolbar # frameToolbar = Frame(self.parent) # , relief=RAISED, borderwidth=1) frameToolbar.pack(side=TOP, fill=X) # Add buttons to toolbar # buffer = 2 buttonspaceing = 100 buttonwidth = 12 buttonheight = 30 bImportXML = Button(frameToolbar, text="Import XML", command=self.xmlImport, width=buttonwidth) bImportXML.pack(side=LEFT, padx=buffer, pady=buffer) bAddRecipe = Button(frameToolbar, text="Add Recipe", command=self.recipeAdd, width=buttonwidth) bAddRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bDeleteRecipe = Button(frameToolbar, text="Delete Recipe", command=self.recipeDelete, width=buttonwidth) bDeleteRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bEditRecipe = Button(frameToolbar, text="Load Recipe", command=self.recipeLoad, width=buttonwidth) bEditRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bSaveRecipe = Button(frameToolbar, text="Save Recipe", command=self.recipeSave, width=buttonwidth) bSaveRecipe.pack(side=LEFT, padx=buffer, pady=buffer) # Recipe list section frameRecipeList = Frame(self, borderwidth=1, width=200) frameRecipeList.pack_propagate(0) frameRecipeList.pack(side=LEFT, fill=Y) Label(frameRecipeList, text="Recipe List").pack() # Category option menu default = StringVar(frameRecipeList) default.set("----") recipeCatagories = OptionMenu(frameRecipeList, default, "----", "None", "Cat 1", "Cat 2", "Cat 3") recipeCatagories.pack(side=TOP, fill=X) # Filter Frame frameFilter = Frame(frameRecipeList, relief=RAISED, borderwidth=1, width=200) frameFilter.pack(side=TOP, fill=X) Label(frameFilter, text="Filter...").pack() # Filter text filterText = Entry(frameFilter) filterText.pack_propagate(0) filterText.pack(side=LEFT, fill=X) # Filter Button filterButton = Button(frameFilter, text="Go", command=self.placeholder) filterButton.pack_propagate(0) filterButton.pack(side=RIGHT) # Recipe Box Frame frameRecipeBox = Frame(frameRecipeList, relief=RAISED, borderwidth=1) frameRecipeBox.pack(side=TOP, fill=BOTH, expand=1) # ==== Recipe List box ==== recipeListScroll = Scrollbar(frameRecipeBox, orient=VERTICAL) self.recipeList = Listbox(frameRecipeBox, selectmode=EXTENDED, yscrollcommand=recipeListScroll.set) self.recipeList.pack(side=LEFT, fill=BOTH, expand=1) recipeListScroll.config(command=self.recipeList.yview) recipeListScroll.pack(side=RIGHT, fill=Y) self.getReciepList() self.populateRecipeList(self.recipes) # Spacer frameSpacer1 = Frame(self, borderwidth=1, width=10) frameSpacer1.pack_propagate(0) frameSpacer1.pack(side=LEFT, fill=Y) # Recipe info section frameRecipeInfo = Frame(self, borderwidth=1, width=200) frameRecipeInfo.pack_propagate(0) frameRecipeInfo.pack(side=LEFT, fill=Y) # Recipe name Label(frameRecipeInfo, text="Recipe Name:", anchor=E, justify=LEFT).pack() self.recipeName = Entry(frameRecipeInfo) self.recipeName.pack(side=TOP, fill=X) # Prep Time framePrepTime = Frame(frameRecipeInfo) framePrepTime.pack(side=TOP, fill=X) Label(framePrepTime, text="Prep Time:", anchor=E, justify=LEFT).pack() self.prepTime = Entry(framePrepTime) self.prepTime.pack(side=LEFT, fill=X) default = StringVar(framePrepTime) default.set("----") self.prepTimeUnit = OptionMenu(framePrepTime, default, "----", "Min", "Hr") self.prepTimeUnit.pack(side=RIGHT, fill=X) # Cook Time frameCookTime = Frame(frameRecipeInfo) frameCookTime.pack(side=TOP, fill=X) Label(frameCookTime, text="Cook Time:", anchor=E, justify=LEFT).pack() self.cookTime = Entry(frameCookTime) self.cookTime.pack(side=LEFT, fill=X) default = StringVar(frameCookTime) default.set("----") self.cookTimeUnit = OptionMenu(frameCookTime, default, "----", "Min", "Hr") self.cookTimeUnit.pack(side=RIGHT, fill=X) # Spacer frameSpacer2 = Frame(self, borderwidth=1, width=10) frameSpacer2.pack_propagate(0) frameSpacer2.pack(side=LEFT, fill=Y) # Ingredient List frameIngredients = Frame(self, borderwidth=1, width=300) frameIngredients.pack_propagate(0) frameIngredients.pack(side=LEFT, fill=Y) Label(frameIngredients, text="Ingredients").pack() # Ingredient Name self.ingredientName = Entry(frameIngredients) self.ingredientName.pack(side=TOP, fill=X) # Ingredient info frameIngredientQuantity = Frame(frameIngredients) frameIngredientQuantity.pack(side=TOP, fill=X) Label(frameIngredientQuantity, text="Ingredient Quantity (value, unit):", anchor=E, justify=LEFT).pack() self.ingredientQuantity = Entry(frameIngredientQuantity) self.ingredientQuantity.pack(side=LEFT, fill=X, expand=1) self.ingredientUnit = Entry(frameIngredientQuantity, width=20) self.ingredientUnit.pack_propagate(0) self.ingredientUnit.pack(side=RIGHT, fill=X) # Spacer frameSpacer3 = Frame(frameIngredients, height=10) frameSpacer3.pack_propagate(0) frameSpacer3.pack(side=TOP, fill=X) # Ingredient List buttons frameIngredientButtons = Frame(frameIngredients) frameIngredientButtons.pack(side=TOP, fill=X) ingredientAdd = Button(frameIngredientButtons, text="+", command=self.ingredientAdd, width=3) ingredientAdd.pack(side=LEFT) ingredientDel = Button(frameIngredientButtons, text="-", command=self.ingredientDelete, width=3) ingredientDel.pack(side=LEFT) ingredientUp = Button(frameIngredientButtons, text=u"\u25B2", command=self.ingredientMoveUp, width=3) ingredientUp.pack(side=LEFT) ingredientDwn = Button(frameIngredientButtons, text=u"\u25BC", command=self.ingredientMoveDown, width=3) ingredientDwn.pack(side=LEFT) ingredientLoad = Button(frameIngredientButtons, text="Load", command=self.ingredientLoadInfo) ingredientLoad.pack(side=LEFT) ingredientSave = Button(frameIngredientButtons, text="Save", command=self.ingredientSaveInfo) ingredientSave.pack(side=LEFT) # Ingredient List Box Frame frameIngredientList = Frame(frameIngredients, relief=RAISED, borderwidth=1) frameIngredientList.pack(side=TOP, fill=BOTH, expand=1) # Ingredient List box ingredientListScroll = Scrollbar(frameIngredientList, orient=VERTICAL) self.ingredientList = Listbox( frameIngredientList, selectmode=SINGLE, yscrollcommand=ingredientListScroll.set ) # Set selectmode=SINGLE???? self.ingredientList.pack(side=LEFT, fill=BOTH, expand=1) ingredientListScroll.config(command=self.ingredientList.yview) ingredientListScroll.pack(side=RIGHT, fill=Y) # Spacer frameSpacer4 = Frame(self, borderwidth=1, width=10) frameSpacer4.pack_propagate(0) frameSpacer4.pack(side=LEFT, fill=Y) # Recipe Procedure frameProcedure = Frame(self, borderwidth=1) frameProcedure.pack(side=LEFT, fill=BOTH, expand=1) Label(frameProcedure, text="Procedure", anchor=E, justify=LEFT).pack(side=TOP) procedureScroll = Scrollbar(frameProcedure, orient=VERTICAL) self.procedure = Text(frameProcedure, maxundo=30, undo=1, wrap=WORD, yscrollcommand=procedureScroll.set) self.procedure.pack(side=LEFT, fill=BOTH, expand=1) procedureScroll.config(command=self.procedure.yview) procedureScroll.pack(side=LEFT, fill=Y)
class BibleReferenceBox( Frame, BibleBoxAddon ): """ """ def __init__( self, parentWindow, parentFrame, parentApp, internalBible, referenceObject ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.__init__( {}, {}. {}, {}, {} )").format( parentWindow, parentFrame, parentApp, internalBible.getAName(), referenceObject ) ) self.parentWindow, self.parentFrame, self.parentApp, self.referenceObject = parentWindow, parentFrame, parentApp, referenceObject self.internalBible = handleInternalBibles( self.parentApp, internalBible, self ) Frame.__init__( self, parentFrame ) BibleBoxAddon.__init__( self, parentWindow, 'BibleReferenceBox' ) # Set some dummy values required soon #self._contextViewRadioVar, self._formatViewRadioVar, self._groupRadioVar = tk.IntVar(), tk.IntVar(), tk.StringVar() #self._groupCode = BIBLE_GROUP_CODES[0] # Put into first/default BCV group #self._contextViewMode = DEFAULT #self._formatViewMode = DEFAULT self.currentVerseKey = SimpleVerseKey( 'UNK','1','1' ) # Unknown book #if self._contextViewMode == DEFAULT: #self._contextViewMode = 'ByVerse' #self.parentWindow.viewVersesBefore, self.parentWindow.viewVersesAfter = 2, 6 #if self._formatViewMode == DEFAULT: #self._formatViewMode = 'Formatted' # Create a title bar titleBar = Frame( self ) Button( titleBar, text=_('Close'), command=self.doClose ).pack( side=tk.RIGHT ) ## Try to get the title width somewhere near correct (if moduleID is a long path) #adjModuleID = moduleID #self.update() # so we can get the geometry #width = parseWindowSize( self.parentWindow.winfo_geometry() )[0] - 60 # Allow for above button #if len(adjModuleID)*10 > width: # Note: this doesn't adjust if the window size is changed #print( "BRB here1", len(adjModuleID), width, repr(adjModuleID) ) #x = len(adjModuleID)*100/width # not perfect (too small) for narrow windows #adjModuleID = '…' + adjModuleID[int(x):] #print( "BRB here2", len(adjModuleID), x, repr(adjModuleID) ) #titleText = '{} ({})'.format( adjModuleID, boxType.replace( 'BibleReferenceBox', '' ) ) titleText = self.referenceObject.getShortText() self.titleLabel = tk.Label( titleBar, text=titleText ) self.titleLabel.pack( side=tk.TOP, fill=tk.X ) titleBar.pack( side=tk.TOP, fill=tk.X ) # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) self.textBox = BText( self, height=5, yscrollcommand=self.vScrollbar.set ) self.textBox.configure( wrap='word' ) self.textBox.pack( expand=tk.YES, fill=tk.X ) # Full width self.vScrollbar.configure( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardBoxKeyboardBindings() self.textBox.bind( '<Button-1>', self.setFocus ) # So disabled text box can still do select and copy functions # Set-up our standard Bible styles for USFMKey, styleDict in self.parentApp.stylesheet.getTKStyles().items(): self.textBox.tag_configure( USFMKey, **styleDict ) # Create the style # Add our extra specialised styles self.textBox.tag_configure( 'contextHeader', background='pink', font='helvetica 6 bold' ) self.textBox.tag_configure( 'context', background='pink', font='helvetica 6' ) self.textBox.tag_configure( 'markersHeader', background='yellow3', font='helvetica 6 bold' ) self.textBox.tag_configure( 'markers', background='yellow3', font='helvetica 6' ) self.pack( expand=tk.YES, fill=tk.BOTH ) # Pack the frame # Set-up our Bible system and our callables self.BibleOrganisationalSystem = BibleOrganizationalSystem( 'GENERIC-KJV-80-ENG' ) # temp self.getNumChapters = self.BibleOrganisationalSystem.getNumChapters self.getNumVerses = lambda BBB,C: MAX_PSEUDOVERSES if C=='-1' or C==-1 \ else self.BibleOrganisationalSystem.getNumVerses( BBB, C ) self.isValidBCVRef = self.BibleOrganisationalSystem.isValidBCVRef self.getFirstBookCode = self.BibleOrganisationalSystem.getFirstBookCode self.getPreviousBookCode = self.BibleOrganisationalSystem.getPreviousBookCode self.getNextBookCode = self.BibleOrganisationalSystem.getNextBookCode self.getBBBFromText = self.BibleOrganisationalSystem.getBBBFromText self.getBookName = self.BibleOrganisationalSystem.getBookName self.getBookList = self.BibleOrganisationalSystem.getBookList self.maxChaptersThisBook, self.maxVersesThisChapter = 150, 150 # temp self.verseCache = OrderedDict() self.updateShownReferences( self.referenceObject ) # end of BibleReferenceBox.__init__ def createStandardBoxKeyboardBindings( self ): """ Create keyboard bindings for this widget. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createStandardBoxKeyboardBindings()") ) for name,command in ( ('SelectAll',self.doSelectAll), ('Copy',self.doCopy), ('Find',self.doBoxFind), ('Refind',self.doBoxRefind), #('Info',self.doShowInfo), #('ShowMain',self.doShowMainWindow), ('Close',self.doClose), ): self._createStandardBoxKeyboardBinding( name, command ) # end of BibleReferenceBox.createStandardBoxKeyboardBindings() def xxxgotoBCV( self, BBB, C, V ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.gotoBCV( {} {}:{} from {} )").format( BBB, C, V, self.currentVerseKey ) ) # We really need to convert versification systems here adjBBB, adjC, adjV, adjS = self.BibleOrganisationalSystem.convertToReferenceVersification( BBB, C, V ) self.parentWindow.gotoGroupBCV( self._groupCode, adjBBB, adjC, adjV ) # then the App will update me by calling updateShownBCV # end of BibleReferenceBox.gotoBCV def getContextVerseData( self, verseKey ): """ Fetches and returns the internal Bible data for the given reference. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.getContextVerseData( {} )").format( verseKey ) ) if self.internalBible is not None: try: return self.internalBible.getContextVerseData( verseKey ) except KeyError: # Could be after a verse-bridge ??? if verseKey.getChapterNumber() != '0': logging.error( exp("BibleReferenceBox.getContextVerseData for {} {} got a KeyError") \ .format( self.boxType, verseKey ) ) # end of BibleReferenceBox.getContextVerseData #def XXXgetSwordVerseKey( self, verseKey ): ##if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getSwordVerseKey( {} )").format( verseKey ) ) #BBB, C, V = verseKey.getBCV() #return self.parentApp.SwordInterface.makeKey( BBB, C, V ) ## end of BibleReferenceBox.getSwordVerseKey def getCachedVerseData( self, verseKey ): """ Checks to see if the requested verse is in our cache, otherwise calls getContextVerseData (from the superclass) to fetch it. The cache keeps the newest or most recently used entries at the end. When it gets too large, it drops the first entry. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getCachedVerseData( {} )").format( verseKey ) ) verseKeyHash = verseKey.makeHash() if verseKeyHash in self.verseCache: #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( " " + exp("Retrieved from BibleReferenceBox cache") ) self.verseCache.move_to_end( verseKeyHash ) #print( " returning", self.verseCache[verseKeyHash][0] ) return self.verseCache[verseKeyHash] verseContextData = self.getContextVerseData( verseKey ) self.verseCache[verseKeyHash] = verseContextData if len(self.verseCache) > MAX_CACHED_VERSES: #print( "Removing oldest cached entry", len(self.verseCache) ) self.verseCache.popitem( last=False ) return verseContextData # end of BibleReferenceBox.getCachedVerseData def updateShownReferences( self, newReferenceObject ): """ Updates self in various ways depending on the contextViewMode held by the enclosing window. The new verse references are in the reference versification system in one of these objects: SimpleVerseKey (accepts 'GEN_1:1' or 'GEN','1','1') SimpleVersesKey (accepts 'MAT_6:1,4') VerseRangeKey (accepts 'JNA_2:1-7') Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceBox.updateShownReferences( {} ) for {}".format( newReferenceObject, self.internalBible.getAName() ) ) assert isinstance( newReferenceObject, SimpleVerseKey ) or isinstance( newReferenceObject, SimpleVersesKey ) or isinstance( newReferenceObject, VerseRangeKey ) for j, referenceVerse in enumerate( newReferenceObject ): #print( " refVerse", j, referenceVerse ) assert isinstance( referenceVerse, SimpleVerseKey ) refBBB, refC, refV, refS = referenceVerse.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) #print( " newVK", newVerseKey ) # Set firstFlag as False (rather than j==0) so don't get context displayed self.displayAppendVerse( False, newVerseKey, self.getCachedVerseData( newVerseKey ), lastFlag=False ) self.textBox.configure( state=tk.DISABLED ) # Don't allow editing # end of BibleReferenceBox.updateShownReferences def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeReferenceBox() # end of BibleReferenceBox.doClose def closeReferenceBox( self ): """ Called to finally and irreversibly remove this box from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.closeReferenceBox()") ) if self in self.parentWindow.referenceBoxes: self.parentWindow.referenceBoxes.remove( self ) self.destroy() else: # we might not have finished making our box yet if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.closeReferenceBox() for {} wasn't in list").format( self.windowType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource box" )
def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE")