def make_new_sample(self): # validate colors back = self.r_col['background 1'].get() high = self.r_col['background 2'].get() table = self.r_col['background 3'].get() fonts = self.r_col['font color'].get() try_these = [ (back, self.r_col['background 1']), (high, self.r_col['background 2']), (table, self.r_col['background 3']), (fonts, self.r_col['font color'])] for tup in try_these: if len(tup[0]) == 0: return test_color = Frame(self.root) # don't grid this for tup in try_these: try: test_color.config(bg=tup[0]) except tk.TclError: tup[1].delete(0, tk.END) messagebox.showerror( 'Color Not Recognized.', 'A color was entered that is unknown to the system.') return self.get_new_scheme() for child in self.colors_content.winfo_children(): child.destroy() self.make_samples()
def save_new_subtopic(self): if self.selected_subtopic.cget('text') != self.new_subtopic_label_text: return self.subtopic_dialog = Toplevel(self.root) self.subtopic_dialog.title('New Note: Subtopic Input Dialog') headlab = LabelH3(self.subtopic_dialog, text='Unique subtopic name for new note:') self.subtopic_input = Entry(self.subtopic_dialog, width=64) self.subtopic_input.focus_set() buttonbox = Frame(self.subtopic_dialog) self.subtopic_dialog.grid_columnconfigure(0, weight=1) new_note_ok = Button(buttonbox, text='Submit Note and Subtitle', command=self.submit_new_note) new_note_cancel = Button(buttonbox, text='Cancel', command=self.close_subtopic_dialog) headlab.grid(column=0, row=0, pady=(24, 0), columnspan=2) self.subtopic_input.grid(column=0, row=1, padx=24, pady=24, columnspan=2) buttonbox.grid(column=1, row=2, sticky='we', padx=24, pady=24) new_note_ok.grid(column=0, row=0, sticky='e', padx=12) new_note_cancel.grid(column=1, row=0, sticky='e', padx=12) self.subtopic_dialog.bind('<Escape>', self.close_subtopic_dialog) self.subtopic_dialog.protocol('WM_DELETE_WINDOW', self.close_subtopic_dialog)
def __init__(self, master, resizer=True, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.master = master # root or toplevel self.sizer = Sizer(self.master) self.grid_columnconfigure(0, weight=1) # With custom window border, you can't use the otherwise # desirable option bd=2, relief='sunken' for a border on statusbar # because edge grabber for resizing is below statusbar # so border looks wrong there. Instead put a Separator # above the statusbar frame. # relief = Frame(self, bd=2, relief='sunken') relief = Frame(self, bd=0) relief.grid(column=0, row=0, sticky='news') relief.grid_columnconfigure(0, weight=1) self.status_label = LabelStatusbar(relief, cursor='arrow', anchor='w') self.tooltip_label = LabelStatusbar(relief, bd=2, relief='sunken', anchor='e') if resizer is True: self.sizer.place(relx=1.0, x=-3, rely=1.0, anchor='se') self.sizer.bind('<Button-1>', self.sizer.get_pos) self.status_label.grid(column=0, row=0, sticky='w')
def build_page3(self): box = Box(orientation=VERTICAL, spacing=6) box.set_border_width(10) _row1 = Frame() _log_view_textbuffer = m._page3_log_view.get_buffer() self._handlers.clear_log_view_buffer(None) _end = _log_view_textbuffer.get_end_iter() _log_view_textbuffer.create_mark('end', _end, False) _scrolled = g.ScrolledWindow() _scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _scrolled.add(m._page3_log_view) _row1.add(_scrolled) _row2 = Box() m._page3_read_target_btn.connect('clicked', self._handlers.read_target_file) m._page3_clear_btn.connect('clicked', self._handlers.clear_log_view_buffer) m._page3_read_log_btn.connect('clicked', self._handlers.read_log_file) _row2.pack_start(m._page3_read_target_btn, True, False, 0) _row2.pack_start(m._page3_clear_btn, True, False, 0) _row2.pack_start(m._page3_read_log_btn, True, False, 0) box.pack_start(_row1, True, True, 5) box.pack_end(_row2, False, True, 0) return box
def go_to_graphics(self, graphics): # if frame with this name already exists it's replaced # https://stackoverflow.com/questions/59518905/naming-a-widget-to-auto-destroy-replace-it picwin = Frame(graphics, name='exists') picwin.pack() curr_pic = self.picfile_lab.get(1.0, 'end') curr_pic = curr_pic.strip('\n') img_path = curr_pic edit_pic = Image.open(img_path) edit_img = ImageTk.PhotoImage(edit_pic) editlab = LabelStay( picwin, image=edit_img) editlab.image = edit_img self.nbook.select(graphics) # scroll to top so controls are seen when tab opens self.canvas.yview_moveto(0.0) if self.parent.winfo_class() == 'Toplevel': self.parent.lower(belowThis=self.nbook) editlab.pack() # When this grids a big pic, the whole notebook gets big # prevent large pics from blowing up size of the whole notebook # when placed here by edit button on a gallery # Will need more attention when ready to make the graphics tab. editlab.config(width=700, height=700)
def make_widgets(self): self.entry = Entry(self, textvariable=self.var) self.arrow = LabelHilited(self, text='\u25BC', width=2) # self.arrow = ComboboxArrow(self, text='\u25BC', width=2) self.entry.grid(column=0, row=0) self.arrow.grid(column=1, row=0) self.update_idletasks() self.width = self.winfo_reqwidth() self.drop = ToplevelHilited(self, bd=0) self.drop.bind('<Destroy>', self.clear_reference_to_dropdown) self.drop.withdraw() Combobox.hive.append(self.drop) for widg in (self.master, self.drop): widg.bind('<Escape>', self.hide_all_drops, add='+') self.drop.grid_columnconfigure(0, weight=1) self.drop.grid_rowconfigure(0, weight=1) self.canvas = CanvasHilited(self.drop) self.canvas.grid(column=0, row=0, sticky='news') self.scrollv_combo = Scrollbar(self.drop, hideable=True, command=self.canvas.yview) self.canvas.config(yscrollcommand=self.scrollv_combo.set) self.content = Frame(self.canvas) self.content.grid_columnconfigure(0, weight=1) self.content.grid_rowconfigure('all', weight=1) self.scrollv_combo.grid(column=1, row=0, sticky='ns') self.entry.bind('<KeyPress>', self.open_or_close_dropdown) self.entry.bind('<Tab>', self.open_or_close_dropdown) for widg in (self.entry, self.arrow): widg.bind('<Button-1>', self.open_or_close_dropdown, add='+') self.arrow.bind('<Button-1>', self.focus_entry_on_arrow_click, add='+') for frm in (self, self.content): frm.bind('<FocusIn>', self.arrow.highlight) frm.bind('<FocusOut>', self.arrow.unhighlight) self.drop.bind('<FocusIn>', self.focus_dropdown) self.drop.bind('<Unmap>', self.unhighlight_all_drop_items) self.current_combo_parts = [ self, self.entry, self.arrow, self.scrollv_combo ] for part in self.current_combo_parts: part.bind('<Enter>', self.unbind_combo_parts) part.bind('<Leave>', self.rebind_combo_parts) self.config_values(self.values) config_generic(self.drop)
def make_widgets(self): self.make_scrollbars() self.make_menus() scridth = 20 scridth_n = Frame(self, height=scridth) scridth_w = Frame(self, width=scridth) header = Frame(self) heading = LabelH3(header, text='header text') self.main_tabs = Frame(self) persons_tab = Frame(self.main_tabs) footer = Frame(self) boilerplate = Label(footer, text='footer') current_person_area = Frame(persons_tab) current_person = LabelH3(current_person_area) right_panel = Frame(persons_tab) attributes_table = Label(right_panel, text='attributes table') findings_table = EventsTable(persons_tab, self.view, self.treebard) # children of self scridth_n.grid(column=0, row=0, sticky='ew') scridth_w.grid(column=0, row=1, sticky='ns') header.grid(column=1, row=1, sticky='ew') self.columnconfigure(1, weight=1) self.rowconfigure(2, weight=1) self.main_tabs.grid(column=1, row=2, sticky='ew') footer.grid(column=1, row=3, sticky='ew') # children of header heading.grid(column=0, row=0, sticky='ew') # children of self.main_tabs persons_tab.grid(column=0, row=0, sticky='news') # children of persons_tab current_person_area.grid(column=0, row=0, sticky='w') right_panel.grid(column=1, row=0, sticky='e') findings_table.grid(column=0, row=1, columnspan=2, sticky='news') # children of current_person_area current_person.grid(column=0, row=0, sticky='w') # children of right_panel attributes_table.grid(column=0, row=0, sticky='news') # children of footer boilerplate.grid()
def build_page2(self): ''' 用subprocess不可实现与sqlmap的交互! 不管是多线程, 同步还是异步, 都不行, 只能使用pty ''' box = Box(orientation=VERTICAL, spacing=6) box.set_border_width(10) _row1 = Box(spacing=6) m._page2_respwan_btn.connect('clicked', self._handlers.respawn_terminal) m._page2_right_btn.connect("button-press-event", self.on_right_click) # can not disable # m._page2_right_btn.set_sensitive(False) self._build_page2_context() _row1.pack_start(m._page2_respwan_btn, False, True, 0) _row1.pack_start(m._page2_right_btn, False, True, 0) _row2 = Frame() # equals: _pty = m._page2_terminal.pty_new_sync(Vte.PtyFlags.DEFAULT) _pty = Vte.Pty.new_sync(Vte.PtyFlags.DEFAULT) m._page2_terminal.set_pty(_pty) m._page2_terminal.connect('key_press_event', self.on_clipboard_by_key) m._page2_terminal.connect("button-press-event", self.on_right_click, m._page2_right_btn) # https://stackoverflow.com/questions/55105447/virtual-python-shell-with-vte-pty-spawn-async # https://gtk-d.dpldocs.info/vte.Pty.Pty.spawnAsync.html # API手册上的该方法签名有问题, 与实际的对不上 # 最后一个参数为回调函数, 是必填项 _pty.spawn_async(str(Path.home()), [self._handlers.shell], None, GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None, -1, None, lambda pty, task: None) _scrolled = g.ScrolledWindow() _scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _scrolled.add(m._page2_terminal) _row2.add(_scrolled) box.pack_start(_row1, False, True, 5) box.pack_end(_row2, True, True, 0) return box
def reorder_notes(self): ''' ''' if self.toc.size() < 2: return self.order_dlg = Toplevel(self) self.order_dlg.grab_set() self.order_dlg.protocol('WM_DELETE_WINDOW', self.ignore_changes) self.order_dlg.bind('<Return>', self.save_close_reorder_dlg) self.order_dlg.bind('<Escape>', self.ignore_changes) self.order_dlg.grid_columnconfigure(0, weight=1) self.order_dlg.title('Reorder Subtopics') instrux = ('Tab or Ctrl+Tab selects movable subtopic.\n' 'Arrow keys change subtopic order up or down.') top = LabelH3(self.order_dlg, text=instrux, anchor='center') self.labels = Frame(self.order_dlg) e = 0 for subtopic in self.subtopics: lab = LabelMovable(self.labels, text=subtopic, anchor='w') if e == 0: first = lab e += 1 lab.grid(column=0, row=e, padx=3, sticky='ew') first.focus_set() close2 = Button(self.order_dlg, text='OK', command=self.save_close_reorder_dlg) top.grid(column=0, row=0, pady=(24, 0), padx=24, columnspan=2) self.labels.grid(column=0, row=1, columnspan=2, padx=24, pady=24) self.labels.grid_columnconfigure(0, weight=1) close2.grid(column=1, row=2, sticky='se', padx=12, pady=(0, 12)) center_window(self.order_dlg)
def _build_page2(self): ''' 用subprocess不可实现与sqlap的交互! 不管是多线程, 同步还是异步, 都不行, 只能使用pty ''' box = Box(orientation=VERTICAL, spacing=6) box.set_border_width(10) _row1 = Box(spacing=6) # m._page2_cmdline_str_label.set_alignment(0, 0.5) # 怎么没有垂直居中? m._page2_respwan_btn.connect('clicked', self._handlers.respawn_terminal) # _row1.pack_start(m._page2_cmdline_str_label, True, True, 0) _row1.pack_start(m._page2_respwan_btn, False, True, 0) _row2 = Frame() # 等价于_pty = m._page2_terminal.pty_new_sync(Vte.PtyFlags.DEFAULT) _pty = Vte.Pty.new_sync(Vte.PtyFlags.DEFAULT) m._page2_terminal.set_pty(_pty) # https://stackoverflow.com/questions/55105447/virtual-python-shell-with-vte-pty-spawn-async # https://gtk-d.dpldocs.info/vte.Pty.Pty.spawnAsync.html # API手册上的该方法签名有问题, 与实际的对不上 # 最后一个参数为回调函数, 是必填项 _pty.spawn_async(str(Path.home()), [self._handlers.shell], None, GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None, -1, None, lambda pty, task: None) _scrolled = g.ScrolledWindow() _scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _scrolled.add(m._page2_terminal) _row2.add(_scrolled) box.pack_start(_row1, False, True, 5) box.pack_end(_row2, True, True, 0) return box
def build_page5(self): box = Box(orientation=VERTICAL) box.set_border_width(10) _row1 = Box() self._get_sqlmap_path_btn = btn.new_with_label('sqlmap -hh') self._get_sqlmap_path_btn.set_sensitive(False) self._get_sqlmap_path_btn.connect('clicked', self._make_help_thread) _row1.pack_start(self._get_sqlmap_path_btn, False, True, 5) _row2 = Frame() self._make_help_thread(None) _scrolled = g.ScrolledWindow() _scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _scrolled.add(m._page5_manual_view) _row2.add(_scrolled) box.pack_start(_row1, False, True, 5) box.pack_start(_row2, True, True, 5) return box
def create_widgets(self): #Label((275,50,180,50), font=self.fonts[2], text=f"SCORE: {self.score}", bgcolor=BGCOLOR, fgcolor=BLACK).draw(self.screen) fonts = [ pygame.font.SysFont('Arial', size, True) for size in (70, 40, 25) ] self.lose_label = Label(center=True, size=(200, 100), font=fonts[1], text='You Lose', fgcolor=BLACK) # Restart UI self.restartUI = Frame(pos=(45, 145), size=(405, 405), bgcolor=BLACK, transparency=100) restart_lbl = Frame(parent=self.restartUI, pos=(100, 100), size=(205, 105), bgcolor=(100, 100, 190)) Label(parent=restart_lbl, center=True, font=fonts[1], text='Restart?') cancel_restart = Frame(parent=self.restartUI, pos=(220, 215), size=(75, 35), bgcolor=(192, 100, 100)) Button(parent=cancel_restart, center=True, font=fonts[1], text='No', command=lambda _: self.set_restart(False)) do_restart = Frame(parent=self.restartUI, pos=(115, 215), size=(75, 35), bgcolor=(192, 100, 100)) Button(parent=do_restart, center=True, font=fonts[1], text='Yes', command=self.restart) # Main UI self.mainUI = Frame(pos=(0, 0), size=(SCREENX, SCREENY), bgcolor=BGCOLOR) undo_btn_image = Frame(parent=self.mainUI, pos=(390, 95), size=(50, 50), image=pygame.image.load('undo.png')) Button(parent=undo_btn_image, command=self.undo) restart_btn_image = Frame(parent=self.mainUI, pos=(330, 95), size=(50, 50), image=pygame.image.load('restart.png')) Button(parent=restart_btn_image, command=lambda _: self.set_restart(True)) title_frame = Frame(parent=self.mainUI, pos=(25, 50), size=(200, 80)) Label(parent=title_frame, center=True, font=fonts[0], text="2048") score_frame = Frame(parent=self.mainUI, pos=(275, 50), size=(180, 50)) self.score_label = Label(parent=score_frame, center=True, font=fonts[2], text='score')
def make_widgets(self): all_pics = self.get_all_pics() lab1 = Label(self, text='Gender:') self.gender_input = ClearableReadonlyCombobox(self, values=GENDER_TYPES) lab2 = Label(self, text='Main Image:') self.image_input = ClickAnywhereCombo(self, values=all_pics) lab3 = Label(self, text='Name Type:') self.name_type_input = ClearableReadonlyCombobox(self, values=self.get_name_types()) lab4 = Label(self, text='Full Name') self.name_input = Entry(self, width=65) self.how = LabelH3( self, text='Alphabetize name: after clicking auto-sort, tab into ' 'auto-filled name fields to modify\nsort order with ' 'arrow keys or if sort order is correct, just click ADD.') autosort = Button( self, text='AUTOSORT', command=self.show_sort_order) self.order_frm = Frame(self) s = 0 for stg in range(20): mov = LabelMovable(self.order_frm) mov.grid(column=s, row=0, padx=3) s += 1 self.buttonbox = Frame(self) self.add_butt = Button(self.buttonbox, text='ADD', width=8) lab1.grid(column=0, row=3) self.gender_input.grid( column=1, row=3, padx=12, pady=12, sticky='e') lab2.grid(column=2, row=3) self.image_input.grid(column=3, row=3, padx=12, pady=12) lab3.grid(column=0, row=4) self.name_type_input.grid( column=1, row=4, padx=12, pady=12, sticky='e') lab4.grid(column=2, row=4) self.name_input.grid(column=3, row=4, padx=12, pady=12) self.how.grid(column=0, row=5, padx=6, pady=6, columnspan=4) autosort.grid(column=0, row=6, padx=6, pady=6) self.order_frm.grid(column=1, row=6, columnspan=4, pady=24) self.buttonbox.grid(column=1, row=7, sticky='e') self.add_butt.grid(column=0, row=0, padx=6, pady=6, sticky='e') self.new_person_statusbar = StatusbarTooltips(self.parent, resizer=False) visited = ( (self.gender_input, "Gender Input", "'Unknown' used if left blank."), (self.image_input, "Image Input", "Use an old photo of person's home town if no photo available."), (self.name_type_input, "Name Type Input", "Choose the name type."), (self.name_input, "Name Input", "Autofills but you can change it."), (autosort, "Autosort Button", "Click to auto-create a sortable name."), (self.order_frm, "", "Tab to focus name element. Arrow to change order.") ) run_statusbar_tooltips( visited, self.new_person_statusbar.status_label, self.new_person_statusbar.tooltip_label) self.preset() rcm_widgets = (self.name_input, self.name_type_input) make_rc_menus( rcm_widgets, self.rc_menu, person_add_msg)
def make_widgets(self): self.grid(column=0, row=1, sticky='news') self.border_top = FrameTitleBar(self.master, height=3, name='top') self.title_bar = FrameTitleBar(self.master) self.menu = Frame(self.master) self.ribbon = Frame(self.master) self.border_left = FrameTitleBar(self.master, width=3, name='left') self.border_right = FrameTitleBar(self.master, width=3, name='right') self.statusbar = StatusbarTooltips(self.master) self.border_bottom = FrameTitleBar(self.master, height=3, name='bottom') self.master.grid_columnconfigure(1, weight=1) self.master.grid_rowconfigure(4, weight=1) self.border_top.config(cursor='sb_v_double_arrow') self.border_left.config(cursor='sb_h_double_arrow') self.border_right.config(cursor='sb_h_double_arrow') self.border_bottom.config(cursor='sb_v_double_arrow') self.border_top.grid(column=0, row=0, columnspan=4, sticky='ew') self.title_bar.grid(column=1, row=1, columnspan=2, sticky='ew') if self.menubar is True: self.menu.grid(column=1, row=2, columnspan=2, sticky='ew') if self.ribbon_menu is True: self.ribbon.grid(column=1, row=3, columnspan=2, sticky='ew') self.grid(column=1, row=4, sticky='news') self.border_left.grid(column=0, row=1, rowspan=6, sticky='ns') self.border_right.grid(column=3, row=1, rowspan=6, sticky='ns') self.statusbar.grid(column=1, row=6, columnspan=2, sticky='ew') self.border_bottom.grid(column=0, row=7, columnspan=4, sticky='ew') self.config(cursor='arrow') # children of self.title_bar self.title_bar.grid_columnconfigure(0, weight=1) self.title_bar.grid_columnconfigure(1, weight=0) self.title_frame = FrameTitleBar(self.title_bar) self.buttonbox = FrameTitleBar(self.title_bar) self.title_frame.pack(side='left') self.buttonbox.place(relx=1.0, x=-100, rely=0.125, y=-2) # children of self.title_frame self.logo = TitleBarButtonSolidBG(self.title_frame, icon='logo', icon_size=self.icon_size) self.txt_frm = FrameTitleBar(self.title_frame) self.logo.pack(side='left', pady=(0, 3), padx=(0, 12)) self.txt_frm.pack(side='left') # children of text_frm self.title_1 = LabelTitleBar(self.txt_frm, size=self.icon_size, text='Toykinter Demo') self.title_1b = FrameTitleBar(self.txt_frm, width=36) self.title_2 = LabelTitleBar(self.txt_frm, size=self.icon_size, text='for all ages') self.title_1.grid(column=0, row=0) self.title_1b.grid(column=1, row=0, sticky='ew') self.title_2.grid(column=2, row=0) # children of self.buttonbox self.minn = TitleBarButton(self.buttonbox, icon='min', icon_size=self.icon_size) self.maxx = TitleBarButton(self.buttonbox, icon='max', icon_size=self.icon_size) self.restore = TitleBarButton(self.buttonbox, icon='restore', icon_size=self.icon_size) self.quitt = TitleBarButton(self.buttonbox, icon='quit', icon_size=self.icon_size) self.minn.grid(column=0, row=0, sticky='w') self.maxx.grid(column=1, row=0, sticky='w', padx=(0, 3)) self.restore.grid(column=1, row=0, sticky='w', padx=(0, 3)) self.restore.grid_remove() self.quitt.grid(column=2, row=0, sticky='e', padx=(0, self.size)) self.master.update_idletasks() to_the_left = self.buttonbox.winfo_reqwidth() self.buttonbox.place(relx=1.0, x=-to_the_left, rely=0.125, y=-2 * self.rel_y) # bindings self.master.bind('<Map>', self.hide_windows_titlebar) self.minn.bind('<Button-1>', self.minimize) self.maxx.bind('<Button-1>', self.toggle_max_restore) self.restore.bind('<Button-1>', self.toggle_max_restore) self.quitt.bind('<Button-1>', close) x = [ i.bind('<Map>', self.recolorize_on_restore) for i in (self.minn, self.quitt) ] for widg in (self.title_bar, self.title_frame, self.logo, self.title_1, self.title_1b, self.title_2, self.txt_frm, self.buttonbox): widg.bind('<B1-Motion>', self.move_window) widg.bind('<Button-1>', self.get_pos) widg.bind('<Double-Button-1>', self.toggle_max_restore) for widg in (self.border_top, self.border_left, self.border_right, self.border_bottom): widg.bind('<Button-1>', self.start_edge_sizer) widg.bind('<B1-Motion>', self.stop_edge_sizer) widg.bind('<ButtonRelease-1>', self.stop_edge_sizer) config_generic(self.master)
def build_page4(self): box = Box(orientation=VERTICAL) box.set_border_width(10) _row1 = Box(spacing=6) _row1.pack_start(m._page4_api_server_label, False, True, 0) _row1.pack_start(m._page4_api_server_entry, True, True, 0) _row1.pack_start(m._page4_admin_token_label, False, True, 0) _row1.pack_start(m._page4_admin_token_entry, True, True, 0) _row2 = Box(spacing=6) _arrow_down = g.Image.new_from_icon_name('pan-down-symbolic', 1) m._page4_admin_list_btn.set_image(_arrow_down) m._page4_admin_list_btn.set_image_position(g.PositionType.RIGHT) m._page4_admin_list_btn.set_always_show_image(True) m._page4_task_new_btn.connect('clicked', self._handlers.api.task_new) m._page4_admin_list_btn.connect('clicked', self._handlers.api.admin_list) m._page4_admin_flush_btn.connect('clicked', self._handlers.api.admin_flush) m._page4_clear_task_view_btn.connect( 'clicked', self._handlers.clear_task_view_buffer) _row2.pack_start(m._page4_task_new_btn, False, True, 0) _row2.pack_start(m._page4_admin_list_btn, False, True, 0) _row2.pack_start(m._page4_admin_flush_btn, False, True, 0) _row2.pack_start(m._page4_clear_task_view_btn, False, True, 0) _row2.pack_end(m._page4_password_entry, False, True, 0) _row2.pack_end(m._page4_password_label, False, True, 0) _row2.pack_end(m._page4_username_entry, False, True, 0) _row2.pack_end(m._page4_username_label, False, True, 0) _row3 = Frame() _paned = g.Paned() self._api_admin_list_rows = g.ListBox.new() self._api_admin_list_rows.set_selection_mode(g.SelectionMode.NONE) _lscrolled = g.ScrolledWindow() _lscrolled.set_size_request(400, -1) _lscrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _lscrolled.add(self._api_admin_list_rows) _rbox = Box(orientation=VERTICAL) _page4_option_set_view_tip = label( label='check optiondict.py of sqlmap about options.', halign=g.Align.START) _option_set_view_textbuffer = m._page4_option_set_view.get_buffer() _options_example = ("{\n" " 'url': 'http://www.site.com/vuln.php?id=1',\n" " 'level': 1, 'risk': 1,\n\n" "}\n") _option_set_view_textbuffer.set_text( _options_example, len(_options_example.encode('utf8'))) # 貌似scrollwindow要直接包含textview, # 不然一直回车后, 页面不会向上滚 _option_set_scrolled = g.ScrolledWindow() _option_set_scrolled.set_size_request(400, -1) _option_set_scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _option_set_scrolled.add(m._page4_option_set_view) _rbox.pack_start(m._page4_option_get_entry, False, True, 2) _rbox.pack_start(_page4_option_set_view_tip, False, True, 2) _rbox.pack_start(_option_set_scrolled, True, True, 2) # Warning: don't edit pack1(), pack2() again, otherwise it becomes strange. _paned.pack1(_lscrolled, False, False) _paned.pack2(_rbox, False, True) _row3.add(_paned) _row4 = Frame() _task_view_textbuffer = m._page4_task_view.get_buffer() _end = _task_view_textbuffer.get_end_iter() _task_view_textbuffer.create_mark('end', _end, False) self._handlers.api.task_view_append('response result:') _scrolled = g.ScrolledWindow() _scrolled.set_policy(g.PolicyType.NEVER, g.PolicyType.ALWAYS) _scrolled.add(m._page4_task_view) _row4.add(_scrolled) box.pack_start(_row1, False, True, 5) box.pack_start(_row2, False, True, 5) box.pack_start(_row3, True, True, 5) box.pack_start(_row4, True, True, 5) return box
if string_input in caseless_colors: color = string_input ok = '{}\nis a\nvalid\ncolor.'.format(color.title()) cbox_select.config(text=ok) else: cbox_select.config(text=msg) def test_bind_to_dropdown_items(evt): print("evt.widget.cget('text'):", evt.widget.cget('text')) root = tk.Tk() root.focus_set() root.grid_columnconfigure(0, weight=1) root.geometry('+500+200') content = Frame(root) content.grid() b = Combobox(content, root, callback=color_background, height=75, values=caseless_colors, scrollbar_size=16) flat = ButtonFlatHilited(content, text='Apply Combo 1') flat.config(command=lambda button=flat: color_background(button)) b.config_values(short_list) # You can't do this in ttk.Combobox: for widg in b.buttons: widg.bind('<FocusOut>', test_bind_to_dropdown_items)
def make_widgets(self): self.frm = Frame(self) self.frm.grid(column=0, row=0, pady=(0, 18)) self.errlab = Label(self.frm, text='Input was: ') self.errlab.grid(column=0, row=0, padx=24, pady=(24, 0), sticky='w') self.errshow = LabelItalic(self.frm) self.errshow.grid(column=1, row=0, pady=(24, 0), sticky='w') self.errmsg = tk.Message(self.frm, text=self.message, bd=3, relief='raised', aspect=400) self.errmsg.grid(column=0, row=1, padx=36, pady=(0, 18), columnspan=2) self.promptlab = Label(self.frm) self.var = tk.StringVar() self.altentry = Entry(self.frm) self.altentry.config(textvariable=self.var) self.promptlab.grid(column=0, row=2, pady=24, padx=24, sticky='w') self.altentry.grid(column=1, row=2, pady=24, sticky='w') self.promptlab.grid_remove() self.altentry.grid_remove() self.altentry.focus_set() self.altentry.bind('<Return>', self.on_ok) self.bbox = Frame(self) self.bbox.grid(column=0, row=3, columnspan=2) self.done = Button(self.bbox, text='DONE', command=self.on_ok, width=9) self.done.grid(column=0, row=0, padx=24, pady=(12, 24)) self.done.grid_remove() self.stop = Button(self.bbox, text='CANCEL1', command=self.on_cancel, width=9) self.stop.grid(column=1, row=0, padx=24, pady=(12, 24)) self.stop.grid_remove() self.done.focus_set() self.accept = Button(self.bbox, text='Accept Original Input', command=self.on_ok, width=36) self.accept.grid(column=0, row=0, padx=24, pady=12) self.accept.grid_remove() self.edit = Button(self.bbox, text='Submit Edited Input', command=self.on_alt, width=36) self.edit.grid(column=0, row=1, padx=24, pady=12) self.edit.grid_remove() self.cancel_all = Button(self.bbox, text="Cancel (Don't Submit Anything)", command=self.on_cancel, width=36) self.cancel_all.grid(column=0, row=2, padx=24, pady=(12, 36)) self.cancel_all.grid_remove() self.bind('<Escape>', self.on_cancel) PlaySound('SystemHand', SND_ASYNC) self.protocol("WM_DELETE_WINDOW", self.on_cancel)
def make_widgets(self): def combobox_selected(combo): ''' The reason this function is nested is that I have no experience with overriding methods. When I tried to add `self` as the first parameter, there was an error and I didn't know what to do. I nested it so I wouldn't have to use `self`. ''' if combo == self.combos["select_input_font"]: input_sample.config(font=(self.all_fonts[combo.current], self.fontSize)) elif combo == self.combos["select_output_font"]: output_sample.config(font=(self.all_fonts[combo.current], self.fontSize)) else: print("case not handled") # update_idletasks() seems to speed up the redrawing of the # app with the new font self.update_idletasks() sample_text = ["Sample", "Text ABCDEFGHxyz 0123456789 iIl1 o0O"] self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) sample = Frame(self) self.output_sample = Label(sample, text=" Output ".join(sample_text)) self.input_sample = Entry(sample, width=50) self.input_sample.insert(0, " Input ".join(sample_text)) self.fontSizeVar = tk.IntVar() self.fontSize = self.font_scheme[0] self.font_size = Scale( self, from_=8.0, to=26.0, tickinterval=6.0, label="Text Size", # Can this be centered over the Scale? orient="horizontal", length=200, variable=self.fontSizeVar, command=self.show_font_size) self.font_size.set(self.fontSize) combo_names = ["select_output_font", "select_input_font"] self.combos = {} j = 2 for name in combo_names: cbo = Combobox(self, self.root, values=self.all_fonts, height=300, scrollbar_size=12) self.combos[name] = cbo name = name.replace("_", " ").title() lab = Label(self, text=name) lab.grid(column=0, row=j, pady=(24, 6)) cbo.grid(column=0, row=j + 1, pady=(6, 20)) j += 2 self.apply_button = Button(self, text="APPLY", command=self.apply) sample.grid(column=0, row=0) self.output_sample.grid(padx=24, pady=20) self.input_sample.grid(padx=24, pady=20) self.font_size.grid(column=0, row=1, pady=24) self.apply_button.grid(column=0, row=7, sticky="e", padx=(0, 24), pady=(0, 24)) Combobox.combobox_selected = combobox_selected
def make_widgets(self): self.title('{}{} ({})'.format('Notes for Conclusion #', self.finding_id, self.birth_name)) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(1, weight=1) header = Frame(self) header.grid_columnconfigure(1, weight=1) header.grid_rowconfigure(0, weight=1) self.notes_dialog_header = Frame(header) content = Frame(self) left_panel = Frame(content) topiclab = Label(left_panel, text='Note Subtopics') self.toc = Listbox(left_panel, self.sorted_subtopics, view_height=424, view_width=180, scrollbar=False) self.new_index = len(self.subtopics) self.toc.insert(self.new_index, self.new_subtopic_label_text) self.toc.focus_set() self.toc.selection_set(0) self.toc.store_new_subtopic_name = self.store_new_subtopic_name self.toc.pass_ctrl_click = self.open_links_dialog self.toc.pass_delete_key = self.delete_note self.selected_subtopic = Label(content, text='New Note') self.note_input = ScrolledText(content) note_submit = Button(content, text='Submit Changes', command=self.save_changes) order = Button(content, text='Change Order of Subtopics', command=self.reorder_notes) radframe = LabelFrame(content, text='Make selected note...') self.public = Radiobutton(radframe, text='...public', anchor='w', variable=self.privacy, value=0, command=self.save_privacy_setting) self.private = Radiobutton(radframe, text='...private', anchor='w', variable=self.privacy, value=1, command=self.save_privacy_setting) close = Button(content, text='DONE', command=self.close_roles_dialog) # notes_statusbar = StatusbarTooltips(self) # visited = ( # (above, # 'this is a notes_statusbar message', # 'this is a tooltip'), # (below, # 'this is also a notes_statusbar message', # 'this is another tooltip')) # run_statusbar_tooltips( # visited, # notes_statusbar.status_label, # notes_statusbar.tooltip_label) # grid in self header.grid(column=0, row=0, columnspan=2, pady=12, sticky='we') content.grid(column=0, row=1, sticky='news', padx=(0, 6)) # notes_statusbar.grid(column=0, row=2, sticky='ew') # grid in header self.notes_dialog_header.grid(column=1, row=0, sticky='ew') self.notes_dialog_header.grid_columnconfigure(0, weight=1) # grid in content left_panel.grid(column=0, row=1, sticky='news', rowspan=2, pady=24) self.selected_subtopic.grid(column=1, row=1, sticky='w') self.note_input.grid(column=1, row=2, columnspan=3, sticky='nsew', padx=(0, 24), pady=12) note_submit.grid(column=3, row=3, sticky='se') self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) content.grid_rowconfigure(1, weight=1) order.grid(column=1, row=4) radframe.grid(column=2, row=5, sticky='n', pady=24) close.grid(column=3, row=6, sticky='se', padx=24, pady=(0, 24)) # grid in left_panel topiclab.grid(column=0, row=0) self.toc.grid(column=0, row=1) for child in self.toc.listbox_content.winfo_children(): child.bind('<<ListboxSelected>>', self.switch_note) self.subtopic_widgets = self.toc.listbox_content.winfo_children() # grid in radframe self.public.grid(column=0, row=0, sticky='news', padx=24) self.private.grid(column=0, row=1, sticky='news', padx=24) # rcm_widgets = (self.subtopic_input, self.note_input.text) # make_rc_menus( # rcm_widgets, # self.rc_menu, # note_dlg_msg, # header_parent=self.notes_dialog_header, # header=self.header, # which_dlg='notes') config_generic(self) center_window(self)
def make_widgets(self): stripview = Frame(self.parent) stripview.grid(column=0, row=0, padx=12, pady=12) self.parent.update_idletasks() self.colors_canvas = Canvas( stripview, bd=1, highlightthickness=1, highlightbackground=formats['highlight_bg'], bg=formats['bg'], width=840, height=118 ) hscroll = Scrollbar( stripview, orient='horizontal', command=self.colors_canvas.xview) self.colors_canvas.configure(xscrollcommand=hscroll.set) self.colors_canvas.grid(column=0, row=0, sticky='news') hscroll.grid(column=0, row=1, sticky="ew") self.colors_content = Frame(self.colors_canvas) bbox1 = Frame(self.parent) bbox1.grid(column=0, row=1, padx=12, pady=12, sticky='we') bbox1.columnconfigure(1, weight=1) bbox1.rowconfigure(1, weight=1) self.try_button = Button( bbox1, text='TRY', width=7, command=self.config_local) self.try_button.grid(column=0, row=0, sticky='w') self.copy_button = Button( bbox1, text='COPY', width=7, command=self.copy_scheme) self.copy_button.grid(column=1, row=0) self.apply_button = Button( bbox1, text='APPLY', width=7, command=self.apply_scheme) self.apply_button.grid(column=2, row=0, sticky='e') bottom = Frame(self.parent) bottom.grid(column=0, row=2, padx=12, pady=12) addlab = LabelH3(bottom, text='New Color Scheme') addlab.grid(column=0, row=0, padx=6, pady=6, columnspan=2) self.colors_table = Frame(bottom) self.colors_table.grid(column=0, row=1, columnspan=2) self.colors_table.columnconfigure(0, weight=1) self.colors_table.rowconfigure(0, weight=1) all_schemes = get_color_schemes() self.h1 = Label( self.colors_table, anchor='w', text=' Domain', font=formats['output_font']) self.h2 = Label( self.colors_table, anchor='w', text=' Color') opening_colors = ( formats['bg'], formats['highlight_bg'], formats['head_bg'], formats['fg']) displabel = self.make_colors_table(opening_colors) bbox2 = Frame(bottom) bbox2.grid( column=0, row=2, padx=12, pady=12, sticky='ew', columnspan=2) bbox2.columnconfigure(1, weight=1) bbox2.rowconfigure(0, weight=1) self.new_button = Button( bbox2, text='CREATE NEW COLOR SAMPLE', command=self.make_new_sample) self.new_button.grid(column=0, row=0, padx=6, pady=6, columnspan=2) self.make_samples() self.colors_canvas.create_window( 0, 0, anchor='nw', window=self.colors_content) self.resize_color_samples_scrollbar()
finding = 1 view = tk.Tk() treebard = view # mockup; this isn't what really happens entry = EntryAutofill(view, width=50) entry.config(textvariable=entry.var) entry.values = place_strings entry.autofill = True entry.grid() entry.focus_set() entry.bind("<FocusOut>", get_final) traverse = Entry(view) traverse.grid() frame = Frame(view) frame.grid() view.mainloop() # DO LIST # input to db # add a search box for ids by name or name by ids # test all cases and make more cases to test # concoct a case where there are # 2 contiguous insertions not at first or last # 2 contiguous insertions at first # 2 contiguous insertions at last # 2 non-contiguous insertions not at first or last # 2 non-contiguous insertions at first
def show_choices(self): conn = sqlite3.connect(current_file) cur = conn.cursor() self.radvars = [] for dd in self.place_dicts: self.var = tk.IntVar(None, 0) self.radvars.append(self.var) d = 0 t = 0 bullet = len(self.place_dicts) # configure place_id for query for dkt in self.place_dicts: add_new_place_option = False place_hints = [] if len(dkt["id"]) == 1: if dkt.get("temp_id") is None: place_id = (dkt["id"][0], ) else: place_id = (dkt["id"][0]) add_new_place_option = True elif len(dkt["id"]) > 1: if dkt.get("temp_id") is not None: add_new_place_option = True place_id = dkt["id"] elif dkt.get("temp_id") is None: place_id = ("none", ) elif dkt.get("temp_id"): # place id will be int type which marks it as a new place place_id = dkt["temp_id"] else: print("line", looky(seeline()).lineno, "case not handled") if type(place_id) is int: place_hints.append('') else: for num in place_id: if num == "none": place_hints.append('') else: cur.execute(select_place_hint, (num, )) place_hint = cur.fetchone() if place_hint[0] is None: place_hint = '' else: place_hint = place_hint[0] place_hints.append(place_hint) # reconfigure place_id for display if type(place_id) is int: if dkt["temp_id"] is not None and len(dkt["id"]) > 0: place_hints.append('') elif add_new_place_option is True: place_hints.append('') elif len(place_id) == 1: place_id = place_id[0] else: print("line", looky(seeline()).lineno, "case not handled") place_input = dkt["input"] place_string = '{}: {}, place ID #{}'.format( bullet, place_input, place_id) lab = Label(self.frm, text=place_string) lab.grid(column=0, row=d, sticky='w') self.hint_frm = Frame(self.frm, name="nest{}".format(bullet - 1)) self.hint_frm.grid(column=0, row=d + 1, sticky='w', padx=(0, 3), columnspan=2) self.hint_frm.columnconfigure(0, minsize=48) self.make_edit_row(self.hint_frm) h = 0 row = 0 for hint in place_hints: if dkt.get("temp_id") is not None and len(dkt["id"]) > 0: # user will choose between a new ID or one of the existing IDs new_id = dkt["temp_id"] last_idx = len(dkt["id"]) if h == last_idx: current_id = new_id rad_string = "{}: {} (new place and new place ID)".format( current_id, dkt["input"]) else: current_id = dkt["id"][h] cur.execute(select_first_nested_place, (current_id, )) nesting = cur.fetchone() nesting = [i for i in nesting if i] nesting = ", ".join(nesting) rad_string = "{}: {}".format(current_id, nesting) elif dkt.get("temp_id") is not None and len(dkt["id"]) == 0: # user will OK or CANCEL new ID current_id = dkt["temp_id"] rad_string = "{}: {} (new place and new place ID)".format( current_id, dkt["input"]) else: current_id = dkt["id"][h] cur.execute(select_first_nested_place, (current_id, )) nesting = cur.fetchone() nesting = [i for i in nesting if i] nesting = ", ".join(nesting) rad_string = "{}: {}".format(current_id, nesting) rad = RadiobuttonBig(self.hint_frm, variable=self.radvars[t], value=h, text=rad_string, anchor="w") lab = Label(self.hint_frm, text="hint: {}".format(hint), anchor='w', bg='red') editx = ButtonQuiet( self.hint_frm, width=2, command=lambda hint=hint: self.grid_edit_row(hint)) self.hint_frm.columnconfigure(1, weight=1) rad.grid(column=0, row=row, sticky='we', columnspan=2) editx.grid(column=0, row=row + 1, pady=(0, 3), sticky='e') lab.grid(column=1, row=row + 1, sticky='w', padx=6) editx.bind('<Enter>', self.on_hover) editx.bind('<Leave>', self.on_unhover) editx.bind('<Button-1>', self.get_clicked_row) editx.bind('<space>', self.get_clicked_row) editx.bind('<FocusIn>', self.on_hover) editx.bind('<FocusOut>', self.on_unhover) h += 1 row += 2 sep = Separator(self.frm, 3) sep.grid(column=0, row=d + 2, sticky='ew', columnspan=3, pady=(3, 0)) d += 3 t += 1 bullet -= 1 cur.close() conn.close()
def make_widgets(self): def show_message(): window.columnconfigure(1, weight=1) window.rowconfigure(1, weight=1) lab = MessageHilited(window, text=self.message, justify='left', aspect=500) lab.grid(column=1, row=1, sticky='news', ipady=18) def ok(): if self.do_on_ok: self.do_on_ok() cancel() def cancel(): self.new_places_dialog.destroy() size = (self.parent.winfo_screenwidth(), self.parent.winfo_screenheight()) self.new_places_dialog = Toplevel(self.parent) self.new_places_dialog.geometry("+84+84") self.new_places_dialog.maxsize(width=int(size[0] * 0.85), height=int(size[1] * 0.95)) self.new_places_dialog.columnconfigure(1, weight=1) self.new_places_dialog.rowconfigure(4, weight=1) canvas = Border(self.new_places_dialog, size=3) # don't hard-code size canvas.title_1.config(text=self.title) canvas.title_2.config(text='') window = Frame(canvas) canvas.create_window(0, 0, anchor='nw', window=window) scridth = 16 scridth_n = Frame(window, height=scridth) scridth_w = Frame(window, width=scridth) scridth_n.grid(column=0, row=0, sticky='ew') scridth_w.grid(column=0, row=1, sticky='ns') # DO NOT DELETE THESE LINES, UNCOMMENT IN REAL APP # self.treebard.scroll_mouse.append_to_list([canvas, window]) # self.treebard.scroll_mouse.configure_mousewheel_scrolling() window.vsb = Scrollbar(self.new_places_dialog, hideable=True, command=canvas.yview, width=scridth) window.hsb = Scrollbar(self.new_places_dialog, hideable=True, width=scridth, orient='horizontal', command=canvas.xview) canvas.config(xscrollcommand=window.hsb.set, yscrollcommand=window.vsb.set) window.vsb.grid(column=2, row=4, sticky='ns') window.hsb.grid(column=1, row=5, sticky='ew') buttonbox = Frame(window) b1 = Button(buttonbox, text=self.button_labels[0], width=7, command=ok) b2 = Button(buttonbox, text=self.button_labels[1], width=7, command=cancel) scridth_n.grid(column=0, row=0, sticky='ew') scridth_w.grid(column=0, row=1, sticky='ns') window.columnconfigure(2, weight=1) window.rowconfigure(1, minsize=60) buttonbox.grid(column=1, row=3, sticky='se', pady=6) b1.grid(column=0, row=0) b2.grid(column=1, row=0, padx=(2, 0)) self.frm = Frame(window) self.frm.grid(column=1, row=2, sticky='news', pady=12) show_message() self.show_choices() resize_scrolled_content(self.new_places_dialog, canvas, window) self.new_places_dialog.focus_set()
def make_widgets(self): if self.parent.winfo_class() == 'Toplevel': gallery_canvas = Canvas( self.parent, bd=0, highlightthickness=0) self.gallery_content = Frame(gallery_canvas) gallery_canvas.grid(row=0, column=0, sticky='nsew') self.parent.grid_columnconfigure(0, weight=1) self.parent.grid_rowconfigure(0, weight=1) else: self.gallery_content = Frame(self.parent) self.gallery_content.grid(column=0, row=0) self.thumb_canvas = Canvas( self.gallery_content, bd=0, highlightthickness=0, bg=formats['bg']) self.thumb_canvas.pack(padx=12, pady=12) self.thumbstrip = Frame(self.thumb_canvas) self.thumbstrip.pack(side='top') self.previous_img = Button(self.gallery_content, text='<<', width=6) self.pic_canvas = Canvas( self.gallery_content, highlightbackground=formats['bg']) self.pic_canvas.bind('<Button-1>', self.focus_clicked) self.pic_canvas.bind('<Button-1>', self.scroll_start, add='+') self.pic_canvas.bind('<B1-Motion>', self.scroll_move) self.img_path = '{}treebard_gps\data\{}\images\{}'.format( root_drive, self.image_dir, self.main_pic) img_big = Image.open(self.img_path) self.tk_img = ImageTk.PhotoImage(img_big) self.pic_canvas.image = self.tk_img z = 0 self.current_pictures = sorted(self.current_pictures) for img in self.current_pictures: pic_col = Frame(self.thumbstrip) pic_col.pack(side='left', expand=1, fill='y') pic_file = img self.img_path = '{}treebard_gps\data\{}\images\{}'.format(root_drive, self.image_dir, pic_file) idx = len(pic_file) bare = pic_file[0:idx-4] thumbsy = Image.open(self.img_path) self.width_strings.append(thumbsy.width) self.height_strings.append(thumbsy.height) thumbsy.thumbnail((185,85)) thumb_path = 'images/{}_tmb.png'.format(bare) # overwrites file by same name if it exists thumbsy.save(thumb_path) small = ImageTk.PhotoImage(file=thumb_path, master=self.thumbstrip) thumb = Label( pic_col, image=small) thumb.pack(expand=1, fill='y') thumb.image = small self.thumb_labels.append(thumb) # lambda used to save value in loop if self.parent.winfo_class() == 'Toplevel': rad = Radiobutton( pic_col, takefocus=0, value=pic_file, command=lambda pic_file=pic_file: self.set_main_pic( pic_file)) rad.pack() if rad['value'] == self.main_pic: rad.select() else: rad = Frame( pic_col, height=24, width=24) rad.pack(expand=1, fill='both') if self.parent.winfo_name() == 'source_tab': pic_file = '{}, {}'.format(self.source, pic_file) create_tooltip(rad, pic_file) z += 1 self.pil_img = img_big self.fit_canvas_to_pic() self.thumb_dict = dict(zip(self.thumb_labels, self.current_pictures)) self.next_img = Button(self.gallery_content, text='>>', width=6) panel = Frame(self.gallery_content) subject = LabelH3(panel, text=self.curr_entity) subject.grid(column=0, row=0, sticky='ew') # labels with selectable multiline text self.caption_lab = MessageCopiable(panel, width=36) self.picfile_lab = MessageCopiable(panel, width=36) self.picsize_lab = MessageCopiable(panel, width=36) edit = Button( panel, text='EDIT', width=8, command=lambda graphics=self.t7: self.go_to_graphics(graphics)) self.previous_img.config(command=self.back) self.next_img.config(command=self.forward) panel.grid_rowconfigure(0, weight=2) panel.grid_rowconfigure(1, weight=1) panel.grid_rowconfigure(4, weight=2) self.caption_lab.grid(column=0, row=1, pady=(12,12), sticky='ew') self.caption_lab.insert(1.0, self.caption_text) self.picfile_lab.grid(column=0, row=2, pady=(12,0), sticky='ew') self.picfile_lab.insert(1.0, self.img_path) self.picsize_lab.grid(column=0, row=3, pady=(0,24), sticky='ew') self.picsize_lab.insert( 1.0, 'width: {}, height: {}'.format( self.pil_img.width, self.pil_img.height)) edit.grid(column=0, row=4) self.caption_lab.set_height() self.picfile_lab.set_height() self.picsize_lab.set_height() self.previous_img.pack(side='left', padx=12) self.pic_canvas.pack(side='left', expand=1, fill='y') self.next_img.pack(side='left', padx=12) panel.pack(side='left', expand=1, fill='y') for thumb in self.thumb_labels: thumb.bind('<Button-1>', self.show_clicked) self.pic_canvas.bind('<Key-Left>', lambda evt: self.back()) self.pic_canvas.bind('<Key-Right>', lambda evt: self.forward()) # add statusbar-tooltips self.visited = ( (self.thumbstrip, "Thumbnail Views", "Click thumbnail to display. Hover below to see " "file name. If radio, click to make main image."), (self.pic_canvas, "Image", "Arrow keys change image when it's in focus."), (self.previous_img, "Left Button", "Click with mouse or when highlighted click with spacebar."), (self.next_img, "Right Button", "Click with mouse or when highlighted click with spacebar.")) if self.parent.winfo_class() == 'Toplevel': box = Frame(self.parent) box.grid(column=0, row=1, pady=12) close = Button( box, text='CLOSE', width=8, command=self.cancel_gallery) close.grid() self.parent.protocol('WM_DELETE_WINDOW', self.cancel_gallery) self.thumb_canvas.create_window(0, 0, anchor='nw', window=self.thumbstrip) self.thumb_canvas.config( scrollregion=( 0, 0, self.thumbstrip.winfo_reqwidth(), self.thumbstrip.winfo_reqheight())) self.thumb_canvas.config( width=self.root.maxsize()[0], height=self.thumbstrip.winfo_reqheight()) scroll_width = int(self.thumb_canvas['scrollregion'].split(' ')[2]) if scroll_width >= int(self.thumb_canvas['width']): for child in self.thumbstrip.winfo_children(): for gchild in child.winfo_children(): gchild.bind("<Enter>", self.thumb_start) gchild.bind("<Motion>", self.thumb_move) if self.parent.winfo_class() == 'Toplevel': gallery_canvas.create_window( 0, 0, anchor=tk.NW, window=self.gallery_content) self.resize_scrollbar() self.resize_window() self.config_labels()
def delete_note(self): ''' Since any given note can be re-used more than once by linking it to any number of findings, delete note from note table only if the note_id no longer exists at all in the findings_notes table; not every time a note_id is deleted from the findings_notes table. ''' def ok_delete(): run_delete() cancel_delete() def cancel_delete(): self.focus_set() deleter.destroy() def run_delete(): note_count_per_finding = 0 self.toc.delete(selected) self.note_input.text.delete(1.0, 'end') self.selected_subtopic.config(text='') cur.execute(delete_findings_notes, (deletable, self.finding_id)) conn.commit() if delete_var.get() == 1: cur.execute(select_count_findings_notes_note_id, (deletable, )) linked_notes = cur.fetchone()[0] if linked_notes == 0: cur.execute(delete_note, (deletable, )) conn.commit() cur.execute(select_count_findings_notes_finding_id, (self.finding_id, )) note_count_per_finding = cur.fetchone()[0] cur.close() conn.close() self.toc.selection_clear() if note_count_per_finding == 0: self.pressed.config(text=' ') self.refresh() selected = self.toc.curselection() subtopic = self.toc.get(selected) if subtopic is None: return conn = sqlite3.connect(self.current_file) conn.execute('PRAGMA foreign_keys = 1') cur = conn.cursor() cur.execute(select_note_id, (subtopic, )) deletable = cur.fetchone() if deletable is None: return elif deletable is not None: deletable = deletable[0] delete_var = tk.IntVar() deleter = Toplevel(self) deleter.title('Delete Note Dialog') instrux = LabelH3( deleter, text='Any note can be linked to any number of entities.') radio1 = Radiobutton(deleter, text='Delete this instance of this note.', value=0, variable=delete_var) radio2 = Radiobutton(deleter, text='Delete all instances of this note.', value=1, variable=delete_var) instrux.grid(column=0, row=0, columnspan=2, padx=24, pady=24) radio1.grid(column=0, row=1) radio2.grid(column=1, row=1) buttonbox = Frame(deleter) buttonbox.grid(column=1, row=2, sticky='e') b1 = Button(buttonbox, text='OK', command=ok_delete) b2 = Button(buttonbox, text='Cancel', command=cancel_delete) b1.grid(column=0, row=0) b2.grid(column=1, row=0)