def __init__(self, properties: LabelFrame) -> None: self.frame = Frame(properties) Label(self.frame, text='X').grid(column=0, row=0, sticky='E', pady=App.PADDING) self.position_x = StringVar(self.frame) self.position_x.set(Hole.DEFAULT_POSITION) Spinbox(self.frame, to=App.MAX_SHEET_WIDTH, textvariable=self.position_x, width=App.SPINBOX_WIDTH).grid(column=1, row=0, sticky='W') Label(self.frame, text='Y').grid(column=0, row=1, sticky='E', pady=App.PADDING) self.position_y = StringVar(self.frame) self.position_y.set(Hole.DEFAULT_POSITION) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.position_y, width=App.SPINBOX_WIDTH).grid(column=1, row=1, sticky='W') Label(self.frame, text='Diameter').grid(column=0, row=2, sticky='E', pady=App.PADDING) self.diameter = StringVar(self.frame) self.diameter.set(Hole.DEFAULT_DIAMETER) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.diameter, width=App.SPINBOX_WIDTH).grid(column=1, row=2, sticky='W')
def __init__(self, properties: LabelFrame) -> None: self.marks = {} self.data = [] self.frame = Frame(properties) Label(self.frame, text='Column').grid(column=0, row=0, sticky='E', pady=App.PADDING) self.column = StringVar(self.frame) self.column.set(1) Spinbox(self.frame, from_=1, to=Field.MAX_COLUMN, textvariable=self.column, width=App.SPINBOX_WIDTH).grid(column=1, row=0, sticky='WE') Label(self.frame, text='Start row').grid(column=0, row=1, sticky='E', pady=App.PADDING) self.start_row = StringVar(self.frame) self.start_row.set(1) Spinbox(self.frame, from_=1, to=Field.MAX_ROW, textvariable=self.start_row, width=App.SPINBOX_WIDTH).grid(column=1, row=1, sticky='WE') Label(self.frame, text='End row').grid(column=0, row=2, sticky='E', pady=App.PADDING) self.end_row = StringVar(self.frame) self.end_row.set(0) Spinbox(self.frame, to=Field.MAX_ROW, textvariable=self.end_row, width=App.SPINBOX_WIDTH).grid(column=1, row=2, sticky='WE') Label(self.frame, text='(0 = No limit)').grid(column=2, row=2, columnspan=2, sticky='W') Label(self.frame, text='Source').grid(column=0, row=3, sticky='E', pady=App.PADDING) self.path = StringVar(self.frame) Entry(self.frame, textvariable=self.path).grid(column=1, row=3, columnspan=3, sticky='WE') Button(self.frame, text='Select', command=self.select, width=5).grid(column=4, row=3, sticky='W') Button(self.frame, text='Read', command=self.read).grid(column=1, row=4, sticky='WE') Label(self.frame, text='Values').grid(column=2, row=4, sticky='E') self.values_amount = IntVar(self.frame) self.values_amount.set(0) Label(self.frame, textvariable=self.values_amount).grid(column=3, row=4, sticky='W')
def __init__(self, app): self.time_label = Label(app.root, textvariable=app.time, anchor=CENTER, foreground='black', background='lightgray', font=('Helvetica', 60)) self.time_label.pack(fill=BOTH, expand=True) validate_command = (app.root.register(self.check), '%P') self.entry = Spinbox(app.root, from_=1, to=MAX_COUNT, textvariable=app.count_start, validate='all', validatecommand=validate_command) self.entry.pack(fill=X) self.entry.focus() buttons_frame = Frame(app.root) buttons_frame.pack(fill=X) self.start_button = Button(buttons_frame, text='Start', command=app.start_timer) self.stop_button = Button(buttons_frame, text='Stop', state=DISABLED, command=app.stop_timer) self.start_button.pack(side=LEFT, fill=X, expand=True) self.stop_button.pack(side=RIGHT, fill=X, expand=True)
def __init__(self, c: ttk.Spinbox, p: param) -> None: super().__init__(p) self.c: ttk.Spinbox = c self.c["state"] = 'readonly' c.configure(command=self.onSelectionChanged) return
def __init__(self, properties: LabelFrame) -> None: self.frame = Frame(properties) Label(self.frame, text='X').grid(column=0, row=0, sticky='E', pady=App.PADDING) self.position_x = StringVar(self.frame) self.position_x.set(QR.DEFAULT_X) Spinbox(self.frame, to=App.MAX_SHEET_WIDTH, textvariable=self.position_x, width=App.SPINBOX_WIDTH).grid(column=1, row=0, sticky='W') Label(self.frame, text='Y').grid(column=0, row=1, sticky='E', pady=App.PADDING) self.position_y = StringVar(self.frame) self.position_y.set(QR.DEFAULT_Y) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.position_y, width=App.SPINBOX_WIDTH).grid(column=1, row=1, sticky='W') Label(self.frame, text='Size').grid(column=0, row=2, sticky='E', pady=App.PADDING) self.size = StringVar(self.frame) self.size.set(QR.DEFAULT_SIZE) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.size, width=App.SPINBOX_WIDTH).grid(column=1, row=2, sticky='W') Label(self.frame, text='Inverse').grid(column=0, row=3, sticky='E', pady=App.PADDING) self.inverse = BooleanVar(self.frame) self.inverse.set(QR.DEFAULT_INVERSE) Checkbutton(self.frame, variable=self.inverse).grid(column=1, row=3, sticky='W') Label(self.frame, text='Padding').grid(column=0, row=4, sticky='E', pady=App.PADDING) self.padding = StringVar(self.frame) self.padding.set(QR.DEFAULT_PADDING) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.padding, width=App.SPINBOX_WIDTH).grid(column=1, row=4, sticky='W')
def _criar_spinbox(self): ''' Criar Widget spinbox. ''' self._spinbox = Spinbox(self, from_=self.MINIMO, to=self.MAXIMO, font=('Arial', 14, 'normal'), width=10) self._spinbox['command'] = lambda: \ self.set_atual(self._spinbox.get(), widget=self._spinbox) self._spinbox.bind('<Return>', lambda e: \ self.set_atual(self._spinbox.get())) self._spinbox.pack(side='left', anchor='center')
def _create_spin(self, param_def) -> Tuple[Callable, Callable, Spinbox]: def get(): value = var.get() if p_types == 'float': value = float(value) elif p_types == 'int': value = int(value) else: pass return value def set(value): wd.set(value) return p_type = param_def.get('type') p_name = param_def.get('name') p_types = param_def.get('p_types') p_possible_values = param_def.get('p_values') p_default_value = param_def.get('default') p_values_tuple = parse_possible_values_list_or_range(p_possible_values) from_ = p_values_tuple[0] to = p_values_tuple[1] resolution = p_values_tuple[2] var = get_var_by_type(p_types) var.set(p_default_value) wd = Spinbox(self, name=p_name, from_=from_, to=to, textvariable=var, wrap=True, command=get) return get, set, wd
def nacti_cislo(otazka='Zadej číslo'): """Zeptá se uživatele na otázku a vrátí odpověď jako celé číslo.""" root = Tk() root.title(otazka) entry = Spinbox(root, from_=0, to=100) entry.set('0') entry.pack(side=LEFT) # Předbíháme: vnořená funkce může přistupovat # k proměnným "entry" a "root", které jsou # lokální pro "vnější" funkci (nacti_cislo) def ok_pressed(): text = entry.get() try: value = int(text) except ValueError: entry.set('sem zadej číslo!') else: root.quit() button = Button(root, text="OK", command=ok_pressed) button.pack(side=RIGHT) root.mainloop() value = int(entry.get()) root.destroy() return value
def __init__(self, properties: LabelFrame) -> None: self.frame = Frame(properties) Label(self.frame, text='X').grid(column=0, row=0, sticky='E', pady=App.PADDING) self.position_x = StringVar(self.frame) self.position_x.set(App.DEFAULT_SIGN_WIDTH / 2) Spinbox(self.frame, to=App.MAX_SHEET_WIDTH, textvariable=self.position_x, width=App.SPINBOX_WIDTH).grid(column=1, row=0, sticky='W') Label(self.frame, text='Y').grid(column=0, row=1, sticky='E', pady=App.PADDING) self.position_y = StringVar(self.frame) self.position_y.set(App.DEFAULT_SIGN_HEIGHT / 2) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.position_y, width=App.SPINBOX_WIDTH).grid(column=1, row=1, sticky='W') Label(self.frame, text='Font size').grid(column=0, row=2, sticky='E', pady=App.PADDING) self.size = StringVar(self.frame) self.size.set(App.DEFAULT_SIGN_HEIGHT / 2) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.size, width=App.SPINBOX_WIDTH).grid(column=1, row=2, sticky='W') Label(self.frame, text='Align').grid(column=0, row=3, sticky='E', pady=App.PADDING) self.align = StringVar(self.frame) OptionMenu(self.frame, self.align, Text.ALIGN_OPTIONS[4], *Text.ALIGN_OPTIONS).grid(column=1, row=3, sticky='W')
class TimerUi: """View""" def __init__(self, app): self.time_label = Label(app.root, textvariable=app.time, anchor=CENTER, foreground='black', background='lightgray', font=('Helvetica', 60)) self.time_label.pack(fill=BOTH, expand=True) validate_command = (app.root.register(self.check), '%P') self.entry = Spinbox(app.root, from_=1, to=MAX_COUNT, textvariable=app.count_start, validate='all', validatecommand=validate_command) self.entry.pack(fill=X) self.entry.focus() buttons_frame = Frame(app.root) buttons_frame.pack(fill=X) self.start_button = Button(buttons_frame, text='Start', command=app.start_timer) self.stop_button = Button(buttons_frame, text='Stop', state=DISABLED, command=app.stop_timer) self.start_button.pack(side=LEFT, fill=X, expand=True) self.stop_button.pack(side=RIGHT, fill=X, expand=True) def check(self, new_val): return new_val.isdigit() and 1 <= int(new_val) <= MAX_COUNT def state_started(self): self.stop_button.config(state=NORMAL) self.start_button.config(state=DISABLED) self.entry.config(state=DISABLED) self.time_label.config(foreground='white', background='red') def state_stopped(self): self.stop_button.config(state=DISABLED) self.start_button.config(state=NORMAL) self.entry.config(state=NORMAL) self.time_label.config(foreground='black', background='lightgray')
def __init__(self, root): """ Constructor of Config :param root: root Tk object :type root: Tk """ super().__init__(root) self.root = root self.geometry("350x300") self.geometry("+%d+%d" % (root.winfo_x()+50, root.winfo_y()+25)) self.minsize(350, 300) self.wm_title("Tramet - Settings") self.conf = Config.load_file() def save(event=None): root.buffer_size = buf.get() * 1024 * 1024 self.conf["buffer_size"] = buf.get() * 1024 * 1024 self.destroy() buf = IntVar() buf.set(self.conf.get("buffer_size", 10*1024*1024) // 1024 // 1024) Label(self, text="File Buffer size (MB): ").grid(row=0, column=0, padx=(10, 0), pady=(10, 20)) s = Spinbox(self, from_=1, to=999, textvariable=buf) s.grid(row=0, column=1) f = Frame(self) f.grid(row=1, column=0, columnspan=2, sticky=E) ok = Button(f, text="OK", command=save) ok.pack(side=RIGHT, padx=10, pady=10) cancel = Button(f, text="Cancel", command=self.destroy) cancel.pack(side=RIGHT, padx=10, pady=10)
def __init__(self,app): info( ' - initializing module: Spectrogram' ) self.app = app self.frame = Frame(self.app.BOTTOM) self.frame.grid( row=0, column=1, pady=(self.app.pady*2,self.app.pady/2) ) self.axis_frame = Frame(self.app.BOTTOM) self.axis_frame.grid( row=0, column=0, sticky='e', pady=(self.app.pady*2,self.app.pady/2) ) self.canvas_width = self.app.TextGrid.canvas_width self.canvas_height = 106 self.canvas = Canvas(self.frame, width=self.canvas_width, height=self.canvas_height, background='gray', highlightthickness=0) self.spectrogram = None self.spec_freq_max = DoubleVar() self.wl = DoubleVar() self.dyn_range = DoubleVar() self.clicktime = -1 self.specClick = False self.oldSelected = None self.doDefaults() #make spinboxes & buttons for spectrogram specs self.spinwin = Frame(self.axis_frame) #spinboxes axis_ceil_box = Spinbox(self.spinwin, textvariable=self.spec_freq_max, command=self.drawSpectrogram, width=7, increment=100, from_=0, to_=100000) axis_ceil_box.bind('<Return>',self.drawSpectrogram) axis_ceil_box.bind('<Escape>',lambda ev: self.spinwin.focus()) wl_box = Spinbox(self.spinwin, textvariable=self.wl, command=self.drawSpectrogram, width=7, increment=0.0005, from_=0, to_=1) wl_box.bind('<Return>',self.drawSpectrogram) wl_box.bind('<Escape>',lambda ev: self.spinwin.focus()) dyn_range_box = Spinbox(self.spinwin, textvariable=self.dyn_range, command=self.drawSpectrogram, width=7, increment=10, from_=0, to_=10000) dyn_range_box.bind('<Return>',self.drawSpectrogram) dyn_range_box.bind('<Escape>',lambda ev: self.spinwin.focus()) #buttons default_btn = Button(self.spinwin, text='Standards', command=self.restoreDefaults, takefocus=0) apply_btn = Button(self.spinwin, text='Apply', command=self.drawSpectrogram, takefocus=0, width=6) # self.axis_frame.create_window(wwidth,self.canvas_height, window=self.spinwin, anchor='ne') #grid spinboxes & buttons on subframe axis_ceil_box.grid(row=0, columnspan=2, sticky='ne') wl_box.grid(row=1, columnspan=2, sticky='ne') dyn_range_box.grid(row=2, columnspan=2, sticky='ne') default_btn.grid(row=3) apply_btn.grid(row=3, column=1) self.grid() self.canvas.bind('<Button-1>', self.jumpToFrame)
def build(self): """widget construction""" fr4 = LabelFrame(self.fr0, text='yiq') fr4.grid(column=2, row=0) vcmdyiq = root.register(yiq_okay) self.cans = [] sboxes = [] comps = ['y', 'i', 'q'] names = ['luma', 'i hue', 'q hue'] tkvars = [self.yvar, self.ivar, self.qvar] froms = [0, -100, -100] ticks = [10, 20, 20] for ix, comp in enumerate(comps): Label(fr4, text=names[ix]).grid(row=3 * ix, column=0) Label(fr4, height=1).grid(row=2 + 3 * ix, column=2) self.cans.append( Canvas(fr4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0)) self.cans[ix].grid(row=3 * ix, column=1) TtkScale(fr4, from_=froms[ix], to=100, variable=tkvars[ix], orient='horizontal', length=self.scale_l, command=self.yiqhandle, tickinterval=ticks[ix]).grid(row=1 + 3 * ix, column=1, sticky='nw') sboxes.append( Spinbox(fr4, from_=froms[ix], to=100, textvariable=tkvars[ix], validatecommand=(vcmdyiq, '%d', '%P', '%S', froms[ix], 100), validate='key', command=self.yiqhandle, width=5, increment=1)) sboxes[ix].grid(row=1 + 3 * ix, column=2, sticky='nw') sboxes[ix].bind('<KeyRelease>', self.checksyiq) # assume initial setting 0,100,100 hsv to_colour = yiq_to_rgb(*(30, 100.0, 40.56)) # print(self.canvas_w) draw_gradient(self.cans[0], yiq_to_rgb(0.0, 100.0, 40.56), yiq_to_rgb(100, 100, 40.56), width=self.canvas_w) draw_gradient(self.cans[1], yiq_to_rgb(30, -100.0, 40.56), to_colour, width=self.canvas_w) draw_gradient(self.cans[2], yiq_to_rgb(30, 100, -100), yiq_to_rgb(30, 100, 100), width=self.canvas_w) self.can_yiq = can_yiq = Canvas(fr4, width=self.space, height=self.space) can_yiq.grid(column=1, row=9, pady=25, sticky='n') self.yiqGamut = PhotoImage(file='../../figures/colour_space.png') can_yiq.create_image(0, 0, anchor='nw', image=self.yiqGamut) self.ring = circle(can_yiq, 300.0, 210.84, self.ring_radius, width=self.ring_width, activeoutline='#555555', tags='ring') # 240, 181 can_yiq.bind('<Button-1>', self.move_ring) can_yiq.tag_bind('ring', '<B1-Motion>', self.move_ring)
class Page1(Frame): def __init__(self, master): Frame.__init__(self, master) self.style = Style() self.time_frame = LabelFrame(self, text='Time Setting') self.hour_label = Label(self.time_frame, text='Hours') self.hour_box = Spinbox(self.time_frame, from_=0, to=24) self.minute_label = Label(self.time_frame, text='Minutes') self.minute_box = Spinbox(self.time_frame, from_=0, to=60) self.second_label = Label(self.time_frame, text='Seconds') self.second_box = Spinbox(self.time_frame, from_=0, to=60) self.break_label = Label(self.time_frame, text='Time During Sessions') self.break_var = IntVar() self.break_var.set(4) self.break_radio_button_3 = Radiobutton(self.time_frame, text='3 min', variable=self.break_var, value=3) self.break_radio_button_4 = Radiobutton(self.time_frame, text='4 min', variable=self.break_var, value=4) self.break_radio_button_5 = Radiobutton(self.time_frame, text='5 min', variable=self.break_var, value=5) self.break_radio_button_6 = Radiobutton(self.time_frame, text='6 min', variable=self.break_var, value=6) self.break_radio_button_7 = Radiobutton(self.time_frame, text='7 min', variable=self.break_var, value=7) self.name_label = Label(self.time_frame, text='Task Name') self.name_entry = Entry(self.time_frame) self.reminder_label = Label(self.time_frame, text='Reminder') self.reminder_entry = Entry(self.time_frame) self.generate_button = Button(self, text='Generate Task', command=self.create_task) self.save_button = Button(self, text='Save Configuration', command=self.save_config) self.load_button = Button(self, text='Load Configuration', command=self.load_config) self.clear_button = Button(self, text='Clear', command=self.clear) # GRIDDING OPERATIONS self.hour_label.grid(row=1, column=0) self.hour_box.grid(row=1, column=1) self.minute_label.grid(row=1, column=2) self.minute_box.grid(row=1, column=3) self.second_label.grid(row=1, column=4) self.second_box.grid(row=1, column=5) self.break_label.grid(row=2, column=0) self.break_radio_button_3.grid(row=2, column=1) self.break_radio_button_4.grid(row=2, column=2) self.break_radio_button_5.grid(row=2, column=3) self.break_radio_button_6.grid(row=2, column=4) self.break_radio_button_7.grid(row=2, column=5) self.name_label.grid(row=3, column=0) self.name_entry.grid(row=3, column=1, columnspan=5, sticky='ew') self.reminder_label.grid(row=4, column=0) self.reminder_entry.grid(row=4, column=1, columnspan=5, sticky='ew') self.generate_button.grid(row=1, column=0, sticky='snew') self.save_button.grid(row=2, column=0, sticky='snew') self.load_button.grid(row=3, column=0, sticky='snew') self.clear_button.grid(row=4, column=0, sticky='snew') self.time_frame.grid(row=0, column=0) self.grid(row=0, column=0) def create_task(self): # Task signature: (task_name, task_duration, break_duration, task_reminder=None) hours = self.hour_box.get() minutes = self.minute_box.get() seconds = self.second_box.get() break_time = self.break_var.get() if hours and seconds and minutes: total_time = int(hours) * 3600 + int(minutes) * 60 + int(seconds) return Task(self.name_entry.get(), total_time, break_time) elif hours == 's': return Task('sample task', 5, 3 / 60) def save_config(self): with open('config.pickle', 'wb+') as config: pickle.dump(self.create_task(), config) def load_config(self): with open('config.pickle', 'rb') as config: unpickled_task = pickle.load(config) Task.tasks.append(unpickled_task) def clear(self): self.name_entry.delete(0, 'end') self.reminder_entry.delete(0, 'end') self.hour_box.set('') self.minute_box.set('') self.second_box.set('')
def __init__(self, master): Frame.__init__(self, master) self.style = Style() self.time_frame = LabelFrame(self, text='Time Setting') self.hour_label = Label(self.time_frame, text='Hours') self.hour_box = Spinbox(self.time_frame, from_=0, to=24) self.minute_label = Label(self.time_frame, text='Minutes') self.minute_box = Spinbox(self.time_frame, from_=0, to=60) self.second_label = Label(self.time_frame, text='Seconds') self.second_box = Spinbox(self.time_frame, from_=0, to=60) self.break_label = Label(self.time_frame, text='Time During Sessions') self.break_var = IntVar() self.break_var.set(4) self.break_radio_button_3 = Radiobutton(self.time_frame, text='3 min', variable=self.break_var, value=3) self.break_radio_button_4 = Radiobutton(self.time_frame, text='4 min', variable=self.break_var, value=4) self.break_radio_button_5 = Radiobutton(self.time_frame, text='5 min', variable=self.break_var, value=5) self.break_radio_button_6 = Radiobutton(self.time_frame, text='6 min', variable=self.break_var, value=6) self.break_radio_button_7 = Radiobutton(self.time_frame, text='7 min', variable=self.break_var, value=7) self.name_label = Label(self.time_frame, text='Task Name') self.name_entry = Entry(self.time_frame) self.reminder_label = Label(self.time_frame, text='Reminder') self.reminder_entry = Entry(self.time_frame) self.generate_button = Button(self, text='Generate Task', command=self.create_task) self.save_button = Button(self, text='Save Configuration', command=self.save_config) self.load_button = Button(self, text='Load Configuration', command=self.load_config) self.clear_button = Button(self, text='Clear', command=self.clear) # GRIDDING OPERATIONS self.hour_label.grid(row=1, column=0) self.hour_box.grid(row=1, column=1) self.minute_label.grid(row=1, column=2) self.minute_box.grid(row=1, column=3) self.second_label.grid(row=1, column=4) self.second_box.grid(row=1, column=5) self.break_label.grid(row=2, column=0) self.break_radio_button_3.grid(row=2, column=1) self.break_radio_button_4.grid(row=2, column=2) self.break_radio_button_5.grid(row=2, column=3) self.break_radio_button_6.grid(row=2, column=4) self.break_radio_button_7.grid(row=2, column=5) self.name_label.grid(row=3, column=0) self.name_entry.grid(row=3, column=1, columnspan=5, sticky='ew') self.reminder_label.grid(row=4, column=0) self.reminder_entry.grid(row=4, column=1, columnspan=5, sticky='ew') self.generate_button.grid(row=1, column=0, sticky='snew') self.save_button.grid(row=2, column=0, sticky='snew') self.load_button.grid(row=3, column=0, sticky='snew') self.clear_button.grid(row=4, column=0, sticky='snew') self.time_frame.grid(row=0, column=0) self.grid(row=0, column=0)
if_characteristics_text.grid(column=0, row=4, sticky=W, padx=10, pady=10) if_characteristics.grid(column=1, row=4, sticky=W, padx=10, pady=10) # Отобразить лого (Sale New) if_create_logo_text = Label(window, text='Отображать SALE NEW') if_create_logo = Combobox(window) if_create_logo['value'] = ("Отобразить", "Не отображать") if_create_logo.current(1) if_create_logo_text.grid(column=0, row=5, sticky=W, padx=10, pady=10) if_create_logo.grid(column=1, row=5, sticky=W, padx=10, pady=10) # Надбавка var_r = IntVar() var_r.set(0) if_price_resize_text = Label(window, text="Надбавка") if_price_resize = Spinbox(window, from_=0, to=100, width=5, textvariable=var_r) if_price_resize_text.grid(column=0, row=6, sticky=W, padx=10, pady=10) if_price_resize.grid(column=1, row=6, sticky=W, padx=10, pady=10) # Множитель курса price_resize_text = Label(window, text="Множитель курса") price_resize = Spinbox(window, from_=0, to=100, format="%10.2f", increment=0.01, width=7) price_resize.set('{:10.2f}'.format(1)) price_resize_text.grid(column=0, row=7, sticky=W, padx=10, pady=10) price_resize.grid(column=1, row=7, sticky=W, padx=10, pady=10)
minus_this2=hr old_data1.append(minus_this) old_data2.append(minus_this1) old_data3.append(minus_this2) minus() def set_timer_ye(): if sec_data.get()==0 and min_data.get()==0 and hr_data.get()==0: messagebox.showinfo('Info','Please Add More Time.') else: messagebox.showinfo('Info','Timer Set Successfully') start_countdown(sec_data.get(),min_data.get(),hr_data.get()) head=Label(root,text='Timer',font=('Courier',30,'bold')) head.place(x=125) sec_label_indict=Label(root,text='Seconds:',font=('Courier',20,'bold')) sec_label_indict.place(x=135+135,y=55) sec_spinbox=Spinbox(root,state='readonly',textvariable=sec_data,from_=0,to=59,font=('Arial Rounded MT bold',20,'bold'),width=5) sec_spinbox.place(x=135+135,y=95) min_label_indict=Label(root,text='Minutes:',font=('Courier',20,'bold')) min_label_indict.place(x=135,y=55) min_spinbox=Spinbox(root,state='readonly',textvariable=min_data,from_=0,to=59,font=('Arial Rounded MT bold',20,'bold'),width=5) min_spinbox.place(x=135,y=95) hr_label_indict=Label(root,text='Hours:',font=('Courier',20,'bold')) hr_label_indict.place(x=1+10,y=55) hr_spinbox=Spinbox(root,state='readonly',textvariable=hr_data,from_=0,to=99,font=('Arial Rounded MT bold',20,'bold'),width=5) hr_spinbox.place(x=1,y=95) set_timer=Button(root,text='Set Timer',command=set_timer_ye,width=15) set_timer.place(x=130,y=135) b1=Button(root,text='Reset',command=reset) b2=Button(root,text='Pause',command=pause_) b3=Button(root,text='Start',command=Start,state='disabled') b4=Button(root,text='Cancel',comman=Cancel)
def build(self): """widget construction Parameters ---------- None Results ------- None """ fr4 = LabelFrame(self.fr0, text='hsv') fr4.grid(column=2, row=0) hl = Label(fr4, text='hue ') hl.grid(column=0, row=0, sticky='s') self.hcan = Canvas(fr4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.hcan.grid(column=1, row=0, sticky='s') hsc = TtkScale(fr4, from_=0, to=360, variable=self.hvar, orient='horizontal', length=self.scale_l, command=self.hhandle, tickinterval=30) hsc.grid(column=1, row=1, sticky='nw') vcmdsb = root.register(sb_okay) hsb = Spinbox(fr4, from_=0, to=360, textvariable=self.hvar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 360), command=self.hhandle, width=5) hsb.grid(column=2, row=1, sticky='nw') hsb.bind('<KeyRelease>', self.checksbh) hel = Label(fr4, height=1) hel.grid(column=2, row=2) sl = Label(fr4, text='sat ') sl.grid(column=0, row=3) self.scan = Canvas(fr4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.scan.grid(column=1, row=3, sticky='s') ssc = TtkScale(fr4, from_=0, to=100, variable=self.svar, orient='horizontal', length=self.scale_l, command=self.shandle, tickinterval=10) ssc.grid(column=1, row=4, sticky='nw') ssb = Spinbox(fr4, from_=0, to=100, textvariable=self.svar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 100), command=self.shandle, width=5) ssb.grid(column=2, row=4, sticky='nw') ssb.bind('<KeyRelease>', self.checksb100) sel = Label(fr4, height=1) sel.grid(column=2, row=5) vl = Label(fr4, text='value') vl.grid(column=0, row=6, sticky='s') self.vcan = Canvas(fr4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.vcan.grid(column=1, row=6, sticky='n') vsc = TtkScale(fr4, from_=0, to=100, variable=self.vvar, orient='horizontal', length=self.scale_l, command=self.vhandle, tickinterval=10) vsc.grid(column=1, row=7, sticky='nw') vsb = Spinbox(fr4, from_=0, to=100, textvariable=self.vvar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 100), command=self.vhandle, width=5) vsb.grid(column=2, row=7, sticky='nw') vsb.bind('<KeyRelease>', self.checksb100) vel = Label(fr4, height=1) vel.grid(column=2, row=8) # assume initial setting 0,100,100 hsv to_colour = hsv_to_rgb(*(0, 100, 100)) hue_gradient(self.hcan, width=self.canvas_w) draw_gradient(self.scan, (255, 255, 255), to_colour, width=self.canvas_w) draw_gradient(self.vcan, (0, 0, 0), to_colour, width=self.canvas_w)
def build(self): """widget construction""" lf1 = LabelFrame(self.fr0, text='rgb') lf1.grid(column=0, row=0, sticky='new') lf1.columnconfigure(1, weight=1) vcmdsb = root.register(sb_okay) self.rgbcans = [] rgbsboxes = [] rgbcomps = ['r', 'g', 'b', 'a'] rgbnames = ['red ', 'green', 'blue ', 'alpha'] rgbvars = [self.rvar, self.gvar, self.bvar, self.avar] rgbhandles = [ self.rgbhandle, self.rgbhandle, self.rgbhandle, self.ahandle ] binds = [self.checksb, self.checksb, self.checksb, self.checksba] for ix, comp in enumerate(rgbcomps): Label(lf1, text=rgbnames[ix]).grid(row=3 * ix, column=0) Label(lf1).grid(row=2 + 3 * ix, column=2) self.rgbcans.append( Canvas(lf1, height=self.canvas_h, width=self.canvas_w, bd=0, highlightthickness=0)) self.rgbcans[ix].grid(row=3 * ix, column=1, sticky='ew', padx=self.sliderlength // 2) self.rgbcans[ix].bind("<Configure>", partial(self.resize, can=self.rgbcans[ix])) TtkScale(lf1, self.scale_l, from_=0, to=255, variable=rgbvars[ix], orient='horizontal', command=rgbhandles[ix], tickinterval=20).grid(row=1 + 3 * ix, column=1, sticky='new') rgbsboxes.append( Spinbox(lf1, from_=0, to=255, textvariable=rgbvars[ix], validate='key', validatecommand=(vcmdsb, '%d', '%P', '%S', 0, 255), command=rgbhandles[ix], width=5)) rgbsboxes[ix].grid(row=1 + 3 * ix, column=2, sticky='nw') rgbsboxes[ix].bind('<KeyRelease>', binds[ix]) lf3 = LabelFrame(self.fr0, text='colour mix') lf3.grid(column=1, row=0, sticky='nw') self.cmcan = cmcan = Canvas(lf3, width=30, height=30, bd=0, highlightthickness=0) cmcan.grid(column=0, row=0, sticky='n', columnspan=2) cmcan.grid_propagate(0) vdraw_gradient(self.cmcan, (255, 0, 0), alpha=255) cml = Label(lf3, text='hash\nvalue') cml.grid(column=0, row=1) vcmd = root.register(is_okay) self.en = en = Entry(lf3, width=8, validate='key', validatecommand=(vcmd, '%i', '%P', '%S'), textvariable=self.evar) en.grid(column=1, row=1) en.bind('<KeyRelease>', self.checkhash) lf5 = LabelFrame(lf3, text='related colours') # style='Width.Tlabelframe' lf5.grid(column=0, row=2, sticky='nw', columnspan=2) self.rcls = [] self.rccans = [] relateds = [0, 20, 40, 60, 80, 100] rtexts = ['0% Y', '20% Y', '40% Y', '60% Y', '80% Y', '100% Y'] for ix, rel in enumerate(relateds): Label(lf5, text=rtexts[ix]).grid(row=1 + 2 * ix, column=0, sticky='n') self.rcls.append(Label(lf5)) self.rcls[ix].grid(row=1 + 2 * ix, column=1, sticky='n') self.rccans.append( Canvas(lf5, width=30, height=30, bd=0, highlightthickness=0)) self.rccans[ix].grid(row=2 * ix, column=0, sticky='n', columnspan=2) self.cccan = Canvas(lf5, width=30, height=30, bd=0, highlightthickness=0) self.cccan.grid(column=0, row=12, sticky='n', columnspan=2) self.ccla = Label(lf5, text="comp'y") self.ccla.grid(column=0, row=13, sticky='n') self.ccl = Label(lf5, text="") self.ccl.grid(column=1, row=13, sticky='n') draw_gradient(self.rgbcans[0], (0, 0, 0), (255, 0, 0), width=self.canvas_w) draw_gradient(self.rgbcans[1], (255, 0, 0), (255, 255, 0), width=self.canvas_w) draw_gradient(self.rgbcans[2], (255, 0, 0), (255, 0, 255), width=self.canvas_w) draw_agradient(self.rgbcans[3], (127, 127, 127), (255, 0, 0), width=self.canvas_w) lf4 = LabelFrame(self.fr0, text='yiq') lf4.grid(column=2, row=0, sticky='ew') lf4.columnconfigure(1, weight=1) vcmdyiq = root.register(yiq_okay) self.cans = [] sboxes = [] comps = ['y', 'i', 'q'] names = ['luma', 'i hue', 'q hue'] tkvars = [self.yvar, self.ivar, self.qvar] handles = [self.yhandle, self.iqhandle, self.iqhandle] froms = [0, -100, -100] ticks = [10, 20, 20] for ix, comp in enumerate(comps): Label(lf4, text=names[ix]).grid(row=3 * ix, column=0) Label(lf4).grid(row=2 + 3 * ix, column=2) self.cans.append( Canvas(lf4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0)) self.cans[ix].grid(row=3 * ix, column=1, sticky='ew', padx=self.sliderlength // 2) self.cans[ix].bind("<Configure>", partial(self.resize_yiq, can=self.cans[ix])) TtkScale(lf4, from_=froms[ix], to=100, variable=tkvars[ix], orient='horizontal', length=self.scale_l, command=handles[ix], tickinterval=ticks[ix]).grid(row=1 + 3 * ix, column=1, sticky='new') sboxes.append( Spinbox(lf4, from_=froms[ix], to=100, textvariable=tkvars[ix], validatecommand=(vcmdyiq, '%d', '%P', '%S', froms[ix], 100), validate='key', command=handles[ix], width=5, increment=1)) sboxes[ix].grid(row=1 + 3 * ix, column=2, sticky='nw') sboxes[ix].bind('<KeyRelease>', self.checksyiq) # assume initial setting 30,100.0,40.56 yiq to_colour = yiq_to_rgb(*(30, 100.0, 40.56)) # print(self.canvas_w) draw_gradient(self.cans[0], yiq_to_rgb(0.0, 100.0, 40.56), yiq_to_rgb(100, 100, 40.56), width=self.canvas_w) draw_gradient(self.cans[1], yiq_to_rgb(30, -100.0, 40.56), to_colour, width=self.canvas_w) draw_gradient(self.cans[2], yiq_to_rgb(30, 100, -100), yiq_to_rgb(30, 100, 100), width=self.canvas_w) self.related(30, 100.0, 40.56) self.canYiq = canYiq = Canvas(lf4, width=self.space, height=self.space) canYiq.grid(column=0, row=9, columnspan=3, pady=25, sticky='n') self.yiqGamut = PhotoImage(file='../../figures/colour_space.png') canYiq.create_image(0, 0, anchor='nw', image=self.yiqGamut) self.ring = circle(canYiq, 300.0, 210.84, self.ring_radius, width=self.ring_width, activeoutline='#555555', tags='ring') canYiq.bind('<Button-1>', self.move_ring) canYiq.tag_bind('ring', '<B1-Motion>', self.move_ring)
class Window: def __init__(self, workstation: WorkstationSettings, wallpaper: Image.Image): self._root = Tk() self._root.title("wallcrop") self._root.minsize(*_MINSIZE) self._show_monitor_labels = BooleanVar(self._root, value=False) self._show_unselected_area = BooleanVar(self._root, value=True) frame = Frame(self._root, padding=_PADDING) frame.grid(column=0, row=0, sticky="n w s e") self._root.columnconfigure(0, weight=1) # type: ignore self._root.rowconfigure(0, weight=1) # type: ignore frame_top = Frame(frame) frame_top.grid(column=0, row=0, sticky="n w s e") frame_bot = Frame(frame) frame_bot.grid(column=0, row=2, sticky="n w s e") self._selection = Selection(aspect_ratio=np.divide(*wallpaper.size)) self._selection.register_onchange_handler(self._reset_spinbox_values) self._selection_widget = SelectionWidget( parent=frame, workstation=workstation, wallpaper=wallpaper, selection=self._selection, ) self._selection_widget.set_show_monitor_labels( self._show_monitor_labels.get()) self._selection_widget.set_show_unselected_area( self._show_unselected_area.get()) self._selection_widget.grid(column=0, row=1, sticky="n w s e", pady=_PADDING) frame.columnconfigure(0, weight=1) # type: ignore frame.rowconfigure(1, weight=1) # type: ignore label_wallpaper = Label(frame_top, text=workstation.name) label_wallpaper.grid(column=0, row=0) # Center columns 1-6 on frame_bot. frame_bot.columnconfigure(0, weight=1) # type: ignore frame_bot.columnconfigure(7, weight=1) # type: ignore # TODO: Figure out how to not have spinbox show zero when using # increment/decrement buttons. label_selection_position_x = Label(frame_bot, text="X: ") label_selection_position_x.grid(column=1, row=0) self._spinbox_selection_position_x = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_position_x.grid(column=2, row=0) label_selection_position_y = Label(frame_bot, text=" Y: ") label_selection_position_y.grid(column=3, row=0) self._spinbox_selection_position_y = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_position_y.grid(column=4, row=0) label_selection_zoom = Label(frame_bot, text=" Zoom: ") label_selection_zoom.grid(column=5, row=0) self._spinbox_selection_zoom = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_zoom.grid(column=6, row=0) self._bind_actions() self._set_up_menubar() self._reset_spinbox_values() def _bind_actions(self) -> None: self._root.bind("<Escape>", lambda _event: self.quit()) self._root.bind("<q>", lambda _event: self.quit()) self._root.bind( "<m>", lambda _event: self._show_monitor_labels.set(not ( self._show_monitor_labels.get())), ) self._root.bind( "<n>", lambda _event: self._show_unselected_area.set(not ( self._show_unselected_area.get())), ) self._root.bind("<i>", lambda _event: self._selection.zoom_increase()) self._root.bind( "<I>", lambda _event: self._selection.zoom_increase(precise=True)) self._root.bind("<o>", lambda _event: self._selection.zoom_decrease()) self._root.bind( "<O>", lambda _event: self._selection.zoom_decrease(precise=True)) self._root.bind("<h>", lambda _event: self._selection.move_left()) self._root.bind("<H>", lambda _event: self._selection.move_left(precise=True)) self._root.bind("<Left>", lambda _event: self._selection.move_left()) self._root.bind("<Shift-Left>", lambda _event: self._selection.move_left(precise=True)) self._root.bind("<l>", lambda _event: self._selection.move_right()) self._root.bind( "<L>", lambda _event: self._selection.move_right(precise=True)) self._root.bind("<Right>", lambda _event: self._selection.move_right()) self._root.bind( "<Shift-Right>", lambda _event: self._selection.move_right(precise=True)) self._root.bind("<k>", lambda _event: self._selection.move_up()) self._root.bind("<K>", lambda _event: self._selection.move_up(precise=True)) self._root.bind("<Up>", lambda _event: self._selection.move_up()) self._root.bind("<Shift-Up>", lambda _event: self._selection.move_up(precise=True)) self._root.bind("<j>", lambda _event: self._selection.move_down()) self._root.bind("<J>", lambda _event: self._selection.move_down(precise=True)) self._root.bind("<Down>", lambda _event: self._selection.move_down()) self._root.bind("<Shift-Down>", lambda _event: self._selection.move_down(precise=True)) self._spinbox_selection_position_x.configure( validatecommand=lambda *_args: self._set_selection_position_x()) self._spinbox_selection_position_x.bind( "<Return>", lambda _event: self._set_selection_position_x() # type: ignore ) self._spinbox_selection_position_x.bind( "<<Decrement>>", lambda _event: self._selection.move_left()) self._spinbox_selection_position_x.bind( "<<Increment>>", lambda _event: self._selection.move_right()) self._spinbox_selection_position_y.configure( validatecommand=lambda *_args: self._set_selection_position_y()) self._spinbox_selection_position_y.bind( "<Return>", lambda _event: self._set_selection_position_y() # type: ignore ) self._spinbox_selection_position_y.bind( "<<Decrement>>", lambda _event: self._selection.move_up()) self._spinbox_selection_position_y.bind( "<<Increment>>", lambda _event: self._selection.move_down()) self._spinbox_selection_zoom.configure( validatecommand=lambda *_args: self._set_selection_zoom()) self._spinbox_selection_zoom.bind( "<Return>", lambda _event: self._set_selection_zoom() # type: ignore ) self._spinbox_selection_zoom.bind( "<<Decrement>>", lambda _event: self._selection.zoom_decrease()) self._spinbox_selection_zoom.bind( "<<Increment>>", lambda _event: self._selection.zoom_increase()) self._show_monitor_labels.trace_add( "write", lambda *_args: self._selection_widget.set_show_monitor_labels( self._show_monitor_labels.get()), ) self._show_unselected_area.trace_add( "write", lambda *_args: self._selection_widget.set_show_unselected_area( self._show_unselected_area.get()), ) def _set_up_menubar(self) -> None: # TODO: check that this look good on macOS, as described here: # https://tkdocs.com/tutorial/menus.html#platformmenus self._root.option_add("*tearOff", False) menu = Menu(self._root) menu_file = Menu(menu) menu_file.add_command( # type: ignore label="Quit", underline=0, accelerator="Q, Escape", command=self.quit) menu.add_cascade(menu=menu_file, label="File", underline=0) # type: ignore menu_edit = Menu(menu) menu_edit.add_command( # type: ignore label="Move Left", underline=5, accelerator="H, Left", command=self._selection.move_left, ) menu_edit.add_command( # type: ignore label="Move Right", underline=5, accelerator="L, Right", command=self._selection.move_right, ) menu_edit.add_command( # type: ignore label="Move Up", underline=5, accelerator="K, Up", command=self._selection.move_up, ) menu_edit.add_command( # type: ignore label="Move Down", underline=5, accelerator="J, Down", command=self._selection.move_down, ) menu_edit.add_separator() # type: ignore menu_edit.add_command( # type: ignore label="Increase Zoom", underline=0, accelerator="I", command=self._selection.zoom_increase, ) menu_edit.add_command( # type: ignore label="Decrease Zoom", underline=10, accelerator="O", command=self._selection.zoom_decrease, ) menu.add_cascade(menu=menu_edit, label="Edit", underline=0) # type: ignore menu_view = Menu(menu) menu_view.add_checkbutton( # type: ignore label="Label Monitors", variable=self._show_monitor_labels, underline=6, accelerator="M", ) menu_view.add_checkbutton( # type: ignore label="Show Unselected", variable=self._show_unselected_area, underline=6, accelerator="N", ) menu.add_cascade(menu=menu_view, label="View", underline=0) # type: ignore menu_help = Menu(menu, name="help") menu_help.add_command( # type: ignore label="About Wallcrop", underline=0, command=lambda: messagebox.showinfo( parent=self._root, title="About Wallcrop", message=f"Wallcrop {wallcrop.__version__}", detail=("Copyright 2021 Lukas Schmelzeisen.\n" "Licensed under the Apache License, Version 2.0.\n" "https://github.com/lschmelzeisen/wallcrop/"), ), ) menu.add_cascade(menu=menu_help, label="Help", underline=3) # type: ignore self._root["menu"] = menu def mainloop(self) -> None: self._root.mainloop() def quit(self) -> None: self._root.destroy() def _set_selection_position_x(self) -> bool: try: value = float( self._spinbox_selection_position_x.get()) # type: ignore except ValueError: self._spinbox_selection_position_x.set(self._selection.position[0]) return False self._selection.set_position( np.array((value, self._selection.position[1]))) return True def _set_selection_position_y(self) -> bool: try: value = float( self._spinbox_selection_position_y.get()) # type: ignore except ValueError: self._spinbox_selection_position_y.set(self._selection.position[1]) return False self._selection.set_position( np.array((self._selection.position[0], value))) return True def _set_selection_zoom(self) -> bool: try: value = float(self._spinbox_selection_zoom.get()) # type: ignore except ValueError: self._spinbox_selection_zoom.set(self._selection.zoom) return False self._selection.set_zoom(value) return True def _reset_spinbox_values(self) -> None: self._spinbox_selection_position_x.set( f"{self._selection.position[0]:.3f}") self._spinbox_selection_position_y.set( f"{self._selection.position[1]:.3f}") self._spinbox_selection_zoom.set(f"{self._selection.zoom:.3f}")
def __init__(self, workstation: WorkstationSettings, wallpaper: Image.Image): self._root = Tk() self._root.title("wallcrop") self._root.minsize(*_MINSIZE) self._show_monitor_labels = BooleanVar(self._root, value=False) self._show_unselected_area = BooleanVar(self._root, value=True) frame = Frame(self._root, padding=_PADDING) frame.grid(column=0, row=0, sticky="n w s e") self._root.columnconfigure(0, weight=1) # type: ignore self._root.rowconfigure(0, weight=1) # type: ignore frame_top = Frame(frame) frame_top.grid(column=0, row=0, sticky="n w s e") frame_bot = Frame(frame) frame_bot.grid(column=0, row=2, sticky="n w s e") self._selection = Selection(aspect_ratio=np.divide(*wallpaper.size)) self._selection.register_onchange_handler(self._reset_spinbox_values) self._selection_widget = SelectionWidget( parent=frame, workstation=workstation, wallpaper=wallpaper, selection=self._selection, ) self._selection_widget.set_show_monitor_labels( self._show_monitor_labels.get()) self._selection_widget.set_show_unselected_area( self._show_unselected_area.get()) self._selection_widget.grid(column=0, row=1, sticky="n w s e", pady=_PADDING) frame.columnconfigure(0, weight=1) # type: ignore frame.rowconfigure(1, weight=1) # type: ignore label_wallpaper = Label(frame_top, text=workstation.name) label_wallpaper.grid(column=0, row=0) # Center columns 1-6 on frame_bot. frame_bot.columnconfigure(0, weight=1) # type: ignore frame_bot.columnconfigure(7, weight=1) # type: ignore # TODO: Figure out how to not have spinbox show zero when using # increment/decrement buttons. label_selection_position_x = Label(frame_bot, text="X: ") label_selection_position_x.grid(column=1, row=0) self._spinbox_selection_position_x = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_position_x.grid(column=2, row=0) label_selection_position_y = Label(frame_bot, text=" Y: ") label_selection_position_y.grid(column=3, row=0) self._spinbox_selection_position_y = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_position_y.grid(column=4, row=0) label_selection_zoom = Label(frame_bot, text=" Zoom: ") label_selection_zoom.grid(column=5, row=0) self._spinbox_selection_zoom = Spinbox(frame_bot, width=5, validate="focusout") self._spinbox_selection_zoom.grid(column=6, row=0) self._bind_actions() self._set_up_menubar() self._reset_spinbox_values()
def set_config(): sys_para = sys.argv file_path = os.path.split(sys_para[0])[0] gui = False if platform.uname()[0] == 'Windows': # Win默认打开 gui = True if platform.uname()[0] == 'Linux': # Linux 默认关闭 gui = False if '--gui' in sys.argv: # 指定 gui 模式 gui = True if '--nogui' in sys.argv: # 带 nogui 就覆盖前面Win打开要求 gui = False config_file = os.path.join(file_path, 's3_download_config.ini') # If no config file, read the default config if not os.path.exists(config_file): config_file += '.default' print("No customized config, use the default config") cfg = ConfigParser() print(f'Reading config file: {config_file}') try: global SrcBucket, S3Prefix, SrcFileIndex, SrcProfileName, DesDir, MaxRetry, MaxThread, MaxParallelFile, LoggingLevel cfg.read(config_file, encoding='utf-8-sig') SrcBucket = cfg.get('Basic', 'SrcBucket') S3Prefix = cfg.get('Basic', 'S3Prefix') SrcFileIndex = cfg.get('Basic', 'SrcFileIndex') SrcProfileName = cfg.get('Basic', 'SrcProfileName') DesDir = cfg.get('Basic', 'DesDir') Megabytes = 1024 * 1024 ChunkSize = cfg.getint('Advanced', 'ChunkSize') * Megabytes MaxRetry = cfg.getint('Advanced', 'MaxRetry') MaxThread = cfg.getint('Advanced', 'MaxThread') MaxParallelFile = cfg.getint('Advanced', 'MaxParallelFile') LoggingLevel = cfg.get('Advanced', 'LoggingLevel') except Exception as e: print("ERR loading s3_download_config.ini", str(e)) input('PRESS ENTER TO QUIT') sys.exit(0) if gui: # For GUI from tkinter import Tk, filedialog, END, StringVar, BooleanVar, messagebox from tkinter.ttk import Combobox, Label, Button, Entry, Spinbox, Checkbutton # get profile name list in ./aws/credentials pro_conf = RawConfigParser() pro_path = os.path.join(os.path.expanduser("~"), ".aws") cre_path = os.path.join(pro_path, "credentials") if os.path.exists(cre_path): pro_conf.read(cre_path) profile_list = pro_conf.sections() else: print( f"There is no aws_access_key in {cre_path}, please input for S3 Bucket: " ) os.mkdir(pro_path) aws_access_key_id = input('aws_access_key_id: ') aws_secret_access_key = input('aws_secret_access_key: ') region = input('region: ') pro_conf.add_section('default') pro_conf['default']['aws_access_key_id'] = aws_access_key_id pro_conf['default'][ 'aws_secret_access_key'] = aws_secret_access_key pro_conf['default']['region'] = region profile_list = ['default'] with open(cre_path, 'w') as f: print(f"Saving credentials to {cre_path}") pro_conf.write(f) # Click Select Folder def browse_folder(): local_dir = filedialog.askdirectory( initialdir=os.path.dirname(__file__)) url_txt.delete(0, END) url_txt.insert(0, local_dir) file_txt.delete(0, END) file_txt.insert(0, "*") # Finsih browse folder # Click List Buckets def ListBuckets(*args): SrcProfileName = SrcProfileName_txt.get() client = Session(profile_name=SrcProfileName).client('s3') bucket_list = [] try: response = client.list_buckets() if 'Buckets' in response: bucket_list = [b['Name'] for b in response['Buckets']] except Exception as e: messagebox.showerror( 'Error', f'Failt to List buckets. \n' f'Please verify your aws_access_key of profile: [{SrcProfileName}]\n' f'{str(e)}') bucket_list = ['CAN_NOT_GET_BUCKET_LIST'] SrcBucket_txt['values'] = bucket_list SrcBucket_txt.current(0) # Finish ListBuckets # Click List Prefix def ListPrefix(*args): SrcProfileName = SrcProfileName_txt.get() client = Session(profile_name=SrcProfileName).client('s3') prefix_list = [] this_bucket = SrcBucket_txt.get() max_get = 100 try: response = client.list_objects_v2( Bucket=this_bucket, Delimiter='/', RequestPayer='requester' ) # Only get the max 1000 prefix for simply list if 'CommonPrefixes' in response: prefix_list = [ c['Prefix'] for c in response['CommonPrefixes'] ] if not prefix_list: messagebox.showinfo( 'Message', f'There is no "/" Prefix in: {this_bucket}') if response['IsTruncated']: messagebox.showinfo( 'Message', f'More than {max_get} Prefix, cannot fully list here.') except Exception as e: messagebox.showinfo( 'Error', f'Cannot get prefix list from bucket: {this_bucket}, {str(e)}' ) S3Prefix_txt['values'] = prefix_list S3Prefix_txt.current(0) # Finish list prefix def browse_file(*args): SrcProfileName = SrcProfileName_txt.get() S3Prefix = S3Prefix_txt.get() client = Session(profile_name=SrcProfileName).client('s3') file_list = [] this_bucket = SrcBucket_txt.get() max_get = 100 try: response = client.list_objects_v2( Bucket=this_bucket, Prefix=str(PurePosixPath(S3Prefix)) + '/', RequestPayer='requester', Delimiter='/' ) # Only get the max 1000 files for simply list # For delete prefix in des_prefix if S3Prefix == '' or S3Prefix == '/': # 目的bucket没有设置 Prefix dp_len = 0 else: # 目的bucket的 "prefix/"长度 dp_len = len(str(PurePosixPath(S3Prefix))) + 1 if 'Contents' in response: file_list = [ c['Key'][dp_len:] for c in response['Contents'] ] # 去掉Prefix if not file_list: messagebox.showinfo( 'Message', f'There is no files in s3://{this_bucket}/{S3Prefix}') if response['IsTruncated']: messagebox.showinfo( 'Message', f'More than {max_get} files, cannot fully list here.') except Exception as e: messagebox.showinfo( 'Error', f'Cannot get file list from bucket s3://{this_bucket}/{S3Prefix}, {str(e)}' ) file_txt['values'] = file_list file_txt.current(0) # Finish list files # Click START button def close(): window.withdraw() ok = messagebox.askokcancel( 'Start downloading job', f'DOWNLOAD FROM s3://{SrcBucket_txt.get()}/{S3Prefix_txt.get()}\n' f'TO LOCAL {url_txt.get()}\n' f'Click OK to START') if not ok: window.deiconify() return window.quit() return # Finish close() # Start GUI window = Tk() window.title( "LONGBOW - AMAZON S3 DOWNLOAD TOOL WITH BREAK-POINT RESUMING") window.geometry('705x350') window.configure(background='#ECECEC') window.protocol("WM_DELETE_WINDOW", sys.exit) Label(window, text="S3 Bucket").grid(column=0, row=1, sticky='w', padx=2, pady=2) SrcBucket_txt = Combobox(window, width=48) SrcBucket_txt.grid(column=1, row=1, sticky='w', padx=2, pady=2) SrcBucket_txt['values'] = SrcBucket SrcBucket_txt.current(0) Button(window, text="List Buckets", width=10, command=ListBuckets) \ .grid(column=2, row=1, sticky='w', padx=2, pady=2) Label(window, text="S3 Prefix").grid(column=0, row=2, sticky='w', padx=2, pady=2) S3Prefix_txt = Combobox(window, width=48) S3Prefix_txt.grid(column=1, row=2, sticky='w', padx=2, pady=2) S3Prefix_txt['values'] = S3Prefix if S3Prefix != '': S3Prefix_txt.current(0) Button(window, text="List Prefix", width=10, command=ListPrefix) \ .grid(column=2, row=2, sticky='w', padx=2, pady=2) Label(window, text="Filename or *").grid(column=0, row=3, sticky='w', padx=2, pady=2) file_txt = Combobox(window, width=48) file_txt.grid(column=1, row=3, sticky='w', padx=2, pady=2) file_txt['values'] = SrcFileIndex if SrcFileIndex != '': file_txt.current(0) Button(window, text="Select File", width=10, command=browse_file) \ .grid(column=2, row=3, sticky='w', padx=2, pady=2) Label(window, text="AWS Profile").grid(column=0, row=4, sticky='w', padx=2, pady=2) SrcProfileName_txt = Combobox(window, width=15, state="readonly") SrcProfileName_txt['values'] = tuple(profile_list) SrcProfileName_txt.grid(column=1, row=4, sticky='w', padx=2, pady=2) if SrcProfileName in profile_list: position = profile_list.index(SrcProfileName) SrcProfileName_txt.current(position) else: SrcProfileName_txt.current(0) SrcProfileName = SrcProfileName_txt.get() SrcProfileName_txt.bind("<<ComboboxSelected>>", ListBuckets) Label(window, text="Folder").grid(column=0, row=5, sticky='w', padx=2, pady=2) url_txt = Entry(window, width=50) url_txt.grid(column=1, row=5, sticky='w', padx=2, pady=2) url_btn = Button(window, text="Select Folder", width=10, command=browse_folder) url_btn.grid(column=2, row=5, sticky='w', padx=2, pady=2) url_txt.insert(0, DesDir) Label(window, text="MaxThread/File").grid(column=0, row=6, sticky='w', padx=2, pady=2) if MaxThread < 1 or MaxThread > 100: MaxThread = 5 var_t = StringVar() var_t.set(str(MaxThread)) MaxThread_txt = Spinbox(window, from_=1, to=100, width=15, textvariable=var_t) MaxThread_txt.grid(column=1, row=6, sticky='w', padx=2, pady=2) Label(window, text="MaxParallelFile").grid(column=0, row=7, sticky='w', padx=2, pady=2) if MaxParallelFile < 1 or MaxParallelFile > 100: MaxParallelFile = 5 var_f = StringVar() var_f.set(str(MaxParallelFile)) MaxParallelFile_txt = Spinbox(window, from_=1, to=100, width=15, textvariable=var_f) MaxParallelFile_txt.grid(column=1, row=7, sticky='w', padx=2, pady=2) save_config = BooleanVar() save_config.set(True) save_config_txt = Checkbutton(window, text="Save to s3_download_config.ini", var=save_config) save_config_txt.grid(column=1, row=9, padx=2, pady=2) Button(window, text="Start Download", width=15, command=close).grid(column=1, row=10, padx=5, pady=5) window.mainloop() DesDir = url_txt.get() SrcFileIndex = file_txt.get() SrcBucket = SrcBucket_txt.get() S3Prefix = S3Prefix_txt.get() SrcProfileName = SrcProfileName_txt.get() MaxThread = int(MaxThread_txt.get()) MaxParallelFile = int(MaxParallelFile_txt.get()) if save_config: cfg['Basic']['SrcBucket'] = SrcBucket cfg['Basic']['S3Prefix'] = S3Prefix cfg['Basic']['SrcFileIndex'] = SrcFileIndex cfg['Basic']['SrcProfileName'] = SrcProfileName cfg['Basic']['DesDir'] = DesDir cfg['Advanced']['MaxThread'] = str(MaxThread) cfg['Advanced']['MaxParallelFile'] = str(MaxParallelFile) config_file = os.path.join(file_path, 's3_download_config.ini') with codecs.open(config_file, 'w', 'utf-8') as f: cfg.write(f) print(f"Save config to {config_file}") # GUI window finish if S3Prefix == '/': S3Prefix = '' # Finish set_config() return ChunkSize
def build(self): """widget construction Parameters ---------- None Results ------- None """ fr1 = LabelFrame(self.fr0, text='rgb') fr1.grid(column=0, row=0, sticky='news') rl0 = Label(fr1, text='red ') rl0.grid(column=0, row=0, sticky='s') self.rcan = Canvas(fr1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.rcan.grid(column=1, row=0, sticky='s') rsc = TtkScale(fr1, from_=0, to=255, variable=self.rvar, orient='horizontal', length=self.scale_l, command=self.rhandle, tickinterval=20) rsc.grid(column=1, row=1, sticky='news') rsb = Spinbox(fr1, from_=0, to=255, textvariable=self.rvar, command=self.rhandle, width=5) rsb.grid(column=2, row=1, sticky='nw') rel = Label(fr1, height=1) rel.grid(column=2, row=2) gl0 = Label(fr1, text='green') gl0.grid(column=0, row=3) self.gcan = Canvas(fr1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.gcan.grid(column=1, row=3, sticky='s') gsc = TtkScale(fr1, from_=0, to=255, variable=self.gvar, orient='horizontal', length=self.scale_l, command=self.ghandle, tickinterval=20) gsc.grid(column=1, row=4, sticky='news') gsb = Spinbox(fr1, from_=0, to=255, textvariable=self.gvar, command=self.ghandle, width=5) gsb.grid(column=2, row=4, sticky='nw') gel = Label(fr1, height=1) gel.grid(column=2, row=5) bl0 = Label(fr1, text='blue ') bl0.grid(column=0, row=6, sticky='s') self.bcan = Canvas(fr1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.bcan.grid(column=1, row=6, sticky='n') bsc = TtkScale(fr1, from_=0, to=255, variable=self.bvar, orient='horizontal', length=self.scale_l, command=self.bhandle, tickinterval=20) bsc.grid(column=1, row=7, sticky='news') bsb = Spinbox(fr1, from_=0, to=255, textvariable=self.bvar, command=self.bhandle, width=5) bsb.grid(column=2, row=7, sticky='nw') bel = Label(fr1, height=1) bel.grid(column=2, row=8) fr3 = LabelFrame(self.fr0, text='colour mix') fr3.grid(column=1, row=0, sticky='nw') self.cmcan = cmcan = Canvas(fr3, width=30, height=30, bd=0, highlightthickness=0) cmcan.grid(column=0, row=0, sticky='n', columnspan=2) cmcan.grid_propagate(0) vdraw_gradient(self.cmcan, (255, 0, 0), alpha=255) cml = Label(fr3, text='hash\nvalue') cml.grid(column=0, row=1) ent0 = Entry(fr3, width=8, textvariable=self.evar) ent0.grid(column=1, row=1) fr2 = LabelFrame(self.fr0, text='opacity') fr2.grid(column=0, row=1, sticky='news') al0 = Label(fr2, text='alpha') al0.grid(column=0, row=0, sticky='s') self.acan = Canvas(fr2, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.acan.grid(column=1, row=0, sticky='n') asc = TtkScale(fr2, from_=0, to=255, variable=self.avar, orient='horizontal', length=self.scale_l, command=self.ahandle, tickinterval=20) asc.grid(column=1, row=1, sticky='news') asb = Spinbox(fr2, from_=0, to=255, textvariable=self.avar, command=self.ahandle, width=5) asb.grid(column=2, row=1, sticky='nw') ael = Label(fr2, text=' ', height=1) ael.grid(column=2, row=2, sticky='s') draw_gradient(self.rcan, (0, 0, 0), (255, 0, 0), width=self.canvas_w) draw_gradient(self.gcan, (255, 0, 0), (255, 255, 0), width=self.canvas_w) draw_gradient(self.bcan, (255, 0, 0), (255, 0, 255), width=self.canvas_w) draw_agradient(self.acan, (127, 127, 127), (255, 0, 0), width=self.canvas_w)
def makeFrameWidget(self): ''' makes frame widget ''' #make regular frame stuff -- label and tier self.frames_canvas = Canvas(self.canvas_frame, width=self.canvas_width, height=self.canvas_height, background='gray', highlightthickness=0) frames_label = Canvas(self.frame, width=self.label_width, height=self.canvas_height, highlightthickness=0, background='gray') frames_label.create_text(self.label_width, 0, anchor='ne', justify='center', text='frames: ', width=self.label_width, activefill='blue') # make subframe to go on top of label canvas sbframe = Frame(frames_label) #put new widgets onto subframe offset = self.app.Data.getFileLevel('offset') if offset != None: self.frame_shift.set(offset) # for audio alignment go_btn = Button(sbframe, text='Offset', command=self.shiftFrames, takefocus=0) # minmax = len(self.app.Audio.sfile)*1000 txtbox = Spinbox(sbframe, textvariable=self.frame_shift, width=7, from_=-10000000, to=10000000) txtbox.bind('<Escape>', lambda ev: sbframe.focus()) txtbox.bind('<Return>', lambda ev: self.shiftFrames()) go_btn.grid(row=0, column=0, sticky='e') txtbox.grid(row=0, column=1, sticky='e') # put subframe on canvas window = frames_label.create_window(self.label_width * .3, self.canvas_height / 3, anchor='nw', window=sbframe) # ensure position of subframe gets updated frames_label.bind( '<Configure>', lambda e: frames_label.itemconfig(window, width=e.width)) sbframe.bind( '<Configure>', lambda e: frames_label.configure( scrollregion=frames_label.bbox("all"))) self.TkWidgets.append({ 'name': self.frameTierName, 'frames': self.frames_canvas, 'frames-label': frames_label }) self.frames_canvas.bind("<Button-1>", self.getClickedFrame)
('pressed', 'arrspd-p'), ('active', 'arrspd-h'), { 'sticky': 'e', 'border': [0], 'padding': 4 } # 'border': [1] ) }, "Spinbox.uparrow": { "element create": ("image", 'arrspu-n', ('disabled', 'arrspu-d'), ('pressed', 'arrspu-p'), ('active', 'arrspu-h'), { 'sticky': 'e', 'border': [0], 'padding': 4 }) } # end of theme extract - don't forget to add comma at end when inserting }) style.theme_use('yummy') # 'alt' widg = Spinbox(fr, from_=0, to=100, width=4) widg.grid(column=0, row=10, padx=5, pady=5) widg1 = Spinbox(fr, from_=0, to=100) widg1.grid(column=0, row=11, padx=5, pady=5, sticky='ns') run_state(fr, widg, widg1) root.mainloop()
def initialize_settings_ui(self): # Initializes resamples field resamples_label = Label(self, text="Resamples (affects recognition accuracy)") resamples_label.place(y=12.5, x=12.5) resamples_text = tk.StringVar() resamples_text.set(self.settings["resamples"]) resamples_spin = Spinbox(self, from_=1, to=10, textvariable=resamples_text) resamples_spin.config(command=partial(self.save_settings, "resamples", lambda: int(resamples_text.get()))) resamples_spin.place(y=37.5, x=12.5) separator1 = Separator(self, orient='horizontal') separator1.place(y=62.5, x=12.5, width=375, height=1) # Initializes tolerance field tolerance_label = Label(self, text="Face matching tolerance (lower is more strict)") tolerance_label.place(y=68.75, x=12.5) tolerance_text = tk.StringVar() tolerance_text.set(self.settings["tolerance"]) tolerance_spin = Spinbox(self, from_=0, to=1, increment=0.1, textvariable=tolerance_text) tolerance_spin.config(command=partial(self.save_settings, "tolerance", lambda: float(tolerance_text.get()))) tolerance_spin.place(y=93.75, x=12.5) separator2 = Separator(self, orient='horizontal') separator2.place(y=118.75, x=12.5, width=375, height=1) # Initializes track period field track_period_label = Label(self, text="Track period (the number of frames between each recognition)") track_period_label.place(y=125, x=12.5) track_period_text = tk.StringVar() track_period_text.set(self.settings["track_period"]) track_period_spin = Spinbox(self, from_=1, to=30, textvariable=track_period_text) track_period_spin.config(command=partial(self.save_settings, "track_period", lambda: int(track_period_text.get()))) track_period_spin.place(y=150, x=12.5) separator3 = Separator(self, orient='horizontal') separator3.place(y=175, x=12.5, width=375, height=1) # Initializes blur method field blur_method_label = Label(self, text="Blur method") blur_method_label.place(y=181.25, x=12.5) blur_method_text = tk.StringVar() blur_method_text.set(self.settings["blur_method"]) blur_method_menu = Combobox(self, textvariable=blur_method_text, values=("pixelate", "blur", "blacken")) blur_method_text.trace('w', partial(self.save_settings, "blur_method", lambda: blur_method_text.get())) blur_method_menu.place(y=206.25, x=12.5) separator4 = Separator(self, orient='horizontal') separator4.place(y=231.25, x=12.5, width=375, height=1) # Initializes blur intensity field blur_intensity_label = Label(self, text="Blur intensity (filter size)") blur_intensity_label.place(y=237.5, x=12.5) blur_intensity_text = tk.StringVar() blur_intensity_text.set(self.settings["blur_intensity"]) blur_intensity_spin = Spinbox(self, from_=1, to=30, textvariable=blur_intensity_text) blur_intensity_spin.config(command=partial(self.save_settings, "blur_intensity", lambda: int(blur_intensity_text.get()))) blur_intensity_spin.place(y=262.5, x=12.5) separator5 = Separator(self, orient='horizontal') separator5.place(y=287.5, x=12.5, width=375, height=1) # Initializes display output field display_output_flag = tk.IntVar() display_output_flag.set(self.settings["display_output"]) display_output_checkbox = tk.Checkbutton(self, text='Display output', variable=display_output_flag, onvalue=1, offvalue=0) display_output_checkbox.config(command=partial(self.save_settings, "display_output", lambda: display_output_flag.get())) display_output_checkbox.place(y=293.75, x=12.5)
sticky='W') rd_notrail = Radiobutton(lbframe_trail, text="non", variable=val_trail, value=ENDTRAIL.NOTHING).grid(column=1, row=1, sticky='W') val_timeout = StringVar(frame_sendto_port) timeout = ["Wait Forever", "Non-blocking"] for x in range(1, 61): timeout.append(str(x) + " Sec") sp_timeout = Spinbox(frame_sendto_port, state='readonly', values=timeout, textvariable=val_timeout) val_timeout.set("Wait Forever") txt_logs = scrolledtext.ScrolledText(frame_view_log, width=48, height=36) def handle_data(data): pass def read_from_port(ser): while ser.inWaiting and connected: try: txt_logs.insert(tk.END, ser.readline()) txt_logs.see("end")
font_size = def_font.actual()['size'] + 2 def is_okay(text): """ validation function Parameters ---------- text : str text if allowed Returns ------- boolean """ print(text) if text in ("", "-", ".", "-."): return True try: float(text) except ValueError: return False return True vcmd = root.register(is_okay) ent0 = Spinbox(root, validate="key", validatecommand=(vcmd, '%P'), font=(font_family, font_size, 'bold')) ent0.pack(padx=10) root.mainloop()
def startPassGen(): global root root = Toplevel() root.attributes('-topmost', True) root.title(" Password Generator") root.geometry("350x380") # root.resizable(0,0) root.configure(bg="white") root.iconphoto(True, PhotoImage(file=assetpath + 'padlock.png')) root.tk.call('tk', 'scaling', 1.6) style = Style() style.configure("TLabel", background="white") style.configure('TCheckbutton', background='white') mainf = Frame(root, bg="white") mainf.pack(pady=20, padx=20, ipadx=10, ipady=10) f1 = Frame(mainf, bg="white") f1.pack() icon = ImageTk.PhotoImage( Image.open(assetpath + 'key.png').resize((45, 45))) Label(f1, image=icon, bg="white").grid(row=0, column=0, rowspan=2, padx=2, pady=5) Label(f1, text="Pass-Gen", font=('ARIAL', 15, 'bold'), bg="white").grid(row=0, column=2) Label(f1, text="Password Generator", bg="white").grid(row=1, column=2) f2 = Frame(mainf, bg="white") f2.pack(padx=10, pady=(30, 15)) global passe passe = Entry(f2, width=30) passe.pack(side=LEFT) copyi = ImageTk.PhotoImage( Image.open(assetpath + 'copy.png').resize((25, 25))) copyb = Button(f2, image=copyi, bg="white", bd=0, activebackground="white", command=lambda: copy2clip(passe.get())) copyb.pack(side=LEFT, padx=2) global length length = 8 lenf = Frame(mainf) lenf.pack() Label(lenf, text="Length ", bg="white").pack(side=LEFT) s = Spinbox(lenf, from_=4, to=25, width=5, command=lambda: setlength(s.get())) s.set(8) s.pack(side=LEFT) upper = BooleanVar() digit = BooleanVar() special = BooleanVar() upper.set(True) digit.set(True) special.set(True) f3 = Frame(mainf, bg="white") f3.pack(padx=10, pady=10) capb = Checkbutton(f3, text="Include Capitals", variable=upper, offvalue=False, onvalue=True) capb.pack(anchor=W, pady=5) digitb = Checkbutton(f3, text="Include Digits", variable=digit, offvalue=False, onvalue=True) digitb.pack(anchor=W, pady=5) specialb = Checkbutton(f3, text="Include Special Symbols", variable=special, offvalue=False, onvalue=True) specialb.pack(anchor=W, pady=5) genb = Button(mainf, text="Generate", command=lambda: passGen(length, upper.get(), digit.get(), special.get()), bg="turquoise3", activebackground="turquoise3", bd=0) genb.pack(pady=10, ipadx=20, padx=(43, 10), side=LEFT) exitb = Button(mainf, text="Exit", command=exitPassGen, bg="firebrick1", activebackground="firebrick1", bd=0, width=37) exitb.pack(pady=10, ipadx=20, padx=(10, 30), side=LEFT) root.mainloop()
def build(self): """Widget construction.""" lf1 = LabelFrame(self.fr0, text='rgb') lf1.grid(column=0, row=0, sticky='new') lf1.columnconfigure(1, weight=1) rl0 = Label(lf1, text='red ') rl0.grid(column=0, row=0, sticky='s') self.rcan = Canvas(lf1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.rcan.grid(column=1, row=0, sticky='sew', padx=self.sliderlength // 2) self.rcan.bind("<Configure>", self.resize_rcan) rsc = TtkScale(lf1, self.scale_l, from_=0, to=255, variable=self.rvar, orient='horizontal', command=self.rhandle, tickinterval=20) rsc.grid(column=1, row=1, sticky='new') vcmdsb = root.register(sb_okay) rsb = Spinbox(lf1, from_=0, to=255, textvariable=self.rvar, validate='key', validatecommand=(vcmdsb, '%d', '%P', '%S', 255), command=self.rhandle, width=5) rsb.grid(column=2, row=1, sticky='nw') rsb.bind('<KeyRelease>', self.checksb) rel = Label(lf1) rel.grid(column=2, row=2) gl0 = Label(lf1, text='green') gl0.grid(column=0, row=3) self.gcan = Canvas(lf1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.gcan.grid(column=1, row=3, sticky='sew', padx=self.sliderlength // 2) self.gcan.bind("<Configure>", self.resize_gcan) gsc = TtkScale(lf1, self.scale_l, from_=0, to=255, variable=self.gvar, orient='horizontal', command=self.ghandle, tickinterval=20) gsc.grid(column=1, row=4, sticky='new') gsb = Spinbox(lf1, from_=0, to=255, textvariable=self.gvar, validate='key', validatecommand=(vcmdsb, '%d', '%P', '%S', 255), command=self.ghandle, width=5) gsb.grid(column=2, row=4, sticky='nw') gsb.bind('<KeyRelease>', self.checksb) gel = Label(lf1) gel.grid(column=2, row=5) bl0 = Label(lf1, text='blue ') bl0.grid(column=0, row=6, sticky='s') self.bcan = Canvas(lf1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.bcan.grid(column=1, row=6, sticky='new', padx=self.sliderlength // 2) self.bcan.bind("<Configure>", self.resize_bcan) bsc = TtkScale(lf1, self.scale_l, from_=0, to=255, variable=self.bvar, orient='horizontal', command=self.bhandle, tickinterval=20) bsc.grid(column=1, row=7, sticky='new') bsb = Spinbox(lf1, from_=0, to=255, textvariable=self.bvar, validate='key', validatecommand=(vcmdsb, '%d', '%P', '%S', 255), command=self.bhandle, width=5) bsb.grid(column=2, row=7, sticky='nw') bsb.bind('<KeyRelease>', self.checksb) bel = Label(lf1) bel.grid(column=2, row=8) lf3 = LabelFrame(self.fr0, text='colour mix') lf3.grid(column=1, row=0, sticky='nw') self.cmcan = cmcan = Canvas(lf3, width=30, height=30, bd=0, highlightthickness=0) cmcan.grid(column=0, row=0, sticky='n', columnspan=2) cmcan.grid_propagate(0) vdraw_gradient(self.cmcan, (255, 0, 0), alpha=255) cml = Label(lf3, text='hash\nvalue') cml.grid(column=0, row=1) vcmd = root.register(is_okay) self.ent0 = ent0 = Entry(lf3, width=8, validate='key', validatecommand=(vcmd, '%i', '%P', '%S'), textvariable=self.evar) ent0.grid(column=1, row=1) ent0.bind('<KeyRelease>', self.checkhash) lf5 = LabelFrame(lf3, text='related colours', style='Wide.TLabelframe') lf5.grid(column=0, row=2, sticky='nw', columnspan=2) self.srcls = [] self.vrcls = [] self.srccans = [] self.vrccans = [] relateds = [25, 50, 75, 100] stexts = ['25% sat', '50% sat', '75% sat', '100% sat'] vtexts = ['25% val', '50% val', '75% val', '100% val'] for ix, rel in enumerate(relateds): Label(lf5, text=stexts[ix]).grid(row=1 + 2 * ix, column=0, sticky='n') self.srcls.append(Label(lf5)) self.srcls[ix].grid(row=1 + 2 * ix, column=1, sticky='n') self.srccans.append( Canvas(lf5, width=30, height=30, bd=0, highlightthickness=0)) self.srccans[ix].grid(row=2 * ix, column=0, sticky='n', columnspan=2) Label(lf5, text=vtexts[ix]).grid(row=9 + 2 * ix, column=0, sticky='n') self.vrcls.append(Label(lf5)) self.vrcls[ix].grid(row=9 + 2 * ix, column=1, sticky='n') self.vrccans.append( Canvas(lf5, width=30, height=30, bd=0, highlightthickness=0)) self.vrccans[ix].grid(row=8 + 2 * ix, column=0, sticky='n', columnspan=2) self.cccan = Canvas(lf5, width=30, height=30, bd=0, highlightthickness=0) self.cccan.grid(column=0, row=17, sticky='n', columnspan=2) self.ccla = Label(lf5, text="comp'y") self.ccla.grid(column=0, row=18, sticky='n') self.ccl = Label(lf5, text="") self.ccl.grid(column=1, row=18, sticky='n') al0 = Label(lf1, text='alpha') al0.grid(column=0, row=10, sticky='s') self.acan = Canvas(lf1, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.acan.grid(column=1, row=10, sticky='new', padx=self.sliderlength // 2) self.acan.bind("<Configure>", self.resize_acan) asc = TtkScale(lf1, self.scale_l, from_=0, to=255, variable=self.avar, orient='horizontal', command=self.ahandle, tickinterval=20) asc.grid(column=1, row=11, sticky='new') asb = Spinbox(lf1, from_=0, to=255, textvariable=self.avar, validate='key', validatecommand=(vcmdsb, '%d', '%P', '%S', 255), command=self.ahandle, width=5) asb.grid(column=2, row=11, sticky='nw') asb.bind('<KeyRelease>', self.checksba) ael = Label(lf1, text=' ') ael.grid(column=2, row=12, sticky='s') draw_gradient(self.rcan, (0, 0, 0), (255, 0, 0), width=self.canvas_w) draw_gradient(self.gcan, (255, 0, 0), (255, 0, 255), width=self.canvas_w) draw_gradient(self.bcan, (255, 0, 0), (255, 255, 0), width=self.canvas_w) draw_agradient(self.acan, (127, 127, 127), (255, 0, 0), width=self.canvas_w) lf4 = LabelFrame(self.fr0, text='hsv') lf4.grid(column=2, row=0, sticky='news') lf4.columnconfigure(1, weight=1) hl0 = Label(lf4, text='hue ') hl0.grid(column=0, row=0, sticky='s') self.hcan = Canvas(lf4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.hcan.grid(column=1, row=0, sticky='sew', padx=self.sliderlength // 2) self.hcan.bind("<Configure>", self.resize_hcan) hsc = TtkScale(lf4, self.scale_l, from_=0, to=360, variable=self.hvar, orient='horizontal', command=self.hhandle, tickinterval=30) hsc.grid(column=1, row=1, sticky='new') vcmdsb = root.register(sb_okay) hsb = Spinbox(lf4, from_=0, to=360, textvariable=self.hvar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 360), command=self.hhandle, width=5) hsb.grid(column=2, row=1, sticky='nw') hsb.bind('<KeyRelease>', self.checksbh) hel = Label(lf4) hel.grid(column=2, row=2) sl0 = Label(lf4, text='sat ') sl0.grid(column=0, row=3) self.scan = Canvas(lf4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.scan.grid(column=1, row=3, sticky='sew', padx=self.sliderlength // 2) self.scan.bind("<Configure>", self.resize_scan) ssc = TtkScale(lf4, self.scale_l, from_=0, to=100, variable=self.svar, orient='horizontal', command=self.shandle, tickinterval=10) ssc.grid(column=1, row=4, sticky='new') ssb = Spinbox(lf4, from_=0, to=100, textvariable=self.svar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 100), command=self.shandle, width=5) ssb.grid(column=2, row=4, sticky='nw') ssb.bind('<KeyRelease>', self.checksb100) sel = Label(lf4) sel.grid(column=2, row=5) vl0 = Label(lf4, text='value') vl0.grid(column=0, row=6, sticky='s') self.vcan = Canvas(lf4, width=self.canvas_w, height=self.canvas_h, bd=0, highlightthickness=0) self.vcan.grid(column=1, row=6, sticky='new', padx=self.sliderlength // 2) self.vcan.bind("<Configure>", self.resize_vcan) vsc = TtkScale(lf4, self.scale_l, from_=0, to=100, variable=self.vvar, orient='horizontal', command=self.vhandle, tickinterval=10) vsc.grid(column=1, row=7, sticky='new') vsb = Spinbox(lf4, from_=0, to=100, textvariable=self.vvar, validate='key', validatecommand=(vcmdsb, '%P', '%S', 100), command=self.vhandle, width=5) vsb.grid(column=2, row=7, sticky='nw') vsb.bind('<KeyRelease>', self.checksb100) vel = Label(lf4) vel.grid(column=2, row=8) # assume initial setting 0,100,100 hsv to_colour = hsv_to_rgb(*(0, 100, 100)) hue_gradient(self.hcan, width=self.canvas_w) draw_gradient(self.scan, (255, 255, 255), to_colour, width=self.canvas_w) draw_gradient(self.vcan, (0, 0, 0), to_colour, width=self.canvas_w) self.can_hsv = can_hsv = Canvas(lf4, width=self.wheel_w, height=self.wheel_w, bg='#d9d9d9') can_hsv.grid(column=0, row=9, columnspan=3, pady=25, sticky='n') self.hsv_gamut = PhotoImage(file='../figures/colour_wheel.png') can_hsv.create_image(0, 0, anchor='nw', image=self.hsv_gamut) self.ring = circle(can_hsv, 307, 158, self.ring_radius, width=self.ring_width, outline='#555555', activeoutline='black', tags='ring') can_hsv.bind('<Button-1>', self.click_ring) can_hsv.tag_bind('ring', '<B1-Motion>', self.drag_ring) self.related(0, 100, 100, 255, 0, 0)