def create_widgets(self, clear_all_fnc): ''' Creates widgets of this frame. Args: clear_all_fnc (function): function that should be called when "Clear all" button is pressed. ''' rows_spinbox = Spinbox(self, from_=1, to=100, width=3, textvariable=self.row_str_var) rows_spinbox.grid(row=0, column=0, pady=3, padx=3) add_row_btn = Button(self, text='Add row(s)', command=self.add_rows) add_row_btn.grid(row=0, column=1, sticky=N+E+W, pady=3) remove_row_btn = Button(self, text='Remove row(s)', command=self.remove_rows) remove_row_btn.grid(row=1, column=1, sticky=N+E+W, pady=3) columns_spinbox = Spinbox(self, from_=1, to=100, width=3, textvariable=self.col_str_var) columns_spinbox.grid(row=2, column=0, pady=3, padx=3) add_column_btn = Button(self, text='Add column(s)', command=self.add_columns) add_column_btn.grid(row=2, column=1, sticky=N+E+W, pady=3) remove_column_btn = Button(self, text='Remove column(s)', command=self.remove_columns) remove_column_btn.grid(row=3, column=1, sticky=N+E+W, pady=3) clear_all_btn = Button(self, text='Clear all', command=clear_all_fnc) clear_all_btn.grid(row=4, column=1, sticky=N+E+W, pady=3)
def create_widgets(self, clear_all_fnc): ''' Creates widgets of this frame. Args: clear_all_fnc (function): function that should be called when "Clear all" button is pressed. ''' rows_spinbox = Spinbox(self, from_=1, to=100, width=3, textvariable=self.row_str_var) rows_spinbox.grid(row=0, column=0, pady=3, padx=3) add_row_btn = Button(self, text='Add row(s)', command=self.add_rows) add_row_btn.grid(row=0, column=1, sticky=N + E + W, pady=3) remove_row_btn = Button(self, text='Remove row(s)', command=self.remove_rows) remove_row_btn.grid(row=1, column=1, sticky=N + E + W, pady=3) columns_spinbox = Spinbox(self, from_=1, to=100, width=3, textvariable=self.col_str_var) columns_spinbox.grid(row=2, column=0, pady=3, padx=3) add_column_btn = Button(self, text='Add column(s)', command=self.add_columns) add_column_btn.grid(row=2, column=1, sticky=N + E + W, pady=3) remove_column_btn = Button(self, text='Remove column(s)', command=self.remove_columns) remove_column_btn.grid(row=3, column=1, sticky=N + E + W, pady=3) clear_all_btn = Button(self, text='Clear all', command=clear_all_fnc) clear_all_btn.grid(row=4, column=1, sticky=N + E + W, pady=3)
def loadMCSettings(): global gui, TListGui, MCparamGui, modelGui, modelStr, algorithmGui, algoStr, corrGui, coreGui SettingFrame=LabelFrame(gui,text='Other settings') SettingFrame.grid(row=3,column=0,sticky=(W,E)) temp_base=Frame(SettingFrame) temp_base.grid(row=0,column=0) TListGui=toolbox.NoteFrm(temp_base, init_notes=['T start:','T end','total points:'], init_data=[2.0,2.4,20],row=True,entryWidth=6) MCparam_base=Frame(SettingFrame) MCparam_base.grid(row=1,column=0,sticky='W') MCparamGui=toolbox.NoteFrm(MCparam_base, init_notes=['nthermal:','nsweep:','tau:'], init_data=[20000,40000,1],row=True) model_base=Frame(SettingFrame) model_base.grid(row=2,column=0,sticky='W') label1=Label(model_base,text='Model:') label1.grid(row=0,column=0) modelStr=StringVar() modelGui=Spinbox(model_base,from_=1, to=3, values=['Ising','XY','Heisenberg'],textvariable=modelStr,width=12) modelGui.grid(row=0,column=1) label2=Label(model_base,text='Algorithm:') label2.grid(row=0,column=2) algoStr=StringVar() algorithmGui=Spinbox(model_base,from_=1, to=3, values=['Wolff','Metroplis','Sweden-Wang'],textvariable=algoStr,width=12) algorithmGui.grid(row=0,column=3) corr_base=Frame(SettingFrame) corr_base.grid(row=3,column=0,sticky='W') corrGui=toolbox.NoteFrm(corr_base, init_notes=['Mesure corr. si','sj','overLat:','',''], init_data=[0,0,0,0,0],entryWidth=3,row=True) core_base=Frame(SettingFrame) core_base.grid(row=4,column=0,sticky='W') coreGui=toolbox.NoteFrm(core_base, init_notes=['core:'], init_data=[np.max([1,int(cpu_count()/2)])])
def create_preference_window(): tk = Tk() tk.title("snake") tk.resizable(False, False) Label(tk, text=WELCOME_TEXT).grid(row=0, column=0, columnspan=4) Label(tk, text="Speed: ").grid(row=1, column=0) speed_box = Spinbox(tk, values=list(Speed), state='readonly') while speed_box.get() != str(Speed.NORMAL): speed_box.invoke('buttonup') speed_box.grid(row=1, column=1) Label(tk, text="Length: ").grid(row=1, column=2) Label(tk, text="Height: ").grid(row=2, column=2) length_box, height_box = Entry(tk), Entry(tk) length_box.insert(0, "20"), height_box.insert(0, "20") length_box.grid(row=1, column=3), height_box.grid(row=2, column=3) state = _WindowState(tk, speed_box, length_box, height_box) Button(tk, text="Start!", command=state.pressing_start).grid(row=3, column=0, columnspan=2) Button(tk, text="Quit", command=state.pressing_quit).grid(row=3, column=2, columnspan=2) tk.mainloop() if state.quit: raise TclError return state.checked_values
class AlertConfigDialog(ConfigDialog): def __init__(self, parent): super().__init__(parent) self.title('告警设置') self.alert_threshold_label = ttk.Label(self.frame, text='告警阈值:') self.alert_threshold_value = tkinter.StringVar() self.alert_threshold_spinbox = Spinbox( self.frame, from_=0, to=10, width=5, bd=1, textvariable=self.alert_threshold_value) self.alert_threshold_value.set( self._get_config(['alert_threshold'])[0]) self.ok_button.configure(command=self._update_alert_threshold) def gui_arrang(self): self.frame.grid(row=0, column=0, padx=10, pady=5) self.alert_threshold_label.grid(row=0, column=0, sticky='W') self.alert_threshold_spinbox.grid(row=0, column=1) self.ok_button.grid(row=2, column=3, pady=5) self.cancel_button.grid(row=2, column=4, pady=5) self.focus() def _update_alert_threshold(self): self._set_config({'alert_threshold': self.alert_threshold_value.get()})
class Tab1(ttk.Frame): def __init__(self, master=None): ttk.Frame.__init__(self, master) self._create_widgets() def _create_widgets(self): lbf = ttk.LabelFrame(self, text='控件示范区1') lbf.grid(column=0, row=0, padx=8, pady=4) ttk.Label(lbf, text='输入文字:').grid(column=0, row=0, sticky='W') self.name = tk.StringVar() name_entered = ttk.Entry(lbf, width=12, textvariable=self.name) name_entered.grid(column=0, row=1, sticky='W') self.action = ttk.Button(lbf, text='点击我之后\n按钮失效', width=10, command=self._click_me) self.action.grid(column=2, row=1, rowspan=2, ipady=7) ttk.Label(lbf, text='请选择一本书:').grid(column=1, row=0, sticky='W') book = tk.StringVar() book_chosen = ttk.Combobox(lbf, width=12, textvariable=book) book_chosen['values'] = ['爱的教育', '情商密码', 'Python cook book', 'tkinter docs'] book_chosen.grid(column=1, row=1) book_chosen.current(0) self.spb1 = Spinbox(lbf, from_=10, to=25, width=5, bd=8, command=self._spin1) self.spb1.grid(column=0, row=2) self.spb2 = Spinbox(lbf, values=['Python 3', 'C++', 'Java', 'Go', 'Open CV'], width=13, bd=3, command=self._spin2) self.spb2.grid(column=1, row=2, sticky='W') scrol_w, scrol_h = 10, 5 self.scr = scrolledtext.ScrolledText(lbf, width=scrol_w, height=scrol_h, wrap=tk.WORD) self.scr.grid(column=0, row=3, sticky='WE', columnspan=3) createToolTip(self.spb1, '这是一个Spinbox') createToolTip(self.spb2, '这是一个Spinbox') createToolTip(self.action, '这是一个Button') createToolTip(name_entered, '这是一个Entry') createToolTip(book_chosen, '这是一个Combbox') createToolTip(self.scr, '这是一个ScrolledText') # 一次性控制各控件之间的距离 for child in lbf.winfo_children(): child.grid_configure(padx=3, pady=1) # 独立设置Button的距离 self.action.grid(column=2, row=1, rowspan=2, padx=6) def _click_me(self): self.action.configure(text='你好! \n' + self.name.get()) self.action.configure(state='disabled') def _spin1(self): value = self.spb1.get() self.scr.insert(tk.INSERT, value + '\n') def _spin2(self): value = self.spb2.get() self.scr.insert(tk.INSERT, value + '\n')
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) 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) self.TkWidgets.append({ 'name': self.frameTierName, 'frames': self.frames_canvas, 'frames-label': frames_label }) self.frames_canvas.bind("<Button-1>", self.getClickedFrame)
def frequency_checking_new_messages(top_settings): global how_often_to_check_intvar how_often_to_check_intvar = IntVar() how_often_to_check_intvar.set(how_often_to_check_int) label_frequency = Label(top_settings, text = "Frequency of checking (in seconds from {} to {}):" .format(MINIMUM_FREQUENCY_CHECKING_NEW_MESSAGES(), MAXIMUM_FREQUENCY_CHECKING_NEW_MESSAGES())) label_frequency.grid(column = 0, row = 3, sticky = W) spinbox_entry = Spinbox(top_settings, textvariable = how_often_to_check_intvar, from_ = MINIMUM_FREQUENCY_CHECKING_NEW_MESSAGES(), to = MAXIMUM_FREQUENCY_CHECKING_NEW_MESSAGES()) spinbox_entry.grid(column = 1, row = 3)
class JointControl(Frame): def __init__(self, master, name, index, robot, min_step, max_step, step_size, **options): super().__init__(master, **options) self.name = name self.index = index self.robot = robot self.label_name = Label(master, text=name + ": ").grid(column=0, row=index) self.spin_box_steps = Spinbox( master, from_=min_step, to=max_step) # Anzahl der Schritte eingeben self.spin_box_steps.grid(column=1, row=index) # Spin Box Position festlegen self.button_accept_position = Button(master, text=name + " Position uebernehmen", command=self.accept_position) self.button_accept_position.grid(column=1, row=index) self.label_current_pos = Label(master, text=name + " Aktuelle Position: ").grid(column=3, row=index) self.text_pos = Text(master, height=1, width=20) self.text_pos.grid(column=4, row=index) self.text_pos.insert("1.0", self.robot.current_state[self.index]) self.step_buttons = [] for list_index, step in enumerate( [-step_size, step_size, -step_size * 5, step_size * 5]): text = "Aktuelle Position " + ("" if step < 0 else "+") + str(step) button = JointControlButton(master, text, step, column=5 + list_index, row=index, callback=self.move) self.step_buttons.append(button) def update_text(self, content): self.text_pos.delete("1.0", END) self.text_pos.insert("1.0", content) def move(self, steps): old_pos = self.robot.current_state[self.index] self.robot.set_joint(self.index, old_pos + steps) self.update_text(self.robot.current_state[self.index]) def accept_position(self): steps = int(self.spin_box_steps.get()) print(self.name + "Schritte: " + str(steps)) self.robot.set_joint(self.index, steps)
def fillInfo(self, curRow: int, path: Path, name: str = None) -> None: rowLbl = zerofrmt(curRow) bg = self.litBg if (curRow % 2) else self.defBg # create container frm = Frame(master=self.scrFrm, bg=bg, relief='sunken', bd=1) frm.columnconfigure(1, weight=1) frm.grid(column=0, row=curRow, sticky='ew') # create spinbox sbox = Spinbox(master=frm, width=3, bg=bg, format=(f'%0{rndto}d' if rndto > 1 else ''), takefocus=False, from_=1, to=self.lblRow, increment=-1, repeatdelay=(10**5), validate='key', validatecommand=self.checkValid) sbox.grid(column=0, row=0) def btnpress(f=frm, s=sbox): self.updateList(f, s, True) def commit(_, f=frm, s=sbox): self.updateList(f, s) def cancel(_, f=frm, s=sbox): self.cancelChange(f, s) sbox.configure(command=btnpress) sbox.delete(0, 'end') if name: sbox.insert(0, rowLbl) else: name = path.name sbox.bind('<Return>', commit) sbox.bind('<Escape>', cancel) # create name label lbl = Label(master=frm, text=name, bg=bg) lbl.grid(column=1, row=0, sticky='w') # save to data dict self.data[rowLbl] = dict(frm=frm, sbox=sbox, lbl=lbl, path=path, name=name)
def generate_spinboxes(window): spinboxes = [[], [], [], [], [], [], [], [], []] for y in range(9): for x in range(9): spinbox = Spinbox(window, from_=0, to=9, width=BOX_WIDTH, font=("DEFAULT", FONT_SIZE)) spinbox.grid(column=x, row=y) spinboxes[y].append(spinbox) return spinboxes
def createDisplay(window): display = {} frame = Frame(window, bg='White') frame.grid(row=0, column=0, columnspan=3, rowspan=3, sticky='nsew') # create label to display the rolled dice diceLabel = Label(window, text='', bg='white', font=('Arial', 20)) diceLabel.grid(column=0, row=0, columnspan=3, sticky='nsew') display.update({"diceLabel": diceLabel}) # create label to display the rolled dice diceDisplay = Label(window, text="00", bg='white', font=("Arial Bold", 50)) diceDisplay.grid(column=0, row=1, columnspan=3, sticky='nsew') display.update({"diceDisplay": diceDisplay}) critDisplay = Label(window, text='', bg='white', font=("Arial Bold", 10), fg='red') critDisplay.grid(column=1, row=2) display.update({"critDisplay": critDisplay}) diceModLabel = Label(window, text="Dice Modifier:", bg='white', font=("Arial", 10)) diceModLabel.grid(column=2, row=2, sticky='w') display.update({"diceModLabel": diceModLabel}) modDefault = IntVar() modDefault.set(0) diceModifier = Spinbox(window, from_=-10, to_=10, width=4, textvariable=modDefault, bg='white') diceModifier.grid(column=2, row=2, sticky='e') display.update({"diceModifier": diceModifier}) #diceDisplay = Label(frame, text="00", font=("Arial Bold", 50)) #diceDisplay.pack() #display.update({"diceDisplay": diceDisplay}) #critDisplay = Label(frame, text='', font=("Arial Bold", 10), fg='red', padx=1, pady=1) #critDisplay.pack() #display.update({"critDisplay": critDisplay}) #modDefault = IntVar() #modDefault.set(0) #diceModifier = Spinbox(frame, from_=-10, to_=10, width=5, textvariable=modDefault) #diceModifier.pack(side='right') #display.update({"diceModifier": diceModifier}) #diceModLabel = Label(frame, text="Dice Modifier:", font=("Arial", 10)) #diceModLabel.pack(side='right') #display.update({"diceModLabel": diceModLabel}) return display
def reagendarCita(): paciente=clinica_objeto.buscarPaciente(rut_entry.get())[0] medico= lista_medicos_listbox.get(ACTIVE).split() medico.pop() aux="" for palabra in medico: aux+=palabra+" " aux=aux[:-1] medico=clinica_objeto.buscarMedico(aux)[0] busqueda= ingresar_codigo_entry.get() def reagendarCita(): fecha= dt.datetime(int(seleccion_Año.get()), int(seleccion_Mes.get()), int(seleccion_Dia.get()),int(seleccion_hora.get()),int(seleccion_minutos.get())) for paciente in clinica_objeto.getPacientes(): if paciente.modificarCita(fecha,busqueda): buscarCodigo() elegir_fecha.destroy() messagebox.showinfo(message="La cita ha sido reagendada con exito", title="Éxito") elegir_fecha=Toplevel() escoger_fecha_frame=LabelFrame(elegir_fecha, text="Datos Cita",bg=Charade,font=subtitulo_font, labelanchor=N) temp=LabelFrame(elegir_fecha) #seleccionar fecha cita disponibilidad_citas_frame=LabelFrame(escoger_fecha_frame, text="Seleccionar fecha:", bg=Charade, font=subtitulo2_font, labelanchor=N) disponibilidad_citas_frame.pack(fill=BOTH, expand=True, padx=30, pady=10) seleccion_Dia=Spinbox(disponibilidad_citas_frame,width=10,state="readonly" ,values=("01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31")) seleccion_Dia.grid(row=1, column=1) dia_label=Label(disponibilidad_citas_frame,text="Día",bg=Charade, font=subtitulo4_font) dia_label.grid(row=1,column=0) seleccion_Mes=Spinbox(disponibilidad_citas_frame,width=10 ,values=("01","01","03","04","05","06","07","08","09","10","11","12"),state="readonly" ) seleccion_Mes.grid(row=2,column=1) dia_label=Label(disponibilidad_citas_frame,text="Mes",bg=Charade, font=subtitulo4_font) dia_label.grid(row=2,column=0) seleccion_Año=Spinbox(disponibilidad_citas_frame,width=10,state="readonly" ,values=("2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2031")) seleccion_Año.grid(row=3,column=1) dia_label=Label(disponibilidad_citas_frame,text="Año",bg=Charade, font=subtitulo4_font) dia_label.grid(row=3,column=0) #seleccionar hora cita seleccion_hora=Spinbox(disponibilidad_citas_frame,width=10,state="readonly" ,values=("8","9","10","11","12","13","14","15","16","17","18","19","20","21","22")) seleccion_minutos=Spinbox(disponibilidad_citas_frame,width=10 ,values=("00","30")) seleccion_hora.grid(row=4,column=1) seleccion_minutos.grid(row=5,column=1) dia_label=Label(disponibilidad_citas_frame,text="Hora",bg=Charade, font=subtitulo4_font) dia_label.grid(row=4,column=0) dia_label=Label(disponibilidad_citas_frame,text="Minutos",bg=Charade, font=subtitulo4_font) dia_label.grid(row=5,column=0) boton_hora=Button(disponibilidad_citas_frame,text="Reservar Hora",command=lambda:reagendarCita(), image = reservar_hora_ic) boton_hora.grid(row=6,column=0, columnspan=2) escoger_fecha_frame.pack() actualizarDatosCitas()
class EditSettingsPopup(object): def __init__(self, overview, master): self.top = Toplevel(master) self.top.title("Settings") self.master = master self.overview = overview self.nb = Notebook(self.top, width=500, height=330) self.nb_t1 = Frame(self.top) self.nb_t2 = Frame(self.top) ex = [x.name for x in Exchange] #general tab self.t1_exchange = Combobox(self.nb_t1, values=ex, width=20) #replace with old val self.t1_exchange.set(ex[0]) Label(self.nb_t1, text="Default exchange:").grid(row=0, column=0, sticky="NEWS") self.t1_exchange.grid(row=0, column=2, columnspan=1) Label(self.nb_t1, text="Update interval(sec):").grid(row=1, column=0, sticky="NEWS") self.t1_interval_var = StringVar() self.t1_interval = Spinbox(self.nb_t1, textvariable=self.t1_interval_var, values=(3, 5, 10, 15, 30, 60, 120, 300), width=20) ##replace with old val---set after making spinbox self.t1_interval_var.set("15") self.t1_interval.grid(row=1, column=2, columnspan=1) self.nb.add(self.nb_t1, text="General") self.nb.add(self.nb_t2, text="Sounds") self.nb.grid(row=0, column=0, columnspan=3, rowspan=3, sticky="NEWS") ##center after packing center(self.top, master) def cleanup(self): self.top.destroy()
def Create_spinbox(Window, values=None, width=20, begin=0, end=0, step=1, col=0, line=0, form='wens', nbcolumns=1, nblines=1): """ This function creates a Spinbox Entry: Window(Frame): the parent frame values(list): the values shown in the spinbox, by default it is None what means that it uses begin and end width(int): the size of the spinbox (in caracters) begin(int): if used as a spinbox of values, the starting value end(int): if used as a spinbox of values, the ending value step(int): if used as a spinbox of values, the step col(int): the column line(int): the line form(srt): the style nbcolumns(int): the number of columns nblines(int): the number of lines Returns: Label.Spin(Label): the spinbox well returned """ if values: Label_Spin = Spinbox(Window, values=values, textvariable=values, width=width) else: Label_Spin = Spinbox(Window, from_=begin, to=end, increment=step, width=width) Label_Spin.grid(column=col, row=line, sticky=form, rowspan=nblines) return Label_Spin
def open_settings(self): f = Tk() f.title('Settings') toggles = Frame(f) toggles.pack() Label(toggles, text='Studied period : ').grid(row=0, column=0) t = StringVar(toggles) t.set(str(self.settings.period_study_count)) study = Spinbox(toggles, from_=1, to=100, increment=1, justify='center', wrap=True, width=3, textvariable=t) study.grid(row=0, column=1) Label(toggles, text='Play in background : ').grid(row=1, column=0) hide = ToggleButton( toggles, text='Yes' if self.settings.play_in_background else 'No') hide.grid(row=1, column=1) Label(toggles, text='Infinite play : ').grid(row=2, column=0) infinite = ToggleButton( toggles, text='Yes' if self.settings.infinite_play else 'No') infinite.grid(row=2, column=1) confirm = Frame(f) confirm.pack() def confirmer(): self.settings.period_observer = int(study.get()) self.settings.play_in_background = hide.actual_toggle self.settings.infinite_play = infinite.actual_toggle self.load_buttons() f.destroy() Button(confirm, text='Ok', command=confirmer).pack()
def new_map(event): dialog = Toplevel(widget) form = Frame(dialog) Label(form, text='Width:').grid(row=0, column=0) Label(form, text='Height:').grid(row=1, column=0) size = [1, 1] comm = (lambda ix: (lambda event=None: size.__setitem__(ix, wb.get() + (event.char if event else '')))) wv = IntVar(value=10) wb = Spinbox(form, from_=1, to=65535, command=comm(0), textvariable=wv) wb.bind('<Key>', comm(0)) wb.grid(row=0, column=1) hv = IntVar(value=10) hb = Spinbox(form, from_=1, to=65535, command=comm(1), textvariable=hv) hb.bind('<Key>', comm(1)) hb.grid(row=1, column=1) form.pack() dialog.transient(widget) dialog.grab_set() wb.focus_set() widget.wait_window(dialog) create_new_map(wv.get(), hv.get())
class PortScanner: def __init__(self): mGUI = Tk() #create tk reference object AKA Make A Window/Frame self.srvr = Entry(mGUI, textvariable="server") self.srvr.setvar(name="server", value='127.0.0.1') self.srvr.grid(row=0, column=1, sticky=W) lbl = Label(mGUI, text="Target Address:") lbl.grid(row=0, column=0, sticky=W) self.spnr = Spinbox(mGUI, from_=1, to=49152, value=1) self.spnr.grid(row=1, column=1, sticky=W) lbl2 = Label(mGUI, text="Starting Port:") lbl2.grid(row=1, column=0, sticky=W) self.spnr.grid(row=1, column=1, sticky=W) self.spnr2 = Spinbox(mGUI, from_=1, to=49152, value=49152) self.spnr2.grid(row=2, column=1, sticky=W) lbl3 = Label(mGUI, text="Ending Port") lbl3.grid(row=2, column=0, sticky=W) mGUI.resizable(width=False, height=False) #Make Window Size Static (Not Resizeable) btn = Button(mGUI, text="Commence Port Scan!", command=self.scan) btn.grid(row=3, column=1, sticky=W) self.txt = Text(mGUI, width=70, height=40, wrap=WORD) self.txt.grid(row=4, column=0, columnspan=2, sticky=W) mGUI.title( 'Network PortScanner dev by MICHEAL IYANDA!') #set Title Of Window self.txt.insert(0.0, 'Open Ports Will Appear Here After Scan Completes!') mGUI.mainloop() #Show GUI Window def pscan(self, port): try: target = self.srvr.get() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((target, port)) return True except: return False def scan(self): self.txt.delete(0.0, END) print('Scanning', self.srvr.get()) for num in range(int(self.spnr.get()), int(self.spnr2.get()) + 1): if self.pscan(num): print('Port: ', num, 'Is Open!') msg = "Port " + str( num ) + " Is Open!-------" "Port %d is normally used for " % num + commonPortDef( num) self.txt.insert(0.0, msg) else: print('port: ', num, 'Is Closed!') #msg = "Port "+str(x)+" Is Closed!\n" #txt.insert(0.0,msg) messagebox.showinfo(title="PyPortScanner!", message="Scan Completed!")
def __init__(self, frame): self.frame = frame stringvar_urlvoie = StringVar(self.frame, value='https://www.camptocamp.org/waypoints/40766/fr/presles-eliane') label_urlvoie = ttk.Label(self.frame, text="Entrer l'url d'une voie") entry_urlvoie = ttk.Entry(self.frame, textvariable=stringvar_urlvoie, width=80) label_mode_maj = ttk.Label(self.frame, text="Forcer la mise à jour") booleanvar_mode_maj = BooleanVar(self.frame, "1") checkbox_mode_maj = ttk.Checkbutton(self.frame, variable=booleanvar_mode_maj) label_spinbox_backend = ttk.Label(self.frame, text="Choix du Stockage") spinbox_backend = Spinbox(self.frame, values=['db', 'mongodb', 'pickle', 'aucun']) # Bouton de lancement de la classe permettant le parsing button = ttk.Button(self.frame, text='Parse', command=partial(ActionsIHMParsing, stringvar_urlvoie, booleanvar_mode_maj, spinbox_backend)) # Positionnement des éléments label_urlvoie.grid(column=0, row=0) entry_urlvoie.grid(column=2, row=0, columnspan=3, padx=20) label_mode_maj.grid(column=0, row=1) checkbox_mode_maj.grid(column=2, row=1, columnspan=3) label_spinbox_backend.grid(column=0, row=2) spinbox_backend.grid(column=2, row=2, columnspan=3) button.grid(column=0, row=3, columnspan=3)
class TimeChooser(Frame): ''' classdocs ''' def __init__(self, parent, initialTime=None): super().__init__(parent) if initialTime is None: initialTime = datetime.now().time() self.hour = Spinbox(self, from_=1, to=12, width=3) self.hour.grid(column=0, row=0) Label(self, text=":").grid(column=1, row=0) self.minute = Spinbox(self, from_=00, to=59, format="%02.0f", width=3) self.minute.grid(column=2, row=0) self.ampm = Spinbox(self, values=("AM", "PM"), width=4) self.ampm.grid(column=3, row=0) # set AM/PM self.ampm.delete(0, "end") self.ampm.insert(0, "AM" if initialTime.hour < 12 else "PM") # set hour, 12-hour display self.hour.delete(0, "end") if initialTime.hour == 0: self.hour.insert(0, "12") elif initialTime.hour <= 12: self.hour.insert(0, str(initialTime.hour)) else: self.hour.insert(0, str(initialTime.hour - 12)) # set minute self.minute.delete(0, "end") self.minute.insert(0, "{:0>2d}".format(initialTime.minute)) # readonly the entry widgets self.hour.config(state="readonly") self.minute.config(state="readonly") self.ampm.config(state="readonly") def getTime(self): hour = int(self.hour.get()) if self.ampm.get() == "AM": hour %= 12 elif hour < 12: hour += 12 return time(hour=int(hour), minute=int(self.minute.get()))
def __init__(self,master=None): Frame.__init__(self,master) #Sides of Dice labelSides=Label(self,text="Sides") labelSides.grid(row=0,column=0) self.sides=StringVar() self.sides.set(20) spinboxSides=Spinbox(self,from_=1,to=20,increment=1,width=4) spinboxSides.config(textvariable=self.sides, font="sans 24", justify="center") spinboxSides.grid(row=0,column=1) #Number of Dices labelNumber=Label(self,text="Number") labelNumber.grid(row=1,column=0) self.number=StringVar() self.number.set(1) spinboxNumber=Spinbox(self,from_=1,to=30,increment=1,width=4) spinboxNumber.config(textvariable=self.number, font="sans 24", justify="center") spinboxNumber.grid(row=1,column=1) #Modifier labelModifier=Label(self,text="Modifier") labelModifier.grid(row=2,column=0) self.modifier=StringVar() self.modifier.set(0) spinboxModifier=Spinbox(self,from_=-5,to=5,increment=1,width=4) spinboxModifier.config(textvariable=self.modifier, font="sans 24", justify="center") spinboxModifier.grid(row=2,column=1) #Hide Checkbox labelHide=Label(self, text="Hide") labelHide.grid(row=2, column=2) self.hide=IntVar() self.hide.set(0) checkbuttonHide=Checkbutton(self,variable=self.hide) checkbuttonHide.grid(row=2,column=3) #Result display self.result=StringVar() self.result.set("") labelResult1=Label(self,text="Result") labelResult1.grid(row=1, column=4) labelResult2=Label(self,text=self.result.get(),relief=SUNKEN,width=4) labelResult2.grid(row=1,column=5) #Button to roll buttonRoll=Button(self,text="Roll!", command=self.roll) buttonRoll.grid(row=2,column=5)
ttk.Label(monty, text="Choose a number:").grid(column=1, row=0) number = tk.StringVar() numberChosen = ttk.Combobox(monty, width=12, textvariable=number) numberChosen['values'] = (1, 2, 4, 42, 100) numberChosen.grid(column=1, row=1) numberChosen.current(0) # Spinbox callback def _spin(): value = spin.get() print(value) scr.insert(tk.INSERT, value + '\n') # Adding a Spinbox widget using a set of values spin = Spinbox(monty, values=(1, 2, 4, 42, 100), width=5, bd=8, command=_spin) spin.grid(column=0, row=2) # Add a Tooltip createToolTip(spin, 'This is a Spin control.') # Using a scrolled Text control scrolW = 30; scrolH = 3 scr = scrolledtext.ScrolledText(monty, width=scrolW, height=scrolH, wrap=tk.WORD) scr.grid(column=0, row=3, sticky='WE', columnspan=3) # Tab Control 2 refactoring ----------------------------------------- # We are creating a container tab3 to hold all other widgets -- Tab2 monty2 = ttk.LabelFrame(tab2, text=' The Snake ') monty2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons
number_chosen['values'] = (1, 2, 4, 42, 100) number_chosen.grid(column=1, row=1) number_chosen.current(0) # Spinbox callback def _spin(): value = spin.get() print(value) scr.insert(tk.INSERT, value + '\n') # Adding a Spinbox widget spin = Spinbox(mighty, from_=0, to=10, width=5, bd=8, command=_spin) # using range spin.grid(column=0, row=2) # Adding a second Spinbox spin2 = Spinbox(mighty, values=(10, 20, 30), width=5, bd=8, relief=tk.RIDGE) # specify a set of values # relief value: tk.FLAT/tk.RAISED/tk.SUNKEN(default value)/tk.GROOVE/tk.RIDGE spin2.grid(column=1, row=2) scrol_w, scrol_h = 30, 3 scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD) scr.grid(column=0, row=3, sticky='WE', columnspan=3) mighty2 = ttk.LabelFrame(tab2, text=' The Snake ') mighty2.grid(column=0, row=0, padx=8, pady=4)
class OOP(): def __init__(self): # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") # Disable resizing the window self.win.resizable(0, 0) # Create a Queue self.guiQueue = Queue() self.createWidgets() # populate Tab 2 Entries self.defaultFileEntries() # create MySQL instance self.mySQL = MySQL() def defaultFileEntries(self): self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, 'Z:\\') # bogus path self.fileEntry.config(state='readonly') self.netwEntry.delete(0, tk.END) self.netwEntry.insert(0, 'Z:\\Backup') # bogus path # Combobox callback def _combo(self, val=0): value = self.combo.get() self.scr.insert(tk.INSERT, value + '\n') # Spinbox callback def _spin(self): value = self.spin.get() self.scr.insert(tk.INSERT, value + '\n') # Checkbox callback def checkCallback(self, *ignoredArgs): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton callback function def radCall(self): radSel = self.radVar.get() if radSel == 0: self.mySQL2.configure(text=WIDGET_LABEL + 'in Blue') elif radSel == 1: self.mySQL2.configure(text=WIDGET_LABEL + 'in Gold') elif radSel == 2: self.mySQL2.configure(text=WIDGET_LABEL + 'in Red') # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() def methodInAThread(self, numOfLoops=10): for idx in range(numOfLoops): sleep(1) self.scr.insert(tk.INSERT, str(idx) + '\n') sleep(1) print('methodInAThread():', self.runT.isAlive()) # Running methods in Threads def createThread(self, num): self.runT = Thread(target=self.methodInAThread, args=[num]) self.runT.setDaemon(True) self.runT.start() print(self.runT) print('createThread():', self.runT.isAlive()) # textBoxes are the Consumers of Queue data writeT = Thread(target=self.useQueues, daemon=True) writeT.start() # Create Queue instance def useQueues(self): # Now using a class member Queue while True: qItem = self.guiQueue.get() print(qItem) self.scr.insert(tk.INSERT, qItem + '\n') # Button callback def insertQuote(self): title = self.bookTitle.get() page = self.pageNumber.get() quote = self.quote.get(1.0, tk.END) print(title) print(quote) self.mySQL.insertBooks(title, page, quote) # Button callback def getQuote(self): allBooks = self.mySQL.showBooks() print(allBooks) self.quote.insert(tk.INSERT, allBooks) # Button callback def modifyQuote(self): raise NotImplementedError( "This still needs to be implemented for the SQL command.") ##################################################################################### def createWidgets(self): # Tab Control introduced here -------------------------------------- tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='MySQL') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Widgets') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # ~ Tab Control introduced here ----------------------------------------- # We are creating a container frame to hold all other widgets self.mySQL = ttk.LabelFrame(tab1, text=' Python Database ') self.mySQL.grid(column=0, row=0, padx=8, pady=4) # Creating a Label ttk.Label(self.mySQL, text="Book Title:").grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget book = tk.StringVar() self.bookTitle = ttk.Entry(self.mySQL, width=34, textvariable=book) self.bookTitle.grid(column=0, row=1, sticky='W') # Adding a Textbox Entry widget book1 = tk.StringVar() self.bookTitle1 = ttk.Entry(self.mySQL, width=34, textvariable=book1) self.bookTitle1.grid(column=0, row=2, sticky='W') # Adding a Textbox Entry widget book2 = tk.StringVar() self.bookTitle2 = ttk.Entry(self.mySQL, width=34, textvariable=book2) self.bookTitle2.grid(column=0, row=3, sticky='W') # Creating a Label ttk.Label(self.mySQL, text="Page:").grid(column=1, row=0, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber.grid(column=1, row=1, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber1 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber1.grid(column=1, row=2, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber2 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber2.grid(column=1, row=3, sticky='W') # Adding a Button self.action = ttk.Button(self.mySQL, text="Insert Quote", command=self.insertQuote) self.action.grid(column=2, row=1) # Adding a Button self.action1 = ttk.Button(self.mySQL, text="Get Quotes", command=self.getQuote) self.action1.grid(column=2, row=2) # Adding a Button self.action2 = ttk.Button(self.mySQL, text="Mody Quote", command=self.modifyQuote) self.action2.grid(column=2, row=3) # Add some space around each widget for child in self.mySQL.winfo_children(): child.grid_configure(padx=2, pady=4) quoteFrame = ttk.LabelFrame(tab1, text=' Book Quotation ') quoteFrame.grid(column=0, row=1, padx=8, pady=4) # Using a scrolled Text control quoteW = 40 quoteH = 6 self.quote = scrolledtext.ScrolledText(quoteFrame, width=quoteW, height=quoteH, wrap=tk.WORD) self.quote.grid(column=0, row=8, sticky='WE', columnspan=3) # Add some space around each widget for child in quoteFrame.winfo_children(): child.grid_configure(padx=2, pady=4) #====================================================================================================== # Tab Control 2 #====================================================================================================== # We are creating a container frame to hold all other widgets -- Tab2 self.mySQL2 = ttk.LabelFrame(tab2, text=WIDGET_LABEL) self.mySQL2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons self.chVarDis = tk.IntVar() self.check1 = tk.Checkbutton(self.mySQL2, text="Disabled", variable=self.chVarDis, state='disabled') self.check1.select() self.check1.grid(column=0, row=0, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.mySQL2, text="UnChecked", variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=0, sticky=tk.W) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.mySQL2, text="Toggle", variable=self.chVarEn) self.check3.deselect() self.check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons self.chVarUn.trace( 'w', lambda unused0, unused1, unused2: self.checkCallback()) self.chVarEn.trace( 'w', lambda unused0, unused1, unused2: self.checkCallback()) # Radiobutton list colors = ["Blue", "Gold", "Red"] self.radVar = tk.IntVar() # Selecting a non-existing index value for radVar self.radVar.set(99) # Creating all three Radiobutton widgets within one loop for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.mySQL2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=6, sticky=tk.W, columnspan=3) # And now adding tooltips ToolTip(curRad, 'This is a Radiobutton control.') # Create a container to hold labels labelsFrame = ttk.LabelFrame(self.mySQL2, text=' Labels within a Frame ') labelsFrame.grid(column=0, row=7, pady=6) # Place labels into the container element - vertically ttk.Label(labelsFrame, text="Choose a number:").grid(column=0, row=0) ttk.Label(labelsFrame, text="Label 2").grid(column=0, row=1) # Add some space around each label for child in labelsFrame.winfo_children(): child.grid_configure(padx=6, pady=1) number = tk.StringVar() self.combo = ttk.Combobox(self.mySQL2, width=12, textvariable=number) self.combo['values'] = (1, 2, 4, 42, 100) self.combo.grid(column=1, row=7, sticky=tk.W) self.combo.current(0) self.combo.bind('<<ComboboxSelected>>', self._combo) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.mySQL2, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self._spin) self.spin.grid(column=2, row=7, sticky='W,', padx=6, pady=1) # Using a scrolled Text control scrolW = 40 scrolH = 1 self.scr = scrolledtext.ScrolledText(self.mySQL2, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=8, sticky='WE', columnspan=3) # Create Manage Files Frame ------------------------------------------------ mngFilesFrame = ttk.LabelFrame(tab2, text=' Manage Files: ') mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFileName(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) print(fName) self.fileEntry.config(state='enabled') self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fName) if len(fName) > self.entryLen: self.fileEntry.config(width=len(fName) + 3) # Add Widgets to Manage Files Frame lb = ttk.Button(mngFilesFrame, text="Browse to File...", command=getFileName) lb.grid(column=0, row=0, sticky=tk.W) #----------------------------------------------------- file = tk.StringVar() self.entryLen = scrolW - 4 self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) #----------------------------------------------------- logDir = tk.StringVar() self.netwEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dst = self.netwEntry.get() + '\\' + file try: shutil.copy(src, dst) mBox.showinfo('Copy File to Network', 'Succes: File copied.') except FileNotFoundError as err: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(err)) except Exception as ex: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text="Copy File To : ", command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Creating a Menu Bar ========================================================== menuBar = Menu(tab1) self.win.config(menu=menuBar) # Add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label="New") fileMenu.add_separator() fileMenu.add_command(label="Exit", command=self._quit) menuBar.add_cascade(label="File", menu=fileMenu) # Add another Menu to the Menu Bar and an item helpMenu = Menu(menuBar, tearoff=0) helpMenu.add_command(label="About") menuBar.add_cascade(label="Help", menu=helpMenu) # Change the main windows icon self.win.iconbitmap('pyc.ico') # Using tkinter Variable Classes strData = tk.StringVar() strData.set('Hello StringVar') # It is not necessary to create a tk.StringVar() strData = tk.StringVar() strData = self.spin.get() # Place cursor into name Entry self.bookTitle.focus() # Add a Tooltip to the Spinbox ToolTip(self.spin, 'This is a Spin control.') # Add Tooltips to more widgets ToolTip(self.bookTitle, 'This is an Entry control.') ToolTip(self.action, 'This is a Button control.') ToolTip(self.scr, 'This is a ScrolledText control.')
tkinter.Label(root, text='Сумма заказа с учётом скидки:', borderwidth=8).grid(row=11, column=1) result = tkinter.Label(root) result.grid(row=12, column=1) size1 = tkinter.StringVar() size2 = tkinter.StringVar() size3 = tkinter.StringVar() count1 = tkinter.IntVar() count2 = tkinter.IntVar() count3 = tkinter.IntVar() p1 = Combobox(root, values=['S', 'M'], textvariable=size1) p1.grid(row=1, column=1) c1 = Spinbox(root, from_=0, to=100, textvariable=count1) c1.grid(row=1, column=2) p2 = Combobox(root, values=['S', 'M'], textvariable=size2) p2.grid(row=2, column=1) c2 = Spinbox(root, from_=0, to=100, textvariable=count2) c2.grid(row=2, column=2) p3 = Combobox(root, values=['S', 'M'], textvariable=size3) p3.grid(row=3, column=1) c3 = Spinbox(root, from_=0, to=100, textvariable=count3) c3.grid(row=3, column=2) button1 = tkinter.Button(root, text='Заказать!', command=click) button1.grid(row=13, column=1) button2 = tkinter.Button(root, text='Выход', command=root.destroy) button2.grid(row=14, column=1)
class OOP(): def __init__(self): # Initializer method # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") # Create a Queue self.gui_queue = Queue() self.create_widgets() self.defaultFileEntries() # Start TCP/IP server in its own thread svr_thread = Thread(target=start_server, daemon=True) svr_thread.start() def defaultFileEntries(self): self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fDir) if len(fDir) > self.entryLen: self.fileEntry.config(width=35) # limit width to adjust GUI self.fileEntry.config(state='readonly') self.netwEntry.delete(0, tk.END) self.netwEntry.insert(0, netDir) if len(netDir) > self.entryLen: self.netwEntry.config(width=35) # limit width to adjust GUI # Create Queue instance def use_queues(self, loops=5): # Now using a class member Queue while True: q_item = self.gui_queue.get() print(q_item) self.scrol.insert(tk.INSERT, q_item + '\n') def method_in_a_thread(self, num_of_loops=10): for idx in range(num_of_loops): sleep(1) self.scrol.insert(tk.INSERT, str(idx) + '\n') # Running methods in Threads def create_thread(self, num=1): self.run_thread = Thread(target=self.method_in_a_thread, args=[num]) self.run_thread.setDaemon(True) self.run_thread.start() # start queue in its own thread write_thread = Thread(target=self.use_queues, args=[num], daemon=True) write_thread.start() # Button callback def click_me(self): self.action.configure(text='Hello ' + self.name.get()) bq.write_to_scrol(self) sleep(2) html_data = url.get_html() print(html_data) try: self.scrol.insert(tk.INSERT, html_data) except Exception as ex: print(ex) # Spinbox callback def _spin(self): value = self.spin.get() self.scrol.insert(tk.INSERT, value + '\n') # GUI Callback def checkCallback(self, *ignored_args): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton Callback def radCall(self): radSel = self.radVar.get() if radSel == 0: self.mighty2.configure(text='Blue') elif radSel == 1: self.mighty2.configure(text='Gold') elif radSel == 2: self.mighty2.configure(text='Red') # update progressbar in callback loop def run_progressbar(self): self.progress_bar["maximum"] = 100 for i in range(101): sleep(0.05) self.progress_bar["value"] = i # increment progressbar self.progress_bar.update() # have to call update() in loop self.progress_bar["value"] = 0 # reset/clear progressbar def start_progressbar(self): self.progress_bar.start() def stop_progressbar(self): self.progress_bar.stop() def progressbar_stop_after(self, wait_ms=1000): self.win.after(wait_ms, self.progress_bar.stop) def usingGlobal(self): global GLOBAL_CONST GLOBAL_CONST = 777 # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() ##################################################################################### def create_widgets(self): tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='Tab 1') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Tab 2') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # LabelFrame using tab1 as the parent mighty = ttk.LabelFrame(tab1, text=' Mighty Python ') mighty.grid(column=0, row=0, padx=8, pady=4) # Modify adding a Label using mighty as the parent instead of win a_label = ttk.Label(mighty, text="Enter a name:") a_label.grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget self.name = tk.StringVar() # self.name_entered = ttk.Entry(mighty, width=24, textvariable=self.name) self.name_entered = ttk.Entry(mighty, width=16, textvariable=self.name) self.name_entered.grid(column=0, row=1, sticky='W') self.name_entered.delete(0, tk.END) self.name_entered.insert(0, '< default name >') # Adding a Button self.action = ttk.Button(mighty, text="Click Me!", command=self.click_me) self.action.grid(column=2, row=1) ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0) number = tk.StringVar() self.number_chosen = ttk.Combobox(mighty, width=14, textvariable=number, state='readonly') self.number_chosen['values'] = (1, 2, 4, 42, 100) self.number_chosen.grid(column=1, row=1) self.number_chosen.current(0) # Adding a Spinbox widget self.spin = Spinbox(mighty, values=(1, 2, 4, 42, 100), width=5, bd=9, command=self._spin) # using range self.spin.grid(column=0, row=2, sticky='W') # align left # Using a scrolled Text control scrol_w = 38 scrol_h = 10 # increase sizes self.scrol = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD) self.scrol.grid(column=0, row=3, sticky='WE', columnspan=3) for child in mighty.winfo_children( ): # add spacing to align widgets within tabs child.grid_configure(padx=4, pady=2) #===================================================================================== # Tab Control 2 ---------------------------------------------------------------------- self.mighty2 = ttk.LabelFrame(tab2, text=' The Snake ') self.mighty2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.mighty2, text="Disabled", variable=chVarDis, state='disabled') check1.select() check1.grid(column=0, row=0, sticky=tk.W) chVarUn = tk.IntVar() check2 = tk.Checkbutton(self.mighty2, text="UnChecked", variable=chVarUn) check2.deselect() check2.grid(column=1, row=0, sticky=tk.W) chVarEn = tk.IntVar() check3 = tk.Checkbutton(self.mighty2, text="Enabled", variable=chVarEn) check3.deselect() check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons chVarUn.trace('w', lambda unused0, unused1, unused2: self.checkCallback()) chVarEn.trace('w', lambda unused0, unused1, unused2: self.checkCallback()) # First, we change our Radiobutton global variables into a list colors = ["Blue", "Gold", "Red"] # create three Radiobuttons using one variable self.radVar = tk.IntVar() # Next we are selecting a non-existing index value for radVar self.radVar.set(99) # Now we are creating all three Radiobutton widgets within one loop for col in range(3): curRad = tk.Radiobutton(self.mighty2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=1, sticky=tk.W) # And now adding tooltips ToolTip(curRad, 'This is a Radiobutton control') # Add a Progressbar to Tab 2 self.progress_bar = ttk.Progressbar(tab2, orient='horizontal', length=336, mode='determinate') self.progress_bar.grid(column=0, row=3, pady=2) # Create a container to hold buttons buttons_frame = ttk.LabelFrame(self.mighty2, text=' ProgressBar ') buttons_frame.grid(column=0, row=2, sticky='W', columnspan=2) # Add Buttons for Progressbar commands ttk.Button(buttons_frame, text=" Run Progressbar ", command=self.run_progressbar).grid(column=0, row=0, sticky='W') ttk.Button(buttons_frame, text=" Start Progressbar ", command=self.start_progressbar).grid(column=0, row=1, sticky='W') ttk.Button(buttons_frame, text=" Stop immediately ", command=self.stop_progressbar).grid(column=1, row=0, sticky='W') ttk.Button(buttons_frame, text=" Stop after second ", command=self.progressbar_stop_after).grid(column=1, row=1, sticky='W') for child in buttons_frame.winfo_children(): child.grid_configure(padx=2, pady=2) for child in self.mighty2.winfo_children(): child.grid_configure(padx=8, pady=2) # Create Manage Files Frame ------------------------------------------------ mngFilesFrame = ttk.LabelFrame(tab2, text=' Manage Files: ') mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFileName(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) print(fName) self.fileEntry.config(state='enabled') self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fName) if len(fName) > self.entryLen: self.fileEntry.config(width=len(fName) + 3) # Add Widgets to Manage Files Frame lb = ttk.Button(mngFilesFrame, text="Browse to File...", command=getFileName) lb.grid(column=0, row=0, sticky=tk.W) #----------------------------------------------------- file = tk.StringVar() self.entryLen = scrol_w - 4 self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) #----------------------------------------------------- logDir = tk.StringVar() self.netwEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dst = self.netwEntry.get() + '\\' + file try: shutil.copy(src, dst) msg.showinfo('Copy File to Network', 'Succes: File copied.') except FileNotFoundError as err: msg.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(err)) except Exception as ex: msg.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text="Copy File To : ", command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Creating a Menu Bar ========================================================== menu_bar = Menu(self.win) self.win.config(menu=menu_bar) # Add menu items file_menu = Menu(menu_bar, tearoff=0) file_menu.add_command(label="New") file_menu.add_separator() file_menu.add_command(label="Exit", command=self._quit) menu_bar.add_cascade(label="File", menu=file_menu) # Display a Message Box def _msgBox(): msg.showinfo( 'Python Message Info Box', 'A Python GUI created using tkinter:\nThe year is 2019.') # Add another Menu to the Menu Bar and an item help_menu = Menu(menu_bar, tearoff=0) help_menu.add_command( label="About", command=_msgBox) # display messagebox when clicked menu_bar.add_cascade(label="Help", menu=help_menu) # Change the main windows icon self.win.iconbitmap('pyc.ico') # It is not necessary to create a tk.StringVar() # strData = tk.StringVar() strData = self.spin.get() # call function self.usingGlobal() # self.name_entered.focus() # Set focus to Tab 2 # tabControl.select(1) # Add Tooltips ----------------------------------------------------- # Add a Tooltip to the Spinbox ToolTip(self.spin, 'This is a Spinbox control') # Add Tooltips to more widgets ToolTip(self.name_entered, 'This is an Entry control') ToolTip(self.action, 'This is a Button control') ToolTip(self.scrol, 'This is a ScrolledText control')
class DrumMachine: def __init__(self, root): self.root = root self.root.title(PROGRAM_NAME) self.all_patterns = [None] * MAX_NUMBER_OF_PATTERNS self.beats_per_minute = INITIAL_BEATS_PER_MINUTE self.current_pattern_index = 0 self.drum_load_entry_widget = [None] * MAX_NUMBER_OF_DRUM_SAMPLES self.init_all_patterns() self.init_gui() def init_all_patterns(self): self.all_patterns = [ { 'list_of_drum_files': [None] * MAX_NUMBER_OF_DRUM_SAMPLES, 'number_of_units': INITIAL_NUMBER_OF_UNITS, 'bpu': INITIAL_BPU, 'is_button_clicked_list': self.init_is_button_clicked_list( MAX_NUMBER_OF_DRUM_SAMPLES, INITIAL_NUMBER_OF_UNITS * INITIAL_BPU ) } for k in range(MAX_NUMBER_OF_PATTERNS)] def on_pattern_changed(self): pass def on_number_of_units_changed(self): pass def on_bpu_changed(self): pass def on_open_file_button_clicked(self, drum_index): pass def on_play_button_clicked(self): pass def on_stop_button_clicked(self): pass def on_loop_button_toggled(self): pass def on_beats_per_minute_changed(self): pass def init_is_button_clicked_list(self, num_of_rows, num_of_columns): return [[False] * num_of_columns for x in range(num_of_rows)] def get_button_value(self, row, col): return self.all_patterns[self.current_pattern_index][ 'is_button_clicked_list'][row][col] def find_number_of_columns(self): return int(self.number_of_units_widget.get()) * int(self.bpu_widget.get()) def process_button_clicked(self, row, col): self.set_button_value(row, col, not self.get_button_value(row, col)) self.display_button_color(row, col) def set_button_value(self, row, col, bool_value): self.all_patterns[self.current_pattern_index][ 'is_button_clicked_list'][row][col] = bool_value def on_button_clicked(self, row, col): def event_handler(): self.process_button_clicked(row, col) return event_handler def display_all_button_colors(self): number_of_columns = self.find_number_of_columns() for r in range(MAX_NUMBER_OF_DRUM_SAMPLES): for c in range(number_of_columns): self.display_button_color(r, c) def display_button_color(self, row, col): bpu = int(self.bpu_widget.get()) original_color = COLOR_1 if ((col//bpu) % 2) else COLOR_2 button_color = BUTTON_CLICKED_COLOR if self.get_button_value( row, col) else original_color self.buttons[row][col].config(background=button_color) def create_play_bar(self): playbar_frame = Frame(self.root, height=15) start_row = MAX_NUMBER_OF_DRUM_SAMPLES + 10 playbar_frame.grid(row=start_row, columnspan=13, sticky=W + E, padx=15, pady=10) self.play_icon = PhotoImage(file="images/play.gif") self.play_button = Button( playbar_frame, text='Play', image=self.play_icon, compound='left', command=self.on_play_button_clicked) self.play_button.grid(row=start_row, column=1, padx=2) Button(playbar_frame, text='Stop', command=self.on_stop_button_clicked).grid( row=start_row, column=3, padx=2) self.loopbutton = Checkbutton( playbar_frame, text='Loop', command=self.on_loop_button_toggled, textvariable=True) self.loopbutton.grid(row=start_row, column=16, padx=5) Label(playbar_frame, text='Beats Per Minute').grid( row=start_row, column=25) self.beats_per_minute_widget = Spinbox(playbar_frame, from_=MIN_BEATS_PER_MINUTE, to=MAX_BEATS_PER_MINUTE, width=5, increment=5.0, command=self.on_beats_per_minute_changed) self.beats_per_minute_widget.grid(row=start_row, column=30) self.beats_per_minute_widget.delete(0,"end") self.beats_per_minute_widget.insert(0,INITIAL_BEATS_PER_MINUTE) photo = PhotoImage(file='images/signature.gif') label = Label(playbar_frame, image=photo) label.image = photo label.grid(row=start_row, column=50, padx=1, sticky='w') def create_right_button_matrix(self): right_frame = Frame(self.root) right_frame.grid(row=10, column=6, sticky=W + E + N + S, padx=15, pady=4) self.buttons = [[None for x in range( self.find_number_of_columns())] for x in range(MAX_NUMBER_OF_DRUM_SAMPLES)] for row in range(MAX_NUMBER_OF_DRUM_SAMPLES): for col in range(self.find_number_of_columns()): self.buttons[row][col] = Button( right_frame, command=self.on_button_clicked(row, col)) self.buttons[row][col].grid(row=row, column=col) self.display_button_color(row, col) def create_left_drum_loader(self): left_frame = Frame(self.root) left_frame.grid(row=10, column=0, columnspan=6, sticky=W + E + N + S) open_file_icon = PhotoImage(file='images/openfile.gif') for i in range(MAX_NUMBER_OF_DRUM_SAMPLES): open_file_button = Button(left_frame, image=open_file_icon, command=self.on_open_file_button_clicked(i)) open_file_button.image = open_file_icon open_file_button.grid(row=i, column=0, padx=5, pady=4) self.drum_load_entry_widget[i] = Entry(left_frame) self.drum_load_entry_widget[i].grid( row=i, column=4, padx=7, pady=4) def create_top_bar(self): topbar_frame = Frame(self.root, height=25) topbar_frame.grid(row=0, columnspan=12, rowspan=10, padx=5, pady=5) Label(topbar_frame, text='Pattern Number:').grid(row=0, column=1) self.pattern_index_widget = Spinbox(topbar_frame, from_=0, to=MAX_NUMBER_OF_PATTERNS - 1, width=5, command=self.on_pattern_changed) self.pattern_index_widget.grid(row=0, column=2) self.current_pattern_name_widget = Entry(topbar_frame) self.current_pattern_name_widget.grid(row=0, column=3, padx=7, pady=2) Label(topbar_frame, text='Number of Units:').grid(row=0, column=4) self.number_of_units_widget = Spinbox(topbar_frame, from_=1, to=MAX_NUMBER_OF_UNITS, width=5, command=self.on_number_of_units_changed) self.number_of_units_widget.delete(0,"end") self.number_of_units_widget.insert(0,INITIAL_NUMBER_OF_UNITS) self.number_of_units_widget.grid(row=0, column=5) Label(topbar_frame, text='BPUs:').grid(row=0, column=6) self.bpu_widget = Spinbox(topbar_frame, from_=1, to=MAX_BPU, width=5, command=self.on_bpu_changed) self.bpu_widget.grid(row=0, column=7) self.bpu_widget.delete(0,"end") self.bpu_widget.insert(0,INITIAL_BPU) def create_top_menu(self): self.menu_bar = Menu(self.root) self.file_menu = Menu(self.menu_bar, tearoff=0) self.file_menu.add_command(label="Load Project") self.file_menu.add_command(label="Save Project") self.file_menu.add_separator() self.file_menu.add_command(label="Exit") self.menu_bar.add_cascade(label="File", menu=self.file_menu) self.about_menu = Menu(self.menu_bar, tearoff=0) self.about_menu.add_command(label="About") self.menu_bar.add_cascade(label="About", menu=self.about_menu) self.root.config(menu=self.menu_bar) def init_gui(self): self.create_top_menu() self.create_top_bar() self.create_left_drum_loader() self.create_right_button_matrix() self.create_play_bar()
ttk.Label(mainframe, text="Lower").grid(column=1, row=6, sticky=W) co = ttk.Combobox(mainframe, textvariable=co) co['values'] = gnc.COLONS co['state'] = 'readonly' co.grid(column=2, row=6, sticky=W) ttk.Label(mainframe, text="Anal").grid(column=1, row=7, sticky=W) ba = ttk.Combobox(mainframe, textvariable=ba) ba['values'] = gnc.BANDING ba['state'] = 'readonly' ba.grid(column=2, row=7, sticky=W) ttk.Label(mainframe, text="Clips").grid(column=1, row=8, sticky=W) s = Spinbox(mainframe, from_=0, to=20, textvariable=cl) s.grid(column=2, row=8, sticky=W) ttk.Label(mainframe, text="Consult").grid(column=1, row=9, sticky=W) con = ttk.Combobox(mainframe, textvariable=con) con['values'] = gnc.CONSULT_LIST con['state'] = 'readonly' con.grid(column=2, row=9, sticky=W) ttk.Label(mainframe, text="Message").grid(column=1, row=10, sticky=W) ttk.Entry(mainframe, textvariable=mes).grid(column=2, row=10, sticky=W) ttk.Label(mainframe, text="Time").grid(column=1, row=11, sticky=W) ti = Spinbox(mainframe, from_=0, to=90, textvariable=ot) ti.grid(column=2, row=11, sticky=W)
class OOP(): def __init__(self): # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") # Disable resizing the window self.win.resizable(0,0) # Create a Queue self.guiQueue = Queue() self.createWidgets() # populate Tab 2 Entries self.defaultFileEntries() # create MySQL instance self.mySQL = MySQL() def defaultFileEntries(self): self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, 'Z:\\') # bogus path self.fileEntry.config(state='readonly') self.netwEntry.delete(0, tk.END) self.netwEntry.insert(0, 'Z:\\Backup') # bogus path # Combobox callback def _combo(self, val=0): value = self.combo.get() self.scr.insert(tk.INSERT, value + '\n') # Spinbox callback def _spin(self): value = self.spin.get() self.scr.insert(tk.INSERT, value + '\n') # Checkbox callback def checkCallback(self, *ignoredArgs): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton callback function def radCall(self): radSel=self.radVar.get() if radSel == 0: self.mySQL2.configure(text=WIDGET_LABEL + 'in Blue') elif radSel == 1: self.mySQL2.configure(text=WIDGET_LABEL + 'in Gold') elif radSel == 2: self.mySQL2.configure(text=WIDGET_LABEL + 'in Red') # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() def methodInAThread(self, numOfLoops=10): for idx in range(numOfLoops): sleep(1) self.scr.insert(tk.INSERT, str(idx) + '\n') sleep(1) print('methodInAThread():', self.runT.isAlive()) # Running methods in Threads def createThread(self, num): self.runT = Thread(target=self.methodInAThread, args=[num]) self.runT.setDaemon(True) self.runT.start() print(self.runT) print('createThread():', self.runT.isAlive()) # textBoxes are the Consumers of Queue data writeT = Thread(target=self.useQueues, daemon=True) writeT.start() # Create Queue instance def useQueues(self): # Now using a class member Queue while True: qItem = self.guiQueue.get() print(qItem) self.scr.insert(tk.INSERT, qItem + '\n') # Button callback def insertQuote(self): title = self.bookTitle.get() page = self.pageNumber.get() quote = self.quote.get(1.0, tk.END) print(title) print(quote) self.mySQL.insertBooks(title, page, quote) # Button callback def getQuote(self): allBooks = self.mySQL.showBooks() print(allBooks) self.quote.insert(tk.INSERT, allBooks) # Button callback def modifyQuote(self): raise NotImplementedError("This still needs to be implemented for the SQL command.") ##################################################################################### def createWidgets(self): # Tab Control introduced here -------------------------------------- tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='MySQL') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Widgets') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # ~ Tab Control introduced here ----------------------------------------- # We are creating a container frame to hold all other widgets self.mySQL = ttk.LabelFrame(tab1, text=' Python Database ') self.mySQL.grid(column=0, row=0, padx=8, pady=4) # Creating a Label ttk.Label(self.mySQL, text="Book Title:").grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget book = tk.StringVar() self.bookTitle = ttk.Entry(self.mySQL, width=34, textvariable=book) self.bookTitle.grid(column=0, row=1, sticky='W') # Adding a Textbox Entry widget book1 = tk.StringVar() self.bookTitle1 = ttk.Entry(self.mySQL, width=34, textvariable=book1) self.bookTitle1.grid(column=0, row=2, sticky='W') # Adding a Textbox Entry widget book2 = tk.StringVar() self.bookTitle2 = ttk.Entry(self.mySQL, width=34, textvariable=book2) self.bookTitle2.grid(column=0, row=3, sticky='W') # Creating a Label ttk.Label(self.mySQL, text="Page:").grid(column=1, row=0, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber.grid(column=1, row=1, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber1 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber1.grid(column=1, row=2, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber2 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber2.grid(column=1, row=3, sticky='W') # Adding a Button self.action = ttk.Button(self.mySQL, text="Insert Quote", command=self.insertQuote) self.action.grid(column=2, row=1) # Adding a Button self.action1 = ttk.Button(self.mySQL, text="Get Quotes", command=self.getQuote) self.action1.grid(column=2, row=2) # Adding a Button self.action2 = ttk.Button(self.mySQL, text="Mody Quote", command=self.modifyQuote) self.action2.grid(column=2, row=3) # Add some space around each widget for child in self.mySQL.winfo_children(): child.grid_configure(padx=2, pady=4) quoteFrame = ttk.LabelFrame(tab1, text=' Book Quotation ') quoteFrame.grid(column=0, row=1, padx=8, pady=4) # Using a scrolled Text control quoteW = 40; quoteH = 6 self.quote = scrolledtext.ScrolledText(quoteFrame, width=quoteW, height=quoteH, wrap=tk.WORD) self.quote.grid(column=0, row=8, sticky='WE', columnspan=3) # Add some space around each widget for child in quoteFrame.winfo_children(): child.grid_configure(padx=2, pady=4) #====================================================================================================== # Tab Control 2 #====================================================================================================== # We are creating a container frame to hold all other widgets -- Tab2 self.mySQL2 = ttk.LabelFrame(tab2, text=WIDGET_LABEL) self.mySQL2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons self.chVarDis = tk.IntVar() self.check1 = tk.Checkbutton(self.mySQL2, text="Disabled", variable=self.chVarDis, state='disabled') self.check1.select() self.check1.grid(column=0, row=0, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.mySQL2, text="UnChecked", variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=0, sticky=tk.W ) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.mySQL2, text="Toggle", variable=self.chVarEn) self.check3.deselect() self.check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons self.chVarUn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) self.chVarEn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) # Radiobutton list colors = ["Blue", "Gold", "Red"] self.radVar = tk.IntVar() # Selecting a non-existing index value for radVar self.radVar.set(99) # Creating all three Radiobutton widgets within one loop for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.mySQL2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=6, sticky=tk.W, columnspan=3) # And now adding tooltips tt.createToolTip(curRad, 'This is a Radiobutton control.') # Create a container to hold labels labelsFrame = ttk.LabelFrame(self.mySQL2, text=' Labels within a Frame ') labelsFrame.grid(column=0, row=7, pady=6) # Place labels into the container element - vertically ttk.Label(labelsFrame, text="Choose a number:").grid(column=0, row=0) ttk.Label(labelsFrame, text="Label 2").grid(column=0, row=1) # Add some space around each label for child in labelsFrame.winfo_children(): child.grid_configure(padx=6, pady=1) number = tk.StringVar() self.combo = ttk.Combobox(self.mySQL2, width=12, textvariable=number) self.combo['values'] = (1, 2, 4, 42, 100) self.combo.grid(column=1, row=7, sticky=tk.W) self.combo.current(0) self.combo.bind('<<ComboboxSelected>>', self._combo) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.mySQL2, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self._spin) self.spin.grid(column=2, row=7, sticky='W,', padx=6, pady=1) # Using a scrolled Text control scrolW = 40; scrolH = 1 self.scr = scrolledtext.ScrolledText(self.mySQL2, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=8, sticky='WE', columnspan=3) # Create Manage Files Frame ------------------------------------------------ mngFilesFrame = ttk.LabelFrame(tab2, text=' Manage Files: ') mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFileName(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) print(fName) self.fileEntry.config(state='enabled') self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fName) if len(fName) > self.entryLen: self.fileEntry.config(width=len(fName) + 3) # Add Widgets to Manage Files Frame lb = ttk.Button(mngFilesFrame, text="Browse to File...", command=getFileName) lb.grid(column=0, row=0, sticky=tk.W) #----------------------------------------------------- file = tk.StringVar() self.entryLen = scrolW - 4 self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) #----------------------------------------------------- logDir = tk.StringVar() self.netwEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dst = self.netwEntry.get() + '\\'+ file try: shutil.copy(src, dst) mBox.showinfo('Copy File to Network', 'Succes: File copied.') except FileNotFoundError as err: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(err)) except Exception as ex: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text="Copy File To : ", command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Creating a Menu Bar ========================================================== menuBar = Menu(tab1) self.win.config(menu=menuBar) # Add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label="New") fileMenu.add_separator() fileMenu.add_command(label="Exit", command=self._quit) menuBar.add_cascade(label="File", menu=fileMenu) # Add another Menu to the Menu Bar and an item helpMenu = Menu(menuBar, tearoff=0) helpMenu.add_command(label="About") menuBar.add_cascade(label="Help", menu=helpMenu) # Change the main windows icon self.win.iconbitmap(r'C:\Python34\DLLs\pyc.ico') # Using tkinter Variable Classes strData = tk.StringVar() strData.set('Hello StringVar') # It is not necessary to create a tk.StringVar() strData = tk.StringVar() strData = self.spin.get() # Place cursor into name Entry self.bookTitle.focus() # Add a Tooltip to the Spinbox tt.createToolTip(self.spin, 'This is a Spin control.') # Add Tooltips to more widgets tt.createToolTip(self.bookTitle, 'This is an Entry control.') tt.createToolTip(self.action, 'This is a Button control.') tt.createToolTip(self.scr, 'This is a ScrolledText control.')
def createWidgets(self): '''Create and align widgets''' top = self.winfo_toplevel() top.rowconfigure(0, weight=1) top.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.passwordout = StringVar() self.passwordout.set('- No password generated -') self.isnew = IntVar() ttitle = Label(self, text=versionStr, font=self.getFont(4)) wisnew = Checkbutton(self, height=2, font=self.getFont(), text=('This is a new password, that I have not ' 'used before'), variable=self.isnew, command=self.toggleCheck) tlabel = Label(self, text='Label', font=self.getFont(2)) tpasswordin1 = Label(self, text='Password', font=self.getFont(2)) tpasswordin2 = Label(self, text='Password (again)', font=self.getFont(2)) tlength = Label(self, text='Length', font=self.getFont(2)) talgorithm = Label(self, text='Algorithm', font=self.getFont(2)) tsequence = Label(self, text='Sequence #', font=self.getFont(2)) self.label = ttk.Combobox(self, width=27, font=self.getFont(), postcommand=self.filterLabels) self.passwordin1 = Entry(self, width=27, font=self.getFont(), show="*") self.passwordin2 = Entry(self, width=27, font=self.getFont(), show="*", state=DISABLED) length = Spinbox(self, width=3, font=self.getFont, from_=9, to=171, textvariable=self.lengthVar) self.algorithm = ttk.Combobox(self, width=27, font=self.getFont(), values=algos.algorithms) sequence = Spinbox(self, width=3, font=self.getFont, from_=1, to=sys.maxsize, textvariable=self.sequenceVar) genbutton = Button(self, text="Generate password", font=self.getFont(), command=self.validateAndShow, default="active") clrbutton = Button(self, text="Clear fields", font=self.getFont(), command=self.clearIO) self.result = Entry(self, font=self.getFont(4), textvariable=self.passwordout, state="readonly", fg="black", readonlybackground="gray") # Keybindings self.passwordin1.bind('<Return>', lambda e: genbutton.invoke()) self.passwordin2.bind('<Return>', lambda e: genbutton.invoke()) length.bind('<Return>', lambda e: genbutton.invoke()) self.algorithm.bind('<Return>', lambda e: genbutton.invoke()) sequence.bind('<Return>', lambda e: genbutton.invoke()) self.master.bind('<Control-q>', lambda e: self.quit()) self.master.bind('<Escape>', lambda e: self.reset()) self.label.bind('<<ComboboxSelected>>', self.labelSelected) self.label.bind('<FocusOut>', self.labelFocusOut) # Layout widgets in a grid ttitle.grid(row=0, column=0, sticky=N + S + E + W, columnspan=2) wisnew.grid(row=1, column=0, sticky=N + S + E + W, columnspan=2) tlabel.grid(row=2, column=0, sticky=N + S + W) self.label.grid(row=2, column=1, sticky=N + S + E + W) tpasswordin1.grid(row=3, column=0, sticky=N + S + W) self.passwordin1.grid(row=3, column=1, sticky=N + S + E + W) tpasswordin2.grid(row=4, column=0, sticky=N + S + W) self.passwordin2.grid(row=4, column=1, sticky=N + S + E + W) tlength.grid(row=5, column=0, sticky=N + S + W) length.grid(row=5, column=1, sticky=N + S + E + W) talgorithm.grid(row=6, column=0, sticky=N + S + W) self.algorithm.grid(row=6, column=1, sticky=N + S + E + W) tsequence.grid(row=7, column=0, sticky=N + S + W) sequence.grid(row=7, column=1, sticky=N + S + E + W) clrbutton.grid(row=8, column=0, sticky=N + S + E + W, columnspan=2) genbutton.grid(row=9, column=0, sticky=N + S + E + W, columnspan=2) self.result.grid(row=10, column=0, sticky=N + S + E + W, columnspan=2) # Initial values self.algorithm.set(self.settings.algorithm) # Initially, set focus on self.label self.label.focus_set()
class OOP(): def __init__(self): # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") # Disable resizing the window self.win.resizable(0,0) # Create a Queue self.guiQueue = Queue() self.createWidgets() # populate Tab 2 Entries self.defaultFileEntries() # Start TCP/IP server in its own thread svrT = Thread(target=startServer, daemon=True) svrT.start() def defaultFileEntries(self): # populate Entry before making it read-only #self.fileEntry.config(state='readonly') self.fileEntry.delete(0, tk.END) #self.fileEntry.insert(0, fDir) self.fileEntry.insert(0, 'Z:\\') # bogus path # if len(fDir) > self.entryLen: # self.fileEntry.config(width=len(fDir) + 3) self.fileEntry.config(state='readonly') self.netwEntry.delete(0, tk.END) #self.netwEntry.insert(0, netDir) self.netwEntry.insert(0, 'Z:\\Backup') # bogus path # if len(netDir) > self.entryLen: # self.netwEntry.config(width=len(netDir) + 3) # Button callback def clickMe(self): self.action.configure(text='Hello ' + self.name.get()) # # Non-threaded code with sleep freezes the GUI # for idx in range(10): # sleep(5) # self.scr.insert(tk.INSERT, str(idx) + '\n') # # Threaded method does not freeze our GUI # self.createThread() # Passing in the current class instance (self) print(self) bq.writeToScrol(self) sleep(2) htmlData = url.getHtml() print(htmlData) self.scr.insert(tk.INSERT, htmlData) # Spinbox callback def _spin(self): value = self.spin.get() #print(value) self.scr.insert(tk.INSERT, value + '\n') # Checkbox callback def checkCallback(self, *ignoredArgs): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton callback function def radCall(self): radSel=self.radVar.get() if radSel == 0: self.monty2.configure(text='Blue') elif radSel == 1: self.monty2.configure(text='Gold') elif radSel == 2: self.monty2.configure(text='Red') # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() def methodInAThread(self): print('Hi, how are you?') # for idx in range(10): # sleep(5) # self.scr.insert(tk.INSERT, str(idx) + '\n') # def methodInAThread(self, numOfLoops=10): # for idx in range(numOfLoops): # sleep(1) # self.scr.insert(tk.INSERT, str(idx) + '\n') # sleep(1) # print('methodInAThread():', self.runT.isAlive()) # Running methods in Threads def createThread(self, num): self.runT = Thread(target=self.methodInAThread, args=[num]) self.runT.setDaemon(True) self.runT.start() print(self.runT) print('createThread():', self.runT.isAlive()) # textBoxes are the Consumers of Queue data writeT = Thread(target=self.useQueues, daemon=True) writeT.start() # Create Queue instance def useQueues(self): # guiQueue = Queue() # print(guiQueue) # for idx in range(10): # guiQueue.put('Message from a queue: ' + str(idx)) # while True: # print(guiQueue.get()) # Now using a class member Queue while True: qItem = self.guiQueue.get() print(qItem) self.scr.insert(tk.INSERT, qItem + '\n') ##################################################################################### def createWidgets(self): # Tab Control introduced here -------------------------------------- tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='Tab 1') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Tab 2') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # ~ Tab Control introduced here ----------------------------------------- # We are creating a container frame to hold all other widgets self.monty = ttk.LabelFrame(tab1, text=' Monty Python ') self.monty.grid(column=0, row=0, padx=8, pady=4) # Changing our Label ttk.Label(self.monty, text="Enter a name:").grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget self.name = tk.StringVar() nameEntered = ttk.Entry(self.monty, width=24, textvariable=self.name) nameEntered.grid(column=0, row=1, sticky='W') nameEntered.delete(0, tk.END) nameEntered.insert(0, '< default name >') # Adding a Button self.action = ttk.Button(self.monty, text="Click Me!", command=self.clickMe) self.action.grid(column=2, row=1) ttk.Label(self.monty, text="Choose a number:").grid(column=1, row=0) number = tk.StringVar() numberChosen = ttk.Combobox(self.monty, width=14, textvariable=number) numberChosen['values'] = (1, 2, 4, 42, 100) numberChosen.grid(column=1, row=1) numberChosen.current(0) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.monty, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self._spin) self.spin.grid(column=0, row=2, sticky='W') # Using a scrolled Text control scrolW = 40; scrolH = 10 self.scr = scrolledtext.ScrolledText(self.monty, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=3, sticky='WE', columnspan=3) # Tab Control 2 refactoring --------------------------------------------------- # We are creating a container frame to hold all other widgets -- Tab2 self.monty2 = ttk.LabelFrame(tab2, text=' The Snake ') self.monty2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.monty2, text="Disabled", variable=chVarDis, state='disabled') check1.select() check1.grid(column=0, row=0, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.monty2, text="UnChecked", variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=0, sticky=tk.W ) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.monty2, text="Toggle", variable=self.chVarEn) self.check3.deselect() self.check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons self.chVarUn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) self.chVarEn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) # ~ Tab Control 2 refactoring ----------------------------------------- # Radiobutton list colors = ["Blue", "Gold", "Red"] self.radVar = tk.IntVar() # Selecting a non-existing index value for radVar self.radVar.set(99) # Creating all three Radiobutton widgets within one loop for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.monty2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=6, sticky=tk.W, columnspan=3) # And now adding tooltips tt.createToolTip(curRad, 'This is a Radiobutton control.') # Create a container to hold labels labelsFrame = ttk.LabelFrame(self.monty2, text=' Labels in a Frame ') labelsFrame.grid(column=0, row=7) # Place labels into the container element - vertically ttk.Label(labelsFrame, text="Label1").grid(column=0, row=0) ttk.Label(labelsFrame, text="Label2").grid(column=0, row=1) # Add some space around each label for child in labelsFrame.winfo_children(): child.grid_configure(padx=8) # Create Manage Files Frame ------------------------------------------------ mngFilesFrame = ttk.LabelFrame(tab2, text=' Manage Files: ') mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFileName(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) print(fName) self.fileEntry.config(state='enabled') self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fName) if len(fName) > self.entryLen: self.fileEntry.config(width=len(fName) + 3) # Add Widgets to Manage Files Frame lb = ttk.Button(mngFilesFrame, text="Browse to File...", command=getFileName) lb.grid(column=0, row=0, sticky=tk.W) #----------------------------------------------------- file = tk.StringVar() self.entryLen = scrolW - 4 self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) #----------------------------------------------------- logDir = tk.StringVar() self.netwEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dst = self.netwEntry.get() + '\\'+ file try: shutil.copy(src, dst) mBox.showinfo('Copy File to Network', 'Succes: File copied.') except FileNotFoundError as err: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(err)) except Exception as ex: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text="Copy File To : ", command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Creating a Menu Bar ========================================================== menuBar = Menu(tab1) self.win.config(menu=menuBar) # Add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label="New") fileMenu.add_separator() fileMenu.add_command(label="Exit", command=self._quit) menuBar.add_cascade(label="File", menu=fileMenu) # Add another Menu to the Menu Bar and an item helpMenu = Menu(menuBar, tearoff=0) helpMenu.add_command(label="About") menuBar.add_cascade(label="Help", menu=helpMenu) # Change the main windows icon self.win.iconbitmap(r'C:\Python34\DLLs\pyc.ico') # Using tkinter Variable Classes strData = tk.StringVar() strData.set('Hello StringVar') # It is not necessary to create a tk.StringVar() strData = tk.StringVar() strData = self.spin.get() # Place cursor into name Entry # nameEntered.focus() # Set focus to Tab 2 tabControl.select(1) # Add a Tooltip to the Spinbox tt.createToolTip(self.spin, 'This is a Spin control.') # Add Tooltips to more widgets tt.createToolTip(nameEntered, 'This is an Entry control.') tt.createToolTip(self.action, 'This is a Button control.') tt.createToolTip(self.scr, 'This is a ScrolledText control.')
class OOP(): def __init__(self, language='en'): # Create instance self.win = tk.Tk() self.i18n = I18N(language) # self.i18n = I18N(language) # Add a title self.win.title(self.i18n.title) # Callback methods now in different module self.callBacks = Callbacks(self) # Disable resizing the window self.win.resizable(0,0) # Create a Queue self.guiQueue = Queue() self.createWidgets() # populate Tab 2 Entries self.callBacks.defaultFileEntries() # create MySQL instance self.mySQL = MySQL() # create Logger instance fullPath = path.realpath(__file__) self.log = Logger(fullPath) # create Log Level instance self.level = LogLevel() ##################################################################################### def createWidgets(self): # Tab Control introduced here -------------------------------------- tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab # tabControl.add(tab1, text='MySQL') # Add the tab -- COMMENTED OUT FOR CH08 tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Widgets') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # ~ Tab Control introduced here ----------------------------------------- # We are creating a container frame to hold all other widgets self.mySQL = ttk.LabelFrame(tab1, text=' Python Database ') self.mySQL.grid(column=0, row=0, padx=8, pady=4) # Creating a Label ttk.Label(self.mySQL, text="Book Title:").grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget book = tk.StringVar() self.bookTitle = ttk.Entry(self.mySQL, width=34, textvariable=book) self.bookTitle.grid(column=0, row=1, sticky='W') # Adding a Textbox Entry widget book1 = tk.StringVar() self.bookTitle1 = ttk.Entry(self.mySQL, width=34, textvariable=book1) self.bookTitle1.grid(column=0, row=2, sticky='W') # Adding a Textbox Entry widget book2 = tk.StringVar() self.bookTitle2 = ttk.Entry(self.mySQL, width=34, textvariable=book2) self.bookTitle2.grid(column=0, row=3, sticky='W') # Creating a Label ttk.Label(self.mySQL, text="Page:").grid(column=1, row=0, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber.grid(column=1, row=1, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber1 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber1.grid(column=1, row=2, sticky='W') # Adding a Textbox Entry widget page = tk.StringVar() self.pageNumber2 = ttk.Entry(self.mySQL, width=6, textvariable=page) self.pageNumber2.grid(column=1, row=3, sticky='W') # Adding a Button self.action = ttk.Button(self.mySQL, text="Insert Quote", command=self.callBacks.insertQuote) self.action.grid(column=2, row=1) # Adding a Button self.action1 = ttk.Button(self.mySQL, text="Get Quotes", command=self.callBacks.getQuote) self.action1.grid(column=2, row=2) # Adding a Button self.action2 = ttk.Button(self.mySQL, text="Mody Quote", command=self.callBacks.modifyQuote) self.action2.grid(column=2, row=3) # Add some space around each widget for child in self.mySQL.winfo_children(): child.grid_configure(padx=2, pady=4) quoteFrame = ttk.LabelFrame(tab1, text=' Book Quotation ') quoteFrame.grid(column=0, row=1, padx=8, pady=4) # Using a scrolled Text control quoteW = 40; quoteH = 6 self.quote = scrolledtext.ScrolledText(quoteFrame, width=quoteW, height=quoteH, wrap=tk.WORD) self.quote.grid(column=0, row=8, sticky='WE', columnspan=3) # Add some space around each widget for child in quoteFrame.winfo_children(): child.grid_configure(padx=2, pady=4) #====================================================================================================== # Tab Control 2 #====================================================================================================== # We are creating a container frame to hold all other widgets -- Tab2 self.widgetFrame = ttk.LabelFrame(tab2, text=self.i18n.WIDGET_LABEL) self.widgetFrame.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons self.chVarDis = tk.IntVar() self.check1 = tk.Checkbutton(self.widgetFrame, text=self.i18n.disabled, variable=self.chVarDis, state='disabled') self.check1.select() self.check1.grid(column=0, row=0, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.widgetFrame, text=self.i18n.unChecked, variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=0, sticky=tk.W ) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.widgetFrame, text=self.i18n.toggle, variable=self.chVarEn) self.check3.deselect() self.check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons self.chVarUn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) self.chVarEn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) # Radiobutton list colors = self.i18n.colors self.radVar = tk.IntVar() # Selecting a non-existing index value for radVar self.radVar.set(99) # Creating all three Radiobutton widgets within one loop for col in range(3): self.curRad = 'rad' + str(col) self.curRad = tk.Radiobutton(self.widgetFrame, text=colors[col], variable=self.radVar, value=col, command=self.callBacks.radCall) self.curRad.grid(column=col, row=6, sticky=tk.W, columnspan=3) # And now adding tooltips tt.createToolTip(self.curRad, 'This is a Radiobutton control.') # Create a container to hold labels labelsFrame = ttk.LabelFrame(self.widgetFrame, text=self.i18n.labelsFrame) labelsFrame.grid(column=0, row=7, pady=6) # Place labels into the container element - vertically ttk.Label(labelsFrame, text=self.i18n.chooseNumber).grid(column=0, row=0) self.lbl2 = tk.StringVar() self.lbl2.set(self.i18n.label2) ttk.Label(labelsFrame, textvariable=self.lbl2).grid(column=0, row=1) # Add some space around each label for child in labelsFrame.winfo_children(): child.grid_configure(padx=6, pady=1) number = tk.StringVar() self.combo = ttk.Combobox(self.widgetFrame, width=12, textvariable=number) self.combo['values'] = (1, 2, 4, 42, 100) self.combo.grid(column=1, row=7, sticky=tk.W) self.combo.current(0) self.combo.bind('<<ComboboxSelected>>', self.callBacks._combo) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.widgetFrame, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self.callBacks._spin) self.spin.grid(column=2, row=7, sticky='W,', padx=6, pady=1) # Using a scrolled Text control scrolW = 40; scrolH = 1 self.scr = scrolledtext.ScrolledText(self.widgetFrame, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=8, sticky='WE', columnspan=3) # Adding a TZ Button self.allTZs = ttk.Button(self.widgetFrame, text=self.i18n.timeZones, command=self.callBacks.allTimeZones) self.allTZs.grid(column=0, row=9, sticky='WE') # Adding local TZ Button self.localTZ = ttk.Button(self.widgetFrame, text=self.i18n.localZone, command=self.callBacks.localZone) self.localTZ.grid(column=1, row=9, sticky='WE') # Adding getTime TZ Button self.dt = ttk.Button(self.widgetFrame, text=self.i18n.getTime, command=self.callBacks.getDateTime) self.dt.grid(column=2, row=9, sticky='WE') # Create Manage Files Frame ------------------------------------------------ mngFilesFrame = ttk.LabelFrame(tab2, text=self.i18n.mgrFiles) mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFileName(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) print(fName) self.fileEntry.config(state='enabled') self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fName) if len(fName) > self.entryLen: self.fileEntry.config(width=len(fName) + 3) # Add Widgets to Manage Files Frame lb = ttk.Button(mngFilesFrame, text=self.i18n.browseTo, command=getFileName) lb.grid(column=0, row=0, sticky=tk.W) #----------------------------------------------------- file = tk.StringVar() self.entryLen = scrolW - 4 self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) #----------------------------------------------------- logDir = tk.StringVar() self.netwEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dst = self.netwEntry.get() + '\\'+ file try: shutil.copy(src, dst) mBox.showinfo('Copy File to Network', 'Succes: File copied.') except FileNotFoundError as err: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(err)) except Exception as ex: mBox.showerror('Copy File to Network', '*** Failed to copy file! ***\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text=self.i18n.copyTo, command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Creating a Menu Bar ========================================================== menuBar = Menu(tab1) self.win.config(menu=menuBar) # Add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label=self.i18n.new) fileMenu.add_separator() fileMenu.add_command(label=self.i18n.exit, command=self.callBacks._quit) menuBar.add_cascade(label=self.i18n.file, menu=fileMenu) # Add another Menu to the Menu Bar and an item helpMenu = Menu(menuBar, tearoff=0) helpMenu.add_command(label=self.i18n.about) menuBar.add_cascade(label=self.i18n.help, menu=helpMenu) # Change the main windows icon self.win.iconbitmap(r'C:\Python34\DLLs\pyc.ico') # Using tkinter Variable Classes strData = tk.StringVar() strData.set('Hello StringVar') # It is not necessary to create a tk.StringVar() strData = tk.StringVar() strData = self.spin.get() # Place cursor into name Entry self.bookTitle.focus() # Add a Tooltip to the Spinbox tt.createToolTip(self.spin, 'This is a Spin control.') # Add Tooltips to more widgets tt.createToolTip(self.bookTitle, 'This is an Entry control.') tt.createToolTip(self.action, 'This is a Button control.') tt.createToolTip(self.scr, 'This is a ScrolledText control.')
class OOP(): def __init__(self): self.win = tk.Tk() self.win.title('Python GUI') self.win.iconbitmap(r'C:\Anaconda3\DLLs\pyc.ico') self.createWidgets() # add button click callback function def clickMe(self): self.action.configure(text="Hello " + self.name.get() + ' ' + self.numberChosen.get()) # display message back # callback function def _msgBox(self) : mBox.showinfo('Python Message Info Box','A Python GUI created using tkinter:\n\nThe year is 2016.') # mBox.showwarning('Python Message Warning Box','A Python GUI created using tkinter:\n\n' # 'Warning: There might be a bug in this code') # mBox.showerror('Python Message Error Box','A Python GUI created using tkinter:\n\nError: Housseton ~ we DO have a serious PROBLEM!') answer = mBox.askyesno('Python Message Dual Choice Box', 'Are ou sure you really wish to do this?') print(answer) # radiobutton callback def radCall(self): radSel = self.radVar.get() if radSel == 0: self.monty2.configure(text='Blue') elif radSel == 1: self.monty2.configure(text='Gold') elif radSel == 2: self.monty2.configure(text='Red') # spin callback def _spin(self): value = self.spin.get() print(value) self.scr.insert(tk.INSERT, value + '\n') def createWidgets(self): tabControl= ttk.Notebook(self.win) tab1=ttk.Frame(tabControl) tabControl.add(tab1, text='Tab 1') tab2 = ttk.Frame(tabControl) tabControl.add(tab2, text='Tab 2') tab3 = ttk.Frame(tabControl) tabControl.add(tab3, text='Tab 3') tabControl.pack(expand=1, fill='both') tab3=tk.Frame(tab3,bg='blue') tab3.pack() for orangeColor in range(2): canvas = tk.Canvas(tab3, width=150,height=80,highlightthickness=0,bg='orange') canvas.grid(row=orangeColor,column=orangeColor) # create container to hold all widgets self.monty = ttk.LabelFrame(tab1,text=' Monty Python ') self.monty.grid(column=0,row=0,padx=8,pady=4) self.monty2 = ttk.LabelFrame(tab2,text=' The Snake ') self.monty2.grid(column=0,row=0,padx=8,pady=4) #Label ttk.Label(self.monty,text="Enter a name:").grid(column=0,row=0,sticky='W') #add a text box widget name = tk.StringVar() self.nameEntered = ttk.Entry(self.monty, width=12, textvariable=name) self.nameEntered.grid(column=0,row=1,sticky=tk.W) tt.createToolTip(self.nameEntered, 'This is an entry control') # combo box and label ttk.Label(self.monty, text='Choose a number:').grid(column=1, row=0) number = tk.StringVar() numberChosen = ttk.Combobox(self.monty, width=12, textvariable=number, state='readonly') numberChosen['values'] = (1,2,4,42,100) numberChosen.grid(column=1, row=1) numberChosen.current(0) # add a button action = ttk.Button(self.monty, text="Click Me!", command=self.clickMe) action.grid(column=2, row=1) #action.configure(state='disabled') #add check boxes chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.monty2, text='Disabled',variable=chVarDis, state='disabled') check1.select() check1.grid(column=0,row=4, sticky=tk.W) chVarUn = tk.IntVar() check2 = tk.Checkbutton(self.monty2, text='UnChecked',variable=chVarUn) check2.deselect() check2.grid(column=1,row=4,sticky=tk.W) chVarEn = tk.IntVar() check3 = tk.Checkbutton(self.monty2, text='Enabled',variable=chVarEn) check3.select() check3.grid(column=2,row=4,sticky=tk.W) # Radiobutton list colors = ["Blue", "Gold", "Red"] #create three radio buttons self.radVar=tk.IntVar() self.radVar.set(99) for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.monty2, text=colors[col], variable=self.radVar, value = col, command=self.radCall) curRad.grid(column=col, row=5, sticky=tk.W) #add a spinbox self.spin = Spinbox(self.monty,from_=0,to=10,width=5,bd=8, command=self._spin) self.spin.grid(column=0,row=2) # add a tooltip tt.createToolTip(self.spin,'This is a Spin control.') spin2 = Spinbox(self.monty, values=(0,50,100),width=5,bd=10,command=self._spin,relief=tk.RIDGE) spin2.grid(column=1,row=2) # add scrolled text widget scrolW= 50 scrolH = 3 self.scr = scrolledtext.ScrolledText(self.monty, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, sticky='WE',columnspan=3) #scr.grid(column=0, columnspan=3) tt.createToolTip(self.scr,'This is a ScrolledText widget.') # container to hold labels labelsFrame = ttk.LabelFrame(self.monty, text=' Labels in a Frame ') labelsFrame.grid(column=0,row=7,padx=20,pady=40) # place labels into the container ttk.Label(labelsFrame,text='Label1').grid(column=0,row=0) ttk.Label(labelsFrame,text='Label2').grid(column=0,row=1) ttk.Label(labelsFrame,text='Label3').grid(column=0,row=2) for child in labelsFrame.winfo_children(): child.grid_configure(padx=8,pady=4) # menu commands def _quit(self): self.win.quit() self.win.destroy() exit() #create menubar menuBar=Menu(self.win) self.win.config(menu=menuBar) # add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label='New') fileMenu.add_separator() fileMenu.add_command(label='Exit', command=_quit) menuBar.add_cascade(label='File',menu=fileMenu) helpMenu = Menu(menuBar,tearoff=0) helpMenu.add_command(label='About',command=self._msgBox) menuBar.add_cascade(label='Help',menu=helpMenu)
def fifth_window(root, info): s = ttk.Style() s.configure('nat.TFrame', background="white") fromdayvar = StringVar() frommonthvar = StringVar() fromyearvar = StringVar() todayvar = StringVar() tomonthvar = StringVar() toyearvar = StringVar() def back(info=info): info['fromdate'] = [int(fromyear.get()), (month_to_number( frommonth.get())), int(fromday.get())] info['todate'] = [int(toyear.get()), (month_to_number(tomonth.get())), int(today.get())] fourth_window(root=root, info=info) def info_completed(info=info): info['fromdate'] = [int(fromyear.get()), (month_to_number( frommonth.get())), int(fromday.get())] info['todate'] = [int(toyear.get()), (month_to_number(tomonth.get())), int(today.get())] pickle.dump(info, open('{home}/Desktop/natappy/pickle/info.pickle'.format(home=home), 'wb')) try: root.withdraw() print('info=', info) if not info['competition']: nat.create_report(info['bloggers'], info['platforms'], info['tags'], info['format'], info['fromdate'], info['todate'], info[ 'replies'], info['retweets'], info['excludetags'], info['brandname'], info['campaign'], info['blogpost']) root.withdraw() messagebox.showinfo("Report completed", 'Details: \n Report: {format} \n Media: {platform2} \n Tags: {tags2} \n Bloggers: {bloggers2} \n Report completed'.format(tags2=' '.join( [tag for tag in info['tags']]), platform2=' '.join([platform for platform in info['platforms']]), bloggers2=' '.join([blogger for blogger in info['bloggers']]), **info), parent=c) else: campcomp.campaign_competition(info['blogpost'], info['comptags'], info['competition'], info['campaign'], info['brandname'], info['excludetags'], info[ 'bloggers'], info['tags'], info['format'], info['platforms'], info['fromdate'], info['todate'], info['replies'], info['retweets'], info['blogposts']) # comp.competreport(info['competition'],info['comptags'],info['fromdate'],info['bloggers'],info['todate'],info['settings'],info['format'],info['brandname'],info['campaign']) root.withdraw() messagebox.showinfo("Report completed", 'Details: \n Report: {format} \n Media: {platform2} \n Tags: {tags2} \n Bloggers: {bloggers2} \n Report completed'.format(tags2=' '.join( [tag for tag in info['tags']]), platform2=' '.join([platform for platform in info['platforms']]), bloggers2=' '.join([blogger for blogger in info['bloggers']]), **info), parent=c) except Exception as e: info = 'Exception: {e}'.format(e=e) print(info + '\nExiting now') messagebox.showinfo("Error", info) root.quit() def month_to_number(month): return int({'January': '01', 'February': '02', 'March': '03', 'April': '04', 'May': '05', 'June': '06', 'July': '07', 'August': '08', 'September': '09', 'October': 10, 'November': 11, 'December': 12}[month]) c = ttk.Frame(root, style='nat.TFrame') c.grid(column=0, row=0, sticky=(N, W, E, S)) background_image = tkinter.PhotoImage(file='%s/Desktop/natappy/images/palms.gif' % home) background_label = tkinter.Label(c, image=background_image) background_label.image = background_image background_label.place(x=0, y=0, relwidth=1, relheight=1) root.grid_columnconfigure(0, weight=3) root.grid_rowconfigure(0, weight=3) fromlbl = ttk.Label(c, text="From:", anchor=E, width=0) fromlbl.grid(column=0, row=0, padx=20, pady=(20, 4), sticky=(N, W, S, E)) tolbl = ttk.Label(c, text="To:", anchor=E, width=0) tolbl.grid(column=0, row=2, padx=20, pady=(20, 4), sticky=(N, W, S, E)) fromday = Spinbox(c, values=[i for i in range(1, 32)], width=5, textvariable=fromdayvar) fromday.grid(column=0, row=1, sticky=W, padx=(20, 10), pady=0) frommonth = Spinbox(c, values=['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], textvariable=frommonthvar, width=11) frommonth.grid(column=1, row=1, sticky=W, padx=(10, 20), pady=0) fromyear = Spinbox(c, values=[2014, 2015, 2016], width=5, textvariable=fromyearvar) fromyear.grid(column=2, row=1, sticky=W, padx=(20, 20), pady=0) today = Spinbox(c, values=[i for i in range(1, 32)], width=5, textvariable=todayvar) today.grid(column=0, row=3, sticky=W, padx=(20, 10), pady=0) tomonth = Spinbox(c, values=['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], width=11, textvariable=tomonthvar) tomonth.grid(column=1, row=3, sticky=W, padx=(10, 20), pady=0) toyear = Spinbox(c, values=[2014, 2015, 2016], width=5, textvariable=toyearvar) toyear.grid(column=2, row=3, sticky=W, padx=(20, 20), pady=0) send = ttk.Button(c, text='Create Report', command=info_completed, default='active') send.grid(column=3, row=6, pady=20, sticky=E, padx=(2, 20)) close = ttk.Button(c, text='Back', command=back, default='active') close.grid(column=2, row=6, pady=20, sticky=E) c.grid_columnconfigure(0, weight=1) c.grid_rowconfigure(5, weight=1) if info['fromdate']: if len(str(info['fromdate'][1])) == 1: month = '0' + str(info['fromdate'][1]) else: month = str(info['fromdate'][1]) fromdayvar.set(info['fromdate'][2]) frommonthvar.set(number_to_month(month)) fromyearvar.set(info['fromdate'][0]) else: fromdayvar.set((date.today() - timedelta(days=7)).day) if len(str((date.today() - timedelta(days=7)).month)) == 1: month = '0' + (str((date.today() - timedelta(days=7)).month)) else: month = (str((date.today() - timedelta(days=7)).month)) frommonthvar.set(number_to_month(month)) fromyearvar.set((date.today() - timedelta(days=7)).year) if info['todate']: if len(str(info['todate'][1])) == 1: month = '0' + str(info['todate'][1]) else: month = str(info['todate'][1]) todayvar.set(info['todate'][2]) tomonthvar.set(number_to_month(month)) toyearvar.set(info['todate'][0]) else: todayvar.set(datetime.datetime.now().day) if len(str(datetime.datetime.now().month)) == 1: month = '0' + str(datetime.datetime.now().month) else: month = str(datetime.datetime.now().month) tomonthvar.set(number_to_month(month)) toyearvar.set(datetime.datetime.now().year) root.title('5/5 Date Range') root.geometry('550x400+440+200')
class NavigationForTableFrame(Frame): ''' This class is responsible for navigation over the table object. Table rows are displayed page by page. This class provides buttons that allow to navigate from page to page. Attributes: table (TableFrame or any object that has attribute nb_rows and implements display_data method): table that should be navigated. goto_spin (Spinbox): Spinbox widget that allows to enter page number and to switch between pages. text_var_nb_pages (StringVar): text variable that shows total number of pages. current_page_str (StringVar): text variable that stores currently displayed page. Args: parent (Tk object): parent for this frame. table (TableFrameWithInputOutputBox): table with multiple pages that will be navigated by this frame. ''' def __init__(self, parent, table, *args, **kw): super().__init__(parent, *args, **kw) self.table = table self.goto_spin = None self.text_var_nb_pages = StringVar() self.current_page_str = StringVar() self.create_widgets() def create_widgets(self): ''' Creates all necessary widgets for navigation. ''' prev_btn = Button(self, text='<<', width=5, command=self.show_prev_page) prev_btn.grid(row=0, column=0, sticky=N, padx=3) next_btn = Button(self, text='>>', width=5, command=self.show_next_page) next_btn.grid(row=0, column=1, sticky=N) goto_lbl = Label(self, text='Go to') goto_lbl.grid(row=0, column=3, sticky=N, padx=5) self.goto_spin = Spinbox(self, width=7, from_=1, to=1, textvariable=self.current_page_str, command=self.on_page_change) self.goto_spin.bind('<Return>', self.on_page_change) self.goto_spin.grid(row=0, column=4, sticky=N, padx=5) nb_pages_lb = Label(self, textvariable=self.text_var_nb_pages) nb_pages_lb.grid(row=0, column=5, sticky=W+N, padx=5) self.reset_navigation() def show_prev_page(self): ''' Displays previous page. This method is called when user presses button '<<'. If the first page is currently displayed and the method is called, then the call to this method is ignored. ''' prev_page_index = int(self.current_page_str.get()) - 1 if prev_page_index > 0: self.current_page_str.set(prev_page_index) self.on_page_change() def show_next_page(self): ''' Displays next page. This method is called when user presses button '>>'. If the last page is currently displayed and the method is called, then the call to this method is ignored. ''' next_page_index = int(self.current_page_str.get()) + 1 if next_page_index <= int(self.goto_spin.cget('to')): self.current_page_str.set(next_page_index) self.on_page_change() def on_page_change(self, *args): ''' Displays a page which number is currently stored in current_page_str. This method is called in show_next_page(), show_prev_page() and when the user enters data and presses Enter. args are supplied by Return event. If the entered value is invalid, then the first page is displayed. If the entered value is zero or negative, then the first page is isplayed. If the entered value is larger than the total number of pages, then the last page is displayed. ''' try: curr_page = int(self.current_page_str.get()) except ValueError: curr_page = 1 self.current_page_str.set(curr_page) max_page = int(self.goto_spin.cget('to')) if curr_page > max_page: curr_page = max_page self.current_page_str.set(curr_page) if curr_page <= 0: curr_page = 1 self.current_page_str.set(curr_page) # second -1 because row indeces start with 0 row_index = calculate_start_row_index(curr_page, self.table.nb_rows) self.table.display_data(row_index) def reset_navigation(self): ''' Resets navigation parameters. Sets current page number to 1 and total number of pages to zero. ''' self.current_page_str.set('1') self.text_var_nb_pages.set('1 pages') self.goto_spin.config(to=1) def set_navigation(self, nb_data_pages, reset_curr_page=True): ''' Sets navigation parameters. Sets current page number to 1 and total number of pages to nb_data_pages. Args: nb_data_pages (int): new value for the total number of pages. reset_curr_page (bool): True is current page must be reset to 1, False otherwise. ''' self.goto_spin.config(to=nb_data_pages) if reset_curr_page: self.current_page_str.set('1') self.text_var_nb_pages.set('{0} pages'.format(nb_data_pages))
class OOP(): def __init__(self): # Initializer method self.win = tk.Tk() tt.create_ToolTip(self.win, 'Hello GUI') self.win.title("Python GUI") self.win.iconbitmap('ZTemp.ico') self.create_widgets() def click_me(self): self.action.configure(text='Hello ' + self.name.get() + ' ' + self.number_chosen.get()) def _spin(self): value = self.spin.get() print(value) self.scrol.insert(tk.INSERT, value + '\n') def rad_call(self): radSel = self.radVar.get() if radSel == 0: self.mighty2.configure(text='Blue') elif radSel == 1: self.mighty2.configure(text='Gold') elif radSel == 2: self.mighty2.configure(text='Red') @staticmethod def using_global(): global GLOBAL_CONST print(GLOBAL_CONST) GLOBAL_CONST = 789 print(GLOBAL_CONST) def _quit(self): self.win.quit() self.win.destroy() exit() def create_widgets(self): tab_control = ttk.Notebook(self.win) tab1 = ttk.Frame(tab_control) tab_control.add(tab1, text='Tab 1') tab2 = ttk.Frame(tab_control) tab_control.add(tab2, text='Tab 2') tab_control.pack(expand=1, fill="both") mighty = ttk.LabelFrame(tab1, text=' Mighty Python ') mighty.grid(column=0, row=0, padx=8, pady=4) a_label = ttk.Label(mighty, text="Enter a name:") a_label.grid(column=0, row=0, sticky='W') ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0) self.name = tk.StringVar() self.name_entered = ttk.Entry(mighty, width=12, textvariable=self.name) self.name_entered.grid(column=0, row=1, sticky='W') self.name_entered.focus() self.action = ttk.Button(mighty, text="Click Me!", command=self.click_me) self.action.grid(column=2, row=1) number = tk.StringVar() self.number_chosen = ttk.Combobox(mighty, width=12, textvariable=number, state='readonly') self.number_chosen['values'] = (1, 2, 4, 42, 100) self.number_chosen.grid(column=1, row=1) self.number_chosen.current(0) self.spin = Spinbox(mighty, values=(1, 2, 4, 42, 100), width=5, bd=9, command=self._spin) self.spin.grid(column=0, row=2) scrol_w, scrol_h = 30, 8 self.scrol = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD) self.scrol.grid(column=0, row=3, sticky='WE', columnspan=3) for child in mighty.winfo_children(): child.grid_configure(padx=4, pady=2) self.mighty2 = ttk.LabelFrame(tab2, text=' The Snake ') self.mighty2.grid(column=0, row=0, padx=8, pady=4) colors = ["Blue", "Gold", "Red"] self.radVar = tk.IntVar() self.radVar.set(99) for col in range(3): cur_rad = tk.Radiobutton(self.mighty2, text=colors[col], variable=self.radVar, value=col, command=self.rad_call) cur_rad.grid(column=col, row=1, sticky=tk.W) tt.create_ToolTip(cur_rad, 'This is a Radiobutton control') for child in self.mighty2.winfo_children(): child.grid_configure(padx=8, pady=2) menu_bar = Menu(self.win) self.win.config(menu=menu_bar) file_menu = Menu(menu_bar, tearoff=0) file_menu.add_command(label="New") file_menu.add_separator() file_menu.add_command(label="Exit", command=self._quit) menu_bar.add_cascade(label="File", menu=file_menu) def _msgBox(): msg.showinfo('Python Message Info Box', 'Message:\nTest!.') help_menu = Menu(menu_bar, tearoff=0) help_menu.add_command(label="About", command=_msgBox) menu_bar.add_cascade(label="Help", menu=help_menu) self.using_global() # Add Tooltips to widgets tt.create_ToolTip(self.spin, 'This is a Spinbox control') tt.create_ToolTip(self.name_entered, 'This is an Entry control') tt.create_ToolTip(self.action, 'This is a Button control') tt.create_ToolTip(self.scrol, 'This is a ScrolledText control')
class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("") # self.style = Style() # self.style.theme_use("clam") # self.pack(fill=BOTH, expand = 1) self.quitbutton = Button(self, text="Quit", command=lambda: self.quit()) self.quitbutton.grid(row=3, column=1, pady=4) self.labelErrorPointer = Label(self, text="◀") self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] self.optionCreate = "Create" self.optionUpcoming = "Upcoming" self.optionPast = "Past" self.prevmode = self.optionCreate self.curmode = self.optionCreate self.optionvar = tkinter.StringVar(self) self.optionvar.trace("w", self.permaloop) self.optionvar.set(self.optionCreate) self.option = OptionMenu(self, self.optionvar, self.optionCreate, self.optionUpcoming, self.optionPast) self.optionpostmodevar = tkinter.StringVar(self) self.optionpostmodevar.trace("w", self.permaloop) self.optionpostmodevar.set("url") self.optionpostmode = OptionMenu(self, self.optionpostmodevar, "url", "text") self.labelText = Label(self, text="Selftext:") self.entryText = Text(self) self.labelURL = Label(self, text="URL:") self.entryURL = Entry(self) self.entryURL.configure(width=60) self.sql = sqlite3.connect("sql.db") print("Loaded SQL Database") self.cur = self.sql.cursor() self.cur.execute( "CREATE TABLE IF NOT EXISTS upcoming(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT)" ) self.cur.execute( "CREATE TABLE IF NOT EXISTS past(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT, POSTLINK TEXT)" ) self.cur.execute("CREATE TABLE IF NOT EXISTS internal(NAME TEXT, ID INT)") print("Loaded Completed table") self.cur.execute("SELECT * FROM internal") f = self.cur.fetchone() if not f: print("Database is new. Adding ID counter") self.cur.execute("INSERT INTO internal VALUES(?, ?)", ["counter", 1]) self.idcounter = 1 else: self.idcounter = f[1] print("Current ID counter: " + str(self.idcounter)) self.sql.commit() sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() w = 853 h = 480 x = (sw - w) / 2 y = (sh - h) / 2 self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y - 50)) self.login() def login(self): try: self.quitbutton.grid_forget() self.quitbutton.grid(row=9000, column=0, columnspan=20) self.option.grid(row=1, column=0, columnspan=8, pady=8) self.updategui(fullclean=True) except praw.errors.InvalidUserPass: pass print("Invalid username or password") self.entryPassword.delete(0, 200) self.labelErrorPointer.grid(row=1, column=2) def permaloop(self, *args): self.curmode = self.optionvar.get() print("Was: " + self.prevmode + " | Now: " + self.curmode) if self.curmode != self.prevmode: self.prevmode = self.curmode self.updategui(fullclean=True) else: self.updategui(False) def getTime(self, bool): timeNow = datetime.datetime.now(datetime.timezone.utc) timeUnix = timeNow.timestamp() if bool == False: return timeNow else: return timeUnix def addentrytobase(self, subreddit, title, url="", body="", mode="", ptime=""): curtime = round(self.getTime(True)) try: t = ( self.entryMo.get() + " " + self.entryDa.get() + " " + self.entryYr.get() + " " + self.entryHH.get() + ":" + self.entryMM.get() ) plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M") plandate = plandate.timestamp() except ValueError: print("Invalid Day") return False if mode == "url": url = self.entryURL.get() body = "" if "http://" not in url and "https://" not in url: print("Please enter a proper URL") return False if mode == "text": body = self.entryText.get("1.0", "end") url = "" if plandate < curtime: print("Please enter a time in the future") return False if not all(char in string.ascii_letters + string.digits + "_-" for char in subreddit): print("Subreddit contains invalid characters") return False if len(subreddit) == 0: print("You must enter a subreddit") return False if len(title) == 0: print("You must enter a title") return False if len(title) > 300: print("Title is too long. " + str(len(title)) + "/300 char max") return False if len(body) > 15000: print("Body is too long. " + str(len(body)) + "/15,000 char max") print("Timestamp:", plandate) self.cur.execute( "INSERT INTO upcoming VALUES(?, ?, ?, ?, ?, ?)", [self.idcounter, subreddit, int(plandate), title, url, body], ) self.idcounter += 1 self.cur.execute("UPDATE internal SET ID=? WHERE NAME=?", [self.idcounter, "counter"]) self.sql.commit() print("Post Saved!") self.entryText.delete("1.0", "end") self.entryURL.delete(0, "end") self.entryTitle.delete(0, "end") # self.updategui(halfclean=True) def dropentryfrombase(self, ID): try: ID = int(ID) except ValueError: print("You must enter a number") return print("Dropping Item " + str(ID) + " from Upcoming") self.cur.execute("DELETE FROM upcoming WHERE ID=?", [ID]) self.sql.commit() self.updategui(fullclean=True) def printbasetofile(self, db): filea = open(db + ".txt", "w") if db == "past": self.cur.execute("SELECT * FROM past") if db == "upcoming": self.cur.execute("SELECT * FROM upcoming") f = self.cur.fetchall() print("Printed " + db + " unimpeded to file") for item in f: i = list(item) d = datetime.datetime.fromtimestamp(i[2]) i[2] = datetime.datetime.strftime(d, "%b %d %H:%M") i.remove("") print(str(i)[1:-1], file=filea) filea.close() def updategui(self, halfclean=False, fullclean=False): if self.curmode == self.optionCreate: try: print(self.optionpostmodevar.get()) if self.optionpostmodevar.get() == "url": self.entryText.delete("1.0", "end") self.labelText.grid_forget() self.entryText.grid_forget() self.labelURL.grid(row=8, column=0, columnspan=30) self.entryURL.grid(row=9, column=0, columnspan=12, pady=10) if self.optionpostmodevar.get() == "text": self.entryURL.delete(0, "end") self.labelURL.grid_forget() self.entryURL.grid_forget() self.labelText.grid(row=8, column=0, columnspan=30) self.entryText.configure(width=40, height=8) self.entryText.grid(row=9, column=0, columnspan=12) except AttributeError: pass if fullclean == True: print("Cleaning GUI") for item in self.labellist: item.grid_forget() for item in self.entrylist: item.grid_forget() for item in self.verifylist: item.grid_forget() for item in self.misclist: item.grid_forget() self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] if self.curmode == self.optionCreate: self.newrowindex = 6 self.labelSubreddit = Label(self, text="Subreddit: /r/") self.labelTitle = Label(self, text="Post title: ") self.entrySubreddit = Entry(self) self.entryTitle = Entry(self) self.labelHH = Label(self, text="Schedule time (Local timezone):") nowlist = datetime.datetime.strftime(datetime.datetime.now(), "%B %d %Y %H %M").split() self.entryMo = Spinbox( self, width=9, values=( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ), ) self.entryMo.delete(0, "end") self.entryMo.insert(0, nowlist[0]) self.entryDa = Spinbox(self, width=2, from_=1, to=31) self.entryDa.delete(0, "end") self.entryDa.insert(0, nowlist[1]) self.entryYr = Spinbox(self, width=4, from_=2014, to=2500) self.entryYr.delete(0, "end") self.entryYr.insert(0, nowlist[2]) self.entryHH = Spinbox(self, from_=0, to=23, width=2) self.entryHH.delete(0, "end") self.entryHH.insert(0, nowlist[3]) self.entryMM = Spinbox(self, from_=0, to=59, width=2) self.entryMM.delete(0, "end") self.entryMM.insert(0, nowlist[4]) self.buttonAddentry = Button( self, text="Save", command=lambda: self.addentrytobase( self.entrySubreddit.get(), self.entryTitle.get(), mode=self.optionpostmodevar.get() ), ) self.misclist.append(self.labelSubreddit) self.misclist.append(self.entrySubreddit) self.misclist.append(self.labelHH) self.misclist.append(self.entryHH) self.misclist.append(self.entryMM) self.misclist.append(self.entryMo) self.misclist.append(self.entryDa) self.misclist.append(self.entryYr) self.misclist.append(self.labelTitle) self.misclist.append(self.entryTitle) self.misclist.append(self.buttonAddentry) self.misclist.append(self.optionpostmode) self.misclist.append(self.labelText) self.misclist.append(self.entryText) self.misclist.append(self.labelURL) self.misclist.append(self.entryURL) self.labelSubreddit.grid(row=2, column=0, sticky="e") self.labelTitle.grid(row=3, column=0, sticky="e") self.entrySubreddit.grid(row=2, column=1, columnspan=3, sticky="w") self.entryTitle.grid(row=3, column=1, columnspan=3, sticky="w") self.entryMo.grid(row=4, column=1, sticky="e") self.entryDa.grid(row=4, column=2) self.entryYr.grid(row=4, column=3) self.labelHH.grid(row=4, column=0, sticky="se", pady=5) self.entryHH.grid(row=5, column=1, sticky="e") self.entryMM.grid(row=5, column=2, sticky="w") self.optionpostmode.grid(row=6, column=0, columnspan=20, pady=10) self.buttonAddentry.grid(row=200, column=0, columnspan=20) if self.curmode == self.optionUpcoming: self.cur.execute("SELECT * FROM upcoming") dobutton = True if self.curmode == self.optionPast: self.cur.execute("SELECT * FROM past") dobutton = False if self.curmode == self.optionPast or self.curmode == self.optionUpcoming: self.listboxId = Listbox(self) self.listboxId.configure(width=118, height=20, font=("Courier 8")) self.misclist.append(self.listboxId) self.listboxScroller = Scrollbar(self, orient="horizontal", command=self.listboxId.xview) self.listboxScroller.grid(row=4, column=0, columnspan=900) self.listboxId.grid(row=3, column=0, columnspan=10) self.listboxId.configure(xscrollcommand=self.listboxScroller.set) self.misclist.append(self.listboxScroller) self.buttonPrinter = Button(self, text="Print to .txt file") if self.curmode == self.optionPast: self.buttonPrinter.configure(command=lambda: self.printbasetofile("past")) if self.curmode == self.optionUpcoming: self.buttonPrinter.configure(command=lambda: self.printbasetofile("upcoming")) self.buttonPrinter.grid(row=6, column=0, columnspan=90) self.misclist.append(self.buttonPrinter) if dobutton == True: self.entryDelete = Entry(self) self.buttonDelete = Button( self, text="Delete Item: ", command=lambda: self.dropentryfrombase(self.entryDelete.get()) ) self.buttonDelete.grid(row=5, column=0, sticky="e") self.entryDelete.grid(row=5, column=1, sticky="w") self.misclist.append(self.entryDelete) self.misclist.append(self.buttonDelete) fetched = self.cur.fetchall() for item in fetched: d = datetime.datetime.fromtimestamp(item[2]) info = datetime.datetime.strftime(d, "%b %d %H:%M") if item[4] == "": infx = item[5] if item[5] == "": infx = item[4] if self.curmode == self.optionPast: infy = "." + item[6] else: infy = "" self.listboxId.insert( "end", item[0] + "." * (6 - len(item[0])) + item[1][:10] + "." * (12 - len(item[1][:10])) + info + "." * (15 - len(info[:14])) + item[3][:18] + "." * (20 - len(item[3][:14])) + infx[:45] + "." * (47 - len(infx[:45])) + infy, ) def morerows(self, label, columnm, columnn, limit, *args): self.redditlabel = Label(self, text=label) self.redditlabel.grid(row=self.newrowindex, column=columnm, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex, column=columnn, columnspan=9) self.entrylist.append(self.redditentry) self.newrowindex += 1 if self.newrowindex >= limit: self.morerowbutton.grid_forget() print(self.newrowindex)
class App: def __init__(self): self.window = tk.Tk() self.window.title("Cripto Cesar") self.window.geometry('430x410') self.window.config(bg="#FFFFFF") self.cesar = Cesar() frameHead = Frame(self.window) lbl_method = tk.Label(frameHead, text='Metodo') lbl_method.grid(column=0, row=0, sticky='W', padx=20) lbl_rot = tk.Label(frameHead, text='ROT') lbl_rot.grid(column=1, row=0, sticky='W', padx=5) frameHead.grid(column=0, row=0) self.frame = Frame(self.window) self.combo = Combobox(self.frame) self.combo['values'] = ("Encriptar", "Desencriptar") self.combo.grid(column=0, row=0, sticky='W', padx=10) maxSpin = len(self.cesar.abc) self.spin = Spinbox(self.frame, from_=1, to=maxSpin, width=5) self.spin.grid(column=1, row=0, sticky='W', padx=10) buton = tk.Button(self.frame, text='Start', command=self.clicked) buton.grid(column=2, row=0, sticky='W', padx=10) self.frame.grid(column=0, row=1) lbl_txt_init = tk.Label(self.window, text='Input') lbl_txt_init.grid(column=0, row=3, sticky='W', padx=10) self.scroll_txt_init = tk.scrolledtext.ScrolledText(self.window, width=50, height=10) self.scroll_txt_init.grid(column=0, row=4, sticky='W', padx=10) lbl_txt_end = tk.Label(self.window, text='Output') lbl_txt_end.grid(column=0, row=5, sticky='W', padx=10) self.scroll_txt_end = scrolledtext.ScrolledText(self.window, width=50, height=10) self.scroll_txt_end.grid(column=0, row=6, sticky='W', padx=10) self.window.mainloop() def clicked(self): # Clear buffer self.scroll_txt_end.delete(0.0, tk.END) textInput = self.scroll_txt_init.get("0.0", tk.END) rot = self.spin.get() typeAction = self.combo.get() # Decode string if typeAction == "Encriptar": textOutput = self.cesar.encriptar(textInput, int(rot)) elif typeAction == "Desencriptar": textOutput = self.cesar.desencriptar(textInput, int(rot)) # Put new string into of stroll self.scroll_txt_end.insert(tk.INSERT, textOutput)
class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("") #self.style = Style() #self.style.theme_use("clam") #self.pack(fill=BOTH, expand = 1) self.quitbutton = Button(self, text="Quit", command= lambda: self.quit()) self.quitbutton.grid(row=3, column=1, pady=4) self.labelErrorPointer = Label(self, text="◀") self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] self.optionCreate = "Create" self.optionUpcoming = "Upcoming" self.optionPast = "Past" self.prevmode = self.optionCreate self.curmode = self.optionCreate self.optionvar = tkinter.StringVar(self) self.optionvar.trace("w",self.permaloop) self.optionvar.set(self.optionCreate) self.option = OptionMenu(self, self.optionvar, self.optionCreate, self.optionUpcoming, self.optionPast) self.optionpostmodevar = tkinter.StringVar(self) self.optionpostmodevar.trace("w",self.permaloop) self.optionpostmodevar.set('url') self.optionpostmode = OptionMenu(self, self.optionpostmodevar, 'url', 'text') self.labelText = Label(self, text='Selftext:') self.entryText = Text(self) self.labelURL = Label(self, text='URL:') self.entryURL = Entry(self) self.entryURL.configure(width=60) self.sql = sqlite3.connect('sql.db') print('Loaded SQL Database') self.cur = self.sql.cursor() self.cur.execute('CREATE TABLE IF NOT EXISTS upcoming(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT)') self.cur.execute('CREATE TABLE IF NOT EXISTS past(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT, POSTLINK TEXT)') self.cur.execute('CREATE TABLE IF NOT EXISTS internal(NAME TEXT, ID INT)') print('Loaded Completed table') self.cur.execute('SELECT * FROM internal') f = self.cur.fetchone() if not f: print('Database is new. Adding ID counter') self.cur.execute('INSERT INTO internal VALUES(?, ?)', ['counter', 1]) self.idcounter = 1 else: self.idcounter = f[1] print('Current ID counter: ' + str(self.idcounter)) self.sql.commit() sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() w=853 h=480 x = (sw - w) / 2 y = (sh - h) / 2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50)) self.login() def login(self): try: self.quitbutton.grid_forget() self.quitbutton.grid(row=9000, column=0, columnspan=20) self.option.grid(row=1,column=0,columnspan=80,pady=8) self.updategui(fullclean=True) except praw.errors.InvalidUserPass: pass print('Invalid username or password') self.entryPassword.delete(0,200) self.labelErrorPointer.grid(row=1, column=2) def permaloop(self, *args): self.curmode = self.optionvar.get() print('Was: ' + self.prevmode + ' | Now: ' + self.curmode) if self.curmode != self.prevmode: self.prevmode = self.curmode self.updategui(fullclean=True) else: self.updategui(False) def getTime(self, bool): timeNow = datetime.datetime.now(datetime.timezone.utc) timeUnix = timeNow.timestamp() if bool is False: return timeNow else: return timeUnix def addentrytobase(self, subreddit, title, url="", body="", mode="", ptime=""): curtime = round(self.getTime(True)) try: t = self.entryMo.get() + ' ' + self.entryDa.get() + ' ' + self.entryYr.get() + ' ' + self.entryHH.get() + ':' + self.entryMM.get() plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M") plandate = plandate.timestamp() except ValueError: print('Invalid Day') return False if mode == 'url': url = self.entryURL.get() body = "" if 'http://' not in url and 'https://' not in url: print('Please enter a proper URL') return False if mode == 'text': body = self.entryText.get("1.0", "end") url = "" if plandate < curtime: print('Please enter a time in the future') return False if not all(char in string.ascii_letters+string.digits+'_-' for char in subreddit): print('Subreddit contains invalid characters') return False if len(subreddit) == 0: print('You must enter a subreddit') return False if len(title) == 0: print('You must enter a title') return False if len(title) > 300: print('Title is too long. ' + str(len(title)) + '/300 char max') return False if len(body) > 15000: print('Body is too long. ' + str(len(body)) + '/15,000 char max') print('Timestamp:', plandate) self.cur.execute('INSERT INTO upcoming VALUES(?, ?, ?, ?, ?, ?)', [self.idcounter, subreddit, int(plandate), title, url, body]) self.idcounter += 1 self.cur.execute('UPDATE internal SET ID=? WHERE NAME=?', [self.idcounter, 'counter']) self.sql.commit() print('\nPost Saved!') print(self.idcounter, subreddit, self.timestamptoday(int(plandate))) print(title) print(url, body) print() self.entryText.delete("1.0", "end") self.entryURL.delete(0, 'end') self.entryTitle.delete(0, 'end') #self.updategui(halfclean=True) def timestamptoday(self, timestamp): d = datetime.datetime.fromtimestamp(timestamp) info = datetime.datetime.strftime(d, "%b %d %H:%M") return info def dropentryfrombase(self, ID): if '-' not in ID: try: ID = int(ID) l = [ID] except ValueError: print('You must enter a number') return else: if ID.count('-') == 1: try: ID = ID.replace(' ', '') ID = ID.split('-') ID[0] = int(ID[0]) ID[1] = int(ID[1]) if ID[1] > ID[0]: l = list(range(ID[0], ID[1]+1)) else: return except ValueError: return for item in l: item = str(item) print('Dropping Item ' + item + ' from Upcoming') self.cur.execute('DELETE FROM upcoming WHERE ID=?', [item]) self.sql.commit() self.updategui(fullclean=True) def printbasetofile(self, db): filea = open(db + '.txt', 'w') if db == 'past': self.cur.execute('SELECT * FROM past') if db == 'upcoming': self.cur.execute('SELECT * FROM upcoming') f = self.cur.fetchall() print('Printed ' + db + ' unimpeded to file') for item in f: i = list(item) i[2] = self.timestamptoday(i[2]) i.remove('') print(str(i)[1:-1], file=filea) filea.close() def updategui(self, halfclean=False, fullclean=False): if self.curmode == self.optionCreate: try: print(self.optionpostmodevar.get()) if self.optionpostmodevar.get() == 'url': self.entryText.delete("1.0", 'end') self.labelText.grid_forget() self.entryText.grid_forget() self.labelURL.grid(row=8, column=0, columnspan=30) self.entryURL.grid(row=9, column=0, columnspan=12, pady=10) if self.optionpostmodevar.get() == 'text': self.entryURL.delete(0, 'end') self.labelURL.grid_forget() self.entryURL.grid_forget() self.labelText.grid(row=8, column=0, columnspan=30) self.entryText.configure(width=40, height=8) self.entryText.grid(row=9, column=0, columnspan=12) except AttributeError: pass if fullclean is True: print('Cleaning GUI') for item in self.labellist: item.grid_forget() for item in self.entrylist: item.grid_forget() for item in self.verifylist: item.grid_forget() for item in self.misclist: item.grid_forget() self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] if self.curmode == self.optionCreate: self.newrowindex = 6 self.labelSubreddit = Label(self, text="Subreddit: /r/") self.labelTitle = Label(self, text="Post title: ") self.entrySubreddit = Entry(self) self.entryTitle = Entry(self) self.labelHH = Label(self, text="Schedule time (Local timezone):") nowlist = datetime.datetime.strftime(datetime.datetime.now(), "%B %d %Y %H %M").split() self.entryMo = Spinbox(self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', \ 'August', 'September', 'October', 'November', 'December')) self.entryMo.delete(0,'end') self.entryMo.insert(0, nowlist[0]) self.entryDa = Spinbox(self, width=2, from_=1, to=31) self.entryDa.delete(0,'end') self.entryDa.insert(0, nowlist[1]) self.entryYr = Spinbox(self, width=4, from_=2014, to=2500) self.entryYr.delete(0,'end') self.entryYr.insert(0, nowlist[2]) self.entryHH = Spinbox(self, from_=0, to=23, width=2) self.entryHH.delete(0,'end') self.entryHH.insert(0, nowlist[3]) self.entryMM = Spinbox(self, from_=0, to=59, width=2) self.entryMM.delete(0,'end') self.entryMM.insert(0, nowlist[4]) self.buttonAddentry = Button(self, text='Save', command=lambda: self.addentrytobase(self.entrySubreddit.get(), self.entryTitle.get(),\ mode=self.optionpostmodevar.get())) self.misclist.append(self.labelSubreddit) self.misclist.append(self.entrySubreddit) self.misclist.append(self.labelHH) self.misclist.append(self.entryHH) self.misclist.append(self.entryMM) self.misclist.append(self.entryMo) self.misclist.append(self.entryDa) self.misclist.append(self.entryYr) self.misclist.append(self.labelTitle) self.misclist.append(self.entryTitle) self.misclist.append(self.buttonAddentry) self.misclist.append(self.optionpostmode) self.misclist.append(self.labelText) self.misclist.append(self.entryText) self.misclist.append(self.labelURL) self.misclist.append(self.entryURL) self.labelSubreddit.grid(row=2, column=0, sticky="e") self.labelTitle.grid(row=3, column=0, sticky="e") self.entrySubreddit.grid(row=2, column=1, columnspan=3, sticky="w") self.entryTitle.grid(row=3, column=1, columnspan=3, sticky="w") self.entryMo.grid(row=4, column=1,sticky="e") self.entryDa.grid(row=4, column=2) self.entryYr.grid(row=4, column=3) self.labelHH.grid(row=4, column=0, sticky="se", pady=5) self.entryHH.grid(row=5, column=1, sticky="e") self.entryMM.grid(row=5, column=2, sticky="w") self.optionpostmode.grid(row=6, column=0, columnspan=20, pady=10) self.buttonAddentry.grid(row=200, column=0, columnspan=20) if self.curmode == self.optionUpcoming: self.cur.execute('SELECT * FROM upcoming') dobutton = True if self.curmode == self.optionPast: self.cur.execute('SELECT * FROM past') dobutton = False if self.curmode == self.optionPast or self.curmode == self.optionUpcoming: self.listboxId = Listbox(self) self.listboxId.configure(width=118, height=20, font=("Courier 8")) self.misclist.append(self.listboxId) self.listboxScroller = Scrollbar(self, orient='horizontal', command=self.listboxId.xview) self.listboxScroller.grid(row=4, column=0, columnspan=900) self.listboxId.grid(row=3, column=0, columnspan=10) self.listboxId.configure(xscrollcommand=self.listboxScroller.set) self.misclist.append(self.listboxScroller) self.buttonPrinter = Button(self, text="Print to .txt file") if self.curmode == self.optionPast: self.buttonPrinter.configure(command=lambda: self.printbasetofile('past')) if self.curmode == self.optionUpcoming: self.buttonPrinter.configure(command=lambda: self.printbasetofile('upcoming')) self.buttonPrinter.grid(row = 6, column=0, columnspan=90) self.misclist.append(self.buttonPrinter) if dobutton is True: self.entryDelete = Entry(self) self.buttonDelete = Button(self, text="Delete Item: ", command=lambda: self.dropentryfrombase(self.entryDelete.get())) self.buttonDelete.grid(row=5, column=0, sticky='e') self.entryDelete.grid(row=5, column=1, sticky='w') self.misclist.append(self.entryDelete) self.misclist.append(self.buttonDelete) fetched = self.cur.fetchall() for item in fetched: info = self.timestamptoday(item[2]) if item[4] == '': infx = item[5] if item[5] == '': infx = item[4] if self.curmode == self.optionPast: infy = '.' + item[6] else: infy = '' self.listboxId.insert('end', \ item[0] + '.'*(6 - len(item[0])) \ + item[1][:10] + '.'*(12 - len(item[1][:10])) \ + info + '.'*(15 - len(info[:14])) \ + item[3][:18] + '.'*(20 - len(item[3][:14])) \ + infx[:45] + '.'*(47-len(infx[:45])) \ + infy) def morerows(self, label, columnm, columnn, limit, *args): self.redditlabel = Label(self,text=label) self.redditlabel.grid(row=self.newrowindex,column=columnm, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex,column=columnn, columnspan=9) self.entrylist.append(self.redditentry) self.newrowindex += 1 if self.newrowindex >= limit: self.morerowbutton.grid_forget() print(self.newrowindex)
class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("") #self.style = Style() #self.style.theme_use("clam") #self.pack(fill=BOTH, expand = 1) self.labelU = Label(self, text="U:") self.labelP = Label(self, text="P:") self.mailrecipient = 'GoldenSights' self.entryUsername = Entry(self) self.entryUsername.focus_set() self.entryUsername.bind('<Return>', lambda event: self.entryPassword.focus_set()) self.entryPassword = Entry(self) self.entryPassword.config(show='•') self.entryPassword.bind( '<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton = Button( self, text="Login", command=lambda: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton.bind( '<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton.config(width=6) self.quitbutton = Button(self, text="Quit", command=lambda: self.quit()) self.quitbutton.config(width=6) self.labelU.grid(row=0, column=0, padx=0) self.entryUsername.grid(row=0, column=1) self.labelP.grid(row=1, column=0) self.entryPassword.grid(row=1, column=1, pady=4) self.newbutton.grid(row=2, column=1) self.quitbutton.grid(row=3, column=1, pady=4) self.labelErrorPointer = Label(self, text="◀") self.indicatorGreen = PhotoImage(file="indicatorGreen.gif") self.indicatorRed = PhotoImage(file="indicatorRed.gif") self.indicatorBlue = PhotoImage(file="indicatorBlue.gif") self.indicatorBlack = PhotoImage(file="indicatorBlack.gif") sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() w = 400 h = 480 x = (sw - w) / 2 y = (sh - h) / 2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y - 50)) def login(self, username, password): print('U: ' + username) self.username = username if username == '' or not all( char in string.ascii_letters + string.digits + '_-' for char in username): print('Please enter a username') self.entryUsername.focus_set() self.labelErrorPointer.grid(row=0, column=2) elif password == '': print('Please enter a password') self.entryPassword.focus_set() self.labelErrorPointer.grid(row=1, column=2) else: self.labelErrorPointer.grid_forget() print('Attempting login for ' + username) try: self.USERAGENT = username + ' practices Tkinter+PRAW mixing with utility by /u/GoldenSights.' self.r = praw.Reddit(self.USERAGENT) #self.r.login(username, password) print('Success') self.labelU.grid_forget() self.labelP.grid_forget() self.entryUsername.grid_forget() self.entryPassword.grid_forget() self.newbutton.grid_forget() self.quitbutton.grid_forget() self.usernamelabel = Label(self, text=username + ', Sending to /u/' + self.mailrecipient) self.usernamelabel.grid(row=0, column=0, columnspan=8) self.quitbutton.grid(row=900, column=0) self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] self.optionDiscuss = "Discussion Flair + Crossposting" self.optionRegister = "Register a new Candidate" self.prevmode = self.optionDiscuss self.curmode = self.optionDiscuss self.optionvar = tkinter.StringVar(self) self.optionvar.trace("w", self.permaloop) self.optionvar.set(self.optionDiscuss) self.option = OptionMenu(self, self.optionvar, self.optionDiscuss, self.optionRegister, "three", "four") self.newbutton.unbind("<Return>") self.entryUsername.unbind("<Return>") self.entryPassword.unbind("<Return>") self.option.grid(row=1, column=0, columnspan=8, pady=8) self.updategui(True) except praw.errors.InvalidUserPass: pass print('Invalid username or password') self.entryPassword.delete(0, 200) self.labelErrorPointer.grid(row=1, column=2) def permaloop(self, *args): self.curmode = self.optionvar.get() print('Was: ' + self.prevmode + ' | Now: ' + self.curmode) if self.curmode != self.prevmode: self.prevmode = self.curmode self.updategui(True) def updategui(self, *args): if args[0] == True: print('Cleaning GUI') for item in self.labellist: item.grid_forget() for item in self.entrylist: item.grid_forget() for item in self.verifylist: item.grid_forget() for item in self.misclist: item.grid_forget() self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] if self.curmode == self.optionDiscuss: self.newrowindex = 4 self.labelPermalink = Label(self, text="Thread Permalink:") self.entryPermalink = Entry(self) self.rowconfigure(2, weight=2) self.labelPermalink.grid(row=2, column=0) self.entryPermalink.grid(row=2, column=1) self.labelcrossposting = Label(self, text="Crosspost to:") self.labelcrossposting.grid(row=3, column=0, columnspan=2, sticky="w") for m in range(5): self.redditlabel = Label(self, text="/r/") self.redditlabel.grid(row=self.newrowindex, column=0, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex, column=1) self.entrylist.append(self.redditentry) self.newrowindex += 1 self.morerowbutton = Button( self, text="+row", command=lambda: self.morerows('/r/', 0, 1, 20)) self.morerowbutton.grid(row=898, column=0, columnspan=2) self.verifybutton = Button( self, text="Verify", command=lambda: self.updategui(False)) self.verifybutton.grid(row=899, column=0, columnspan=2) self.newrowindex += 2 self.misclist.append(self.labelPermalink) self.misclist.append(self.labelcrossposting) self.misclist.append(self.entryPermalink) self.misclist.append(self.morerowbutton) self.misclist.append(self.verifybutton) if self.curmode == self.optionRegister: self.newrowindex = 6 self.labelCanUsername = Label( self, text="Candidate's Username: /u/") self.entryCanUsername = Entry(self) self.labelCanRealname = Label(self, text="Candidate's Realname:") self.entryCanRealname = Entry(self) self.labelCanFlair = Label(self, text="Candidate's Flair:") self.entryCanFlair = Entry(self) self.entryMo = Spinbox( self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')) self.entryDa = Spinbox(self, width=2, from_=1, to=31) self.entryYr = Spinbox(self, width=4, from_=2014, to=2500) self.labelHH = Label(self, text="Schedule time UTC:") self.entryHH = Spinbox(self, from_=0, to=23, width=2) self.entryMM = Spinbox(self, from_=0, to=59, width=2) self.entryYr.delete(0, 'end') self.entryYr.insert(0, 2014) self.morerowbutton = Button( self, text="+question", command=lambda: self.morerows('Q:', 0, 1, 25)) self.morerowbutton.grid(row=898, column=0, columnspan=8) self.verifybutton = Button( self, text="Verify", command=lambda: self.updategui(False)) self.verifybutton.grid(row=899, column=0, columnspan=8) self.misclist.append(self.labelCanUsername) self.misclist.append(self.labelCanRealname) self.misclist.append(self.entryCanUsername) self.misclist.append(self.entryCanRealname) self.misclist.append(self.labelHH) self.misclist.append(self.entryHH) self.misclist.append(self.entryMM) self.misclist.append(self.entryMo) self.misclist.append(self.entryDa) self.misclist.append(self.entryYr) self.misclist.append(self.morerowbutton) self.misclist.append(self.verifybutton) self.labelCanUsername.grid(row=2, column=0, sticky="e") self.labelCanRealname.grid(row=3, column=0, sticky="e") self.labelCanFlair.grid(row=4, column=0, sticky="e") self.entryCanUsername.grid(row=2, column=1, columnspan=3) self.entryCanRealname.grid(row=3, column=1, columnspan=3) self.entryCanFlair.grid(row=4, column=1, columnspan=3) self.entryMo.grid(row=5, column=1, sticky="e") self.entryDa.grid(row=5, column=2) self.entryYr.grid(row=5, column=3) self.labelHH.grid(row=5, column=0, sticky="se", pady=5) self.entryHH.grid(row=6, column=1, sticky="e") self.entryMM.grid(row=6, column=2, sticky="w") else: if self.curmode == self.optionDiscuss: verifies = [] i = self.entryPermalink.get() if len(i) == 6: pid = i else: if 'www.reddit.com/r/' in i and '/comments/' in i: pid = i.split('/comments/')[1].split('/')[0] if 'http://redd.it/' in i: pid = i.split('redd.it/')[1] for flag in self.verifylist: flag.grid_forget() self.verifylist.remove(flag) try: print('Fetching Submission ' + pid) self.r.get_info(thing_id="t3_" + pid).title + 'Check' self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=2, column=2) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: print( 'Failed. Make sure to include the http://. Copy and paste straight from your browser for best result' ) self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2, column=2) self.verifylist.append(self.redditlabel) verifies.append(False) for entry in self.entrylist: i = entry.get() if i != '': print('Fetching /r/' + i) if all(char in string.ascii_letters + string.digits + '_-' for char in i): try: sub = self.r.get_subreddit(i, fetch=True) self.redditlabel = Label( self, image=self.indicatorGreen) self.redditlabel.grid( row=entry.grid_info()['row'], column=2) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: self.redditlabel = Label( self, image=self.indicatorRed) self.redditlabel.grid( row=entry.grid_info()['row'], column=2) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') time.sleep(2) else: self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=entry.grid_info()['row'], column=2) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') print(verifies) if self.curmode == self.optionRegister: verifies = [] u = self.entryCanUsername.get() print('Fetching /u/' + u) if not all(char in string.ascii_letters + string.digits + '_-' for char in u): self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2, column=4) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tBad characterage') else: try: u = self.r.get_redditor(u) print(u) self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=2, column=4) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2, column=4) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') try: print('Checking Time') t = self.entryMo.get() + ' ' + self.entryDa.get( ) + ' ' + self.entryYr.get() + ' ' + self.entryHH.get( ) + ':' + self.entryMM.get() plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M") plandate = datetime.datetime.utcfromtimestamp( plandate.timestamp()) print('\t' + str(plandate.timestamp())) self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=5, column=3) self.verifylist.append(self.redditlabel) verifies.append(True) except: print('\tFailed') self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=5, column=3) self.verifylist.append(self.redditlabel) verifies.append(False) print(verifies) def morerows(self, label, columnm, columnn, limit, *args): self.redditlabel = Label(self, text=label) self.redditlabel.grid(row=self.newrowindex, column=columnm, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex, column=columnn, columnspan=9) self.entrylist.append(self.redditentry) self.newrowindex += 1 if self.newrowindex >= limit: self.morerowbutton.grid_forget() print(self.newrowindex)
class OOP(): def __init__(self): # Start TCP/IP server in its own thread svrT = Thread(target=startServer, daemon=True) svrT.start() # Create a Queue self.guiQueue = Queue() # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") self.createWidgets() self.defaultFileEntries() def methodInAThread(self, numOfLoops=10): for idx in range(numOfLoops): time.sleep(1) self.scr.insert(tk.INSERT, str(idx) + '\n') time.sleep(1) def defaultFileEntries(self): self.fileEntry.delete(0, tk.END) self.fileEntry.insert(0, fDir) if len(fDir) > self.entryLen: self.fileEntry.config(width=len(fDir) + 3) self.fileEntry.config(state='readonly') self.netwEntry.delete(0, tk.END) self.netwEntry.insert(0, netDir) if len(netDir) > self.entryLen: self.netwEntry.config(width=len(netDir) + 3) # Button Click event callback function def clickMe(self): #self.action.configure(text='Hello ' + self.name.get()+ ' ' + self.numberChosen.get()) # aLabel.configure(foreground='red') # self.createThread(8) qs.writeToScrol(self) time.sleep(2) htmlData = url.getHtml() print(htmlData) self.scr.insert(tk.INSERT, htmlData) # Radiobutton callback def radCall(self): radSel = self.radVar.get() if radSel == 0: # win.configure(background=colors[0]) self.monty2.configure(text='Blue') elif radSel == 1: # win.configure(background=colors[1]) self.monty2.configure(text='Gold') elif radSel == 2: # win.configure(background=colors[2]) self.monty2.configure(text='Red') # Spinbox callback def _spin(self): value = self.spin.get() print(value) self.scr.insert(tk.INSERT, value + '\n') # Display a message box Callback function def _msgBox(self): # mBox.showinfo('Python Message Info Box', 'A Python GUI created using tkinter: \nThe Year is 2016.') # Warning box # mBox.showwarning('Python Message Warning Box', 'A Python GUI created using tkinter: \nWarning: There might be a bug in this code.') # Error box # mBox.showerror('Python Message Warning Box', 'A Python GUI created using tkinter:\nError: Houston we DO have a serious PROBLEM!') answer = mBox.askyesno("Python Message Dual Choice Box", "Are you sure you really wish to do this?") print(answer) # Menu bar with functionality def _quit(self): self.win.quit() self.win.destroy() exit() def createWidgets(self): # Adding tabs self.tabControl = ttk.Notebook(self.win) self.tab1 = ttk.Frame(self.tabControl) self.tabControl.add(self.tab1, text='Tab 1') self.tabControl.pack(expand=1, fill="both") self.tab2 = ttk.Frame(self.tabControl) self.tabControl.add(self.tab2, text='Tab 2') # Creating a container frame to hold all other widgets self.monty = ttk.LabelFrame(self.tab1, text=' Monty Python ') self.monty.grid(column=0, row=0, padx=8, pady=4) # Second label for second tab self.monty2 = ttk.LabelFrame(self.tab2, text=' The Snake ') self.monty2.grid(column=0, row=0, padx=8, pady=4) # win.resizable(0,0) # Adding a label self.aLabel = ttk.Label(self.monty, text="A label") self.aLabel.grid(column=0, row=0) # Adding a button self.action = ttk.Button(self.monty, text="Click Me!", command=self.clickMe) # Position button in second row, second column (zero-based) self.action.grid(column=2, row=1) # Changing label ttk.Label(self.monty, text="Enter a name:").grid(column=0, row=0, sticky='W') # Adding a textbox entry widget self.name = tk.StringVar() self.nameEntered = ttk.Entry(self.monty, width=24, textvariable=self.name) self.nameEntered.grid(column=0, row=1, sticky=tk.W) self.nameEntered.delete(0, tk.END) self.nameEntered.insert(0, '< default name>') # Place cursor into name Entry #self.nameEntered.focus() self.tabControl.select(1) # Adding combo box widgets ttk.Label(self.monty, text="Choose a number: ").grid(column=1, row=0) self.number = tk.StringVar() self.numberChosen = ttk.Combobox(self.monty, width=14, textvariable=self.number, state='readonly') self.numberChosen['values'] = (1, 2, 4, 42, 100) self.numberChosen.grid(column=1, row=1) self.numberChosen.current(0) # Creating three checkbuttons self.chVarDis = tk.IntVar() self.check1 = tk.Checkbutton(self.monty2, text="Disabled", variable=self.chVarDis, state='disabled') self.check1.select() self.check1.grid(column=0, row=4, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.monty2, text="UnChecked", variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=4, sticky=tk.W) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.monty2, text="Enabled", variable=self.chVarEn) self.check3.select() self.check3.grid(column=2, row=4, sticky=tk.W) # Adding Radio buttons self.colors = ["Blue", "Gold", "Red"] # create three radiobuttons self.radVar = tk.IntVar() # Select non-existing index for radVar self.radVar.set(99) # Create three radiobutton widgets with a loop for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.monty2, text=self.colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=5, sticky=tk.W) # Adding a Spinbox widget # spin = Spinbox(monty, from_=0, to=10, width=5, bd=8, command=_spin) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.monty, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self._spin) self.spin.grid(column=0, row=2) # Adding a second Spinbox widget self.spin2 = Spinbox(self.monty, values=(0, 50, 100), width=5, bd=8, relief=tk.RAISED, command=self._spin) self.spin2.grid(column=1, row=2) # Using a sccrolled text control self.scrolW = 40 self.scrolH = 10 self.scr = scrolledtext.ScrolledText(self.monty, width=self.scrolW, height=self.scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=3, sticky='W', columnspan=3) # Create a container to hold labels self.labelsFrame = ttk.LabelFrame(self.monty2, text=' Labels in a Frame ') self.labelsFrame.grid(column=0, row=7, padx=20, pady=40) # Place labels into the container element ttk.Label(self.labelsFrame, text="Label1").grid(column=0, row=0) ttk.Label(self.labelsFrame, text="Label2").grid(column=0, row=1) ttk.Label(self.labelsFrame, text="Label3").grid(column=0, row=2) # Add space around labels inside labelFrame for child in self.labelsFrame.winfo_children(): child.grid_configure(padx=8, pady=4) # Place cursor into name Entry self.nameEntered.focus() # Create a menu self.menuBar = Menu(self.win) self.win.config(menu=self.menuBar) self.fileMenu = Menu(self.menuBar, tearoff=0) self.fileMenu.add_command(label="New") self.fileMenu.add_separator() self.fileMenu.add_command(label="Exit", command=self._quit) self.menuBar.add_cascade(label="File", menu=self.fileMenu) self.helpMenu = Menu(self.menuBar, tearoff=0) self.helpMenu.add_command(label="About", command=self._msgBox) self.menuBar.add_cascade(label="Help", menu=self.helpMenu) # Change the main windows icon # win.iconbitmap(r'/usr/bin/python3/icon/path') # Add a tooltip tt.createToolTip(self.spin, 'This is a Spin control.') # Add tooltips for more widgets tt.createToolTip(self.nameEntered, 'This is an entry control.') tt.createToolTip(self.action, 'This is a button control.') tt.createToolTip(self.scr, 'This is a scrolled text control.') ################################################################### # Create Manage Files Frame mngFilesFrame = ttk.LabelFrame(self.tab2, text='Manage Files: ') mngFilesFrame.grid(column=0, row=1, sticky='WE', padx=10, pady=5) # Button Callback def getFilename(): print('hello from getFileName') fDir = path.dirname(__file__) fName = fd.askopenfilename(parent=self.win, initialdir=fDir) # Add widgets to manage files frame lb = ttk.Button(mngFilesFrame, text="Browse to File...", command=getFilename) lb.grid(column=0, row=0, sticky=tk.W) file = tk.StringVar() self.entryLen = self.scrolW self.fileEntry = ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=file) self.fileEntry.grid(column=1, row=0, sticky=tk.W) logDir = tk.StringVar() self.netwEntry =ttk.Entry(mngFilesFrame, width=self.entryLen, textvariable=logDir) self.netwEntry.grid(column=1, row=1, sticky=tk.W) def copyFile(): import shutil src = self.fileEntry.get() file = src.split('/')[-1] dest = self.netwEntry.get() + '\\' + file try: shutil.copy(src, dest) mBox.showinfo('Copy File to Network', 'Success: File copied.') except FileNotFoundError as err: mBox.showerror('Copy File to Network', '*** Failed to copy file! **\n\n' + str(err)) except Exception as ex: mBox.showerror('Copy File to Network', '*** Failed to copy file! **\n\n' + str(ex)) cb = ttk.Button(mngFilesFrame, text="Copy File to: ", command=copyFile) cb.grid(column=0, row=1, sticky=tk.E) # Add some space around each label for child in mngFilesFrame.winfo_children(): child.grid_configure(padx=6, pady=6) # Running methods in Threads def createThread(self, num): self.runT = Thread(target=self.methodInAThread, args=[num]) self.runT.setDaemon(True) self.runT.start() # textBoxes are the Consumers of Queue data writeT = Thread(target=self.useQueues, daemon=True) writeT.start() # Create queue instances def useQueues(self): # guiQueue = Queue() # create queue instance # print(guiQueue) #for idx in range(10): #guiQueue.put('Message from a queue: ' + str(idx)) #while True: #print(guiQueue.get()) # Now using a class memeber Queue while True: print(self.guiQueue.get())
class OOP(): def __init__(self): # Initializer method # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") self.create_widgets() # Modified Button Click Function def click_me(self): self.action.configure(text='Hello ' + self.name.get() + ' ' + self.number_chosen.get()) self.create_thread() def use_queues(self): gui_queue = Queue() print(gui_queue) for idx in range(5): gui_queue.put('Message from a queue: ' + str(idx)) while True: print(gui_queue.get()) def create_thread(self): self.run_thread = Thread( target=self.method_in_a_thread, args=(8, ), ) self.run_thread.setDaemon(True) self.run_thread.start() write_thread = Thread(target=self.use_queues, daemon=True) write_thread.start() def method_in_a_thread(self, num_of_loop=5): print('Hi, how are you?') for idx in range(num_of_loop): sleep(2) self.scrol.insert('insert', f'{idx}\n') print('method_in_thread:', self.run_thread.is_alive()) # Spinbox callback def _spin(self): value = self.spin.get() print(value) self.scrol.insert(tk.INSERT, value + '\n') # GUI Callback def checkCallback(self, *ignored_args): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton Callback def radCall(self): radSel = self.radVar.get() if radSel == 0: self.mighty2.configure(text='Blue') elif radSel == 1: self.mighty2.configure(text='Gold') elif radSel == 2: self.mighty2.configure(text='Red') # update progressbar in callback loop def run_progressbar(self): self.progress_bar["maximum"] = 100 for i in range(101): sleep(0.05) self.progress_bar["value"] = i # increment progressbar self.progress_bar.update() # have to call update() in loop self.progress_bar["value"] = 0 # reset/clear progressbar def start_progressbar(self): self.progress_bar.start() def stop_progressbar(self): self.progress_bar.stop() def progressbar_stop_after(self, wait_ms=1000): self.win.after(wait_ms, self.progress_bar.stop) def usingGlobal(self): global GLOBAL_CONST print(GLOBAL_CONST) GLOBAL_CONST = 777 print(GLOBAL_CONST) # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() ##################################################################################### def create_widgets(self): tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='Tab 1') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Tab 2') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # LabelFrame using tab1 as the parent mighty = ttk.LabelFrame(tab1, text=' Mighty Python ') mighty.grid(column=0, row=0, padx=8, pady=4) # Modify adding a Label using mighty as the parent instead of win a_label = ttk.Label(mighty, text="Enter a name:") a_label.grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget self.name = tk.StringVar() self.name_entered = ttk.Entry(mighty, width=24, textvariable=self.name) self.name_entered.grid(column=0, row=1, sticky='W') # Adding a Button self.action = ttk.Button(mighty, text="Click Me!", command=self.click_me) self.action.grid(column=2, row=1) ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0) number = tk.StringVar() self.number_chosen = ttk.Combobox(mighty, width=14, textvariable=number, state='readonly') self.number_chosen['values'] = (1, 2, 4, 42, 100) self.number_chosen.grid(column=1, row=1) self.number_chosen.current(0) # Adding a Spinbox widget self.spin = Spinbox(mighty, values=(1, 2, 4, 42, 100), width=5, bd=9, command=self._spin) # using range self.spin.grid(column=0, row=2, sticky='W') # align left # Using a scrolled Text control scrol_w = 40 scrol_h = 10 # increase sizes self.scrol = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD) self.scrol.grid(column=0, row=3, sticky='WE', columnspan=3) for child in mighty.winfo_children( ): # add spacing to align widgets within tabs child.grid_configure(padx=4, pady=2) # ===================================================================================== # Tab Control 2 ---------------------------------------------------------------------- self.mighty2 = ttk.LabelFrame(tab2, text=' The Snake ') self.mighty2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.mighty2, text="Disabled", variable=chVarDis, state='disabled') check1.select() check1.grid(column=0, row=0, sticky=tk.W) chVarUn = tk.IntVar() check2 = tk.Checkbutton(self.mighty2, text="UnChecked", variable=chVarUn) check2.deselect() check2.grid(column=1, row=0, sticky=tk.W) chVarEn = tk.IntVar() check3 = tk.Checkbutton(self.mighty2, text="Enabled", variable=chVarEn) check3.deselect() check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons chVarUn.trace('w', lambda unused0, unused1, unused2: self.checkCallback()) chVarEn.trace('w', lambda unused0, unused1, unused2: self.checkCallback()) # First, we change our Radiobutton global variables into a list colors = ["Blue", "Gold", "Red"] # create three Radiobuttons using one variable self.radVar = tk.IntVar() # Next we are selecting a non-existing index value for radVar self.radVar.set(99) # Now we are creating all three Radiobutton widgets within one loop for col in range(3): curRad = tk.Radiobutton(self.mighty2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=1, sticky=tk.W) # row=6 # And now adding tooltips tt.create_ToolTip(curRad, 'This is a Radiobutton control') # Add a Progressbar to Tab 2 self.progress_bar = ttk.Progressbar(tab2, orient='horizontal', length=286, mode='determinate') self.progress_bar.grid(column=0, row=3, pady=2) # Create a container to hold buttons buttons_frame = ttk.LabelFrame(self.mighty2, text=' ProgressBar ') buttons_frame.grid(column=0, row=2, sticky='W', columnspan=2) # Add Buttons for Progressbar commands ttk.Button(buttons_frame, text=" Run Progressbar ", command=self.run_progressbar).grid(column=0, row=0, sticky='W') ttk.Button(buttons_frame, text=" Start Progressbar ", command=self.start_progressbar).grid(column=0, row=1, sticky='W') ttk.Button(buttons_frame, text=" Stop immediately ", command=self.stop_progressbar).grid(column=0, row=2, sticky='W') ttk.Button(buttons_frame, text=" Stop after second ", command=self.progressbar_stop_after).grid(column=0, row=3, sticky='W') for child in buttons_frame.winfo_children(): child.grid_configure(padx=2, pady=2) for child in self.mighty2.winfo_children(): child.grid_configure(padx=8, pady=2) # Creating a Menu Bar menu_bar = Menu(self.win) self.win.config(menu=menu_bar) # Add menu items file_menu = Menu(menu_bar, tearoff=0) file_menu.add_command(label="New") file_menu.add_separator() file_menu.add_command(label="Exit", command=self._quit) menu_bar.add_cascade(label="File", menu=file_menu) # Display a Message Box def _msgBox(): msg.showinfo( 'Python Message Info Box', 'A Python GUI created using tkinter:\nThe year is 2017.') # Add another Menu to the Menu Bar and an item help_menu = Menu(menu_bar, tearoff=0) help_menu.add_command( label="About", command=_msgBox) # display messagebox when clicked menu_bar.add_cascade(label="Help", menu=help_menu) # Change the main windows icon self.win.iconbitmap('pyc.ico') # It is not necessary to create a tk.StringVar() # strData = tk.StringVar() strData = self.spin.get() print("Spinbox value: " + strData) # call function self.usingGlobal() self.name_entered.focus() # Add Tooltips ----------------------------------------------------- # Add a Tooltip to the Spinbox tt.create_ToolTip(self.spin, 'This is a Spinbox control') # Add Tooltips to more widgets tt.create_ToolTip(self.name_entered, 'This is an Entry control') tt.create_ToolTip(self.action, 'This is a Button control') tt.create_ToolTip(self.scrol, 'This is a ScrolledText control')
class OOP(): def __init__(self): # Create instance self.win = tk.Tk() # Add a title self.win.title("Python GUI") self.createWidgets() # Button callback def clickMe(self): self.action.configure(text='Hello ' + self.name.get()) # Button callback Clear Text def clearScrol(self): self.scr.delete('1.0', tk.END) # Spinbox callback def _spin(self): value = self.spin.get() print(value) self.scr.insert(tk.INSERT, value + '\n') # Checkbox callback def checkCallback(self, *ignoredArgs): # only enable one checkbutton if self.chVarUn.get(): self.check3.configure(state='disabled') else: self.check3.configure(state='normal') if self.chVarEn.get(): self.check2.configure(state='disabled') else: self.check2.configure(state='normal') # Radiobutton callback function def radCall(self): radSel=self.radVar.get() if radSel == 0: self.monty2.configure(text='Blue') elif radSel == 1: self.monty2.configure(text='Gold') elif radSel == 2: self.monty2.configure(text='Red') # Exit GUI cleanly def _quit(self): self.win.quit() self.win.destroy() exit() def usingGlobal(self): GLOBAL_CONST = 777 print(GLOBAL_CONST) ##################################################################################### def createWidgets(self): # Tab Control introduced here -------------------------------------- tabControl = ttk.Notebook(self.win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='Tab 1') # Add the tab tab2 = ttk.Frame(tabControl) # Add a second tab tabControl.add(tab2, text='Tab 2') # Make second tab visible tabControl.pack(expand=1, fill="both") # Pack to make visible # ~ Tab Control introduced here ----------------------------------------- # We are creating a container frame to hold all other widgets self.monty = ttk.LabelFrame(tab1, text=' Monty Python ') self.monty.grid(column=0, row=0, padx=8, pady=4) # Changing our Label ttk.Label(self.monty, text="Enter a name:").grid(column=0, row=0, sticky='W') # Adding a Textbox Entry widget self.name = tk.StringVar() nameEntered = ttk.Entry(self.monty, width=12, textvariable=self.name) nameEntered.grid(column=0, row=1, sticky='W') # Adding a Button self.action = ttk.Button(self.monty, text="Click Me!", command=self.clickMe) self.action.grid(column=2, row=1) ttk.Label(self.monty, text="Choose a number:").grid(column=1, row=0) number = tk.StringVar() numberChosen = ttk.Combobox(self.monty, width=12, textvariable=number) numberChosen['values'] = (1, 2, 4, 42, 100) numberChosen.grid(column=1, row=1) numberChosen.current(0) # Adding a Spinbox widget using a set of values self.spin = Spinbox(self.monty, values=(1, 2, 4, 42, 100), width=5, bd=8, command=self._spin) self.spin.grid(column=0, row=2) # Using a scrolled Text control scrolW = 30; scrolH = 3 self.scr = scrolledtext.ScrolledText(self.monty, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, row=3, sticky='WE', columnspan=3) # TODO: ch11 new #------------------------------------------------------------------------- #------------------------------------------------------------------------- # Adding another Button self.action = ttk.Button(self.monty, text="Clear Text", command=self.clearScrol) self.action.grid(column=2, row=2) # Adding more Feature Buttons startRow = 4 for idx in range(12): if idx < 2: colIdx = idx col = colIdx else: col += 1 if not idx % 3: startRow += 1 col = 0 b = ttk.Button(self.monty, text="Feature " + str(idx+1)) b.grid(column=col, row=startRow) # Tab Control 3 ----------------------------------------- tab3 = ttk.Frame(tabControl) # Add a tab tabControl.add(tab3, text='Tab 3') # Make tab visible # We are creating a container frame to hold all other widgets -- Tab3 monty3 = ttk.LabelFrame(tab3, text=' New Features ') monty3.grid(column=0, row=0, padx=8, pady=4) # Adding more Feature Buttons startRow = 4 for idx in range(24): if idx < 2: colIdx = idx col = colIdx else: col += 1 if not idx % 3: startRow += 1 col = 0 b = ttk.Button(monty3, text="Feature " + str(idx+1)) b.grid(column=col, row=startRow) # Add some space around each label for child in monty3.winfo_children(): child.grid_configure(padx=8) #------------------------------------------------------------------------- # TODO: ch11 new end # Tab Control 2 refactoring ----------------------------------------- # We are creating a container frame to hold all other widgets -- Tab2 self.monty2 = ttk.LabelFrame(tab2, text=' Holy Grail ') self.monty2.grid(column=0, row=0, padx=8, pady=4) # Creating three checkbuttons chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.monty2, text="Disabled", variable=chVarDis, state='disabled') check1.select() check1.grid(column=0, row=0, sticky=tk.W) self.chVarUn = tk.IntVar() self.check2 = tk.Checkbutton(self.monty2, text="UnChecked", variable=self.chVarUn) self.check2.deselect() self.check2.grid(column=1, row=0, sticky=tk.W ) self.chVarEn = tk.IntVar() self.check3 = tk.Checkbutton(self.monty2, text="Toggle", variable=self.chVarEn) self.check3.deselect() self.check3.grid(column=2, row=0, sticky=tk.W) # trace the state of the two checkbuttons self.chVarUn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) self.chVarEn.trace('w', lambda unused0, unused1, unused2 : self.checkCallback()) # ~ Tab Control 2 refactoring ----------------------------------------- # Radiobutton list colors = ["Blue", "Gold", "Red"] self.radVar = tk.IntVar() # Selecting a non-existing index value for radVar self.radVar.set(99) # Creating all three Radiobutton widgets within one loop for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.monty2, text=colors[col], variable=self.radVar, value=col, command=self.radCall) curRad.grid(column=col, row=6, sticky=tk.W, columnspan=3) # And now adding tooltips tt.createToolTip(curRad, 'This is a Radiobutton control.') # Create a container to hold labels labelsFrame = ttk.LabelFrame(self.monty2, text=' Labels in a Frame ') labelsFrame.grid(column=0, row=7) # Place labels into the container element - vertically ttk.Label(labelsFrame, text="Label1").grid(column=0, row=0) ttk.Label(labelsFrame, text="Label2").grid(column=0, row=1) # Add some space around each label for child in labelsFrame.winfo_children(): child.grid_configure(padx=8) # Creating a Menu Bar menuBar = Menu(tab1) self.win.config(menu=menuBar) # Add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label="New") fileMenu.add_separator() fileMenu.add_command(label="Exit", command=self._quit) menuBar.add_cascade(label="File", menu=fileMenu) # Add another Menu to the Menu Bar and an item helpMenu = Menu(menuBar, tearoff=0) helpMenu.add_command(label="About") menuBar.add_cascade(label="Help", menu=helpMenu) # Change the main windows icon self.win.iconbitmap(r'C:\Python34\DLLs\pyc.ico') # Using tkinter Variable Classes strData = tk.StringVar() strData.set('Hello StringVar') print(strData.get()) # Default tkinter Variable Classes intData = tk.IntVar() print(intData.get()) print(tk.DoubleVar()) print(tk.BooleanVar()) # It is not necessary to create a tk.StringVar() strData = tk.StringVar() strData = self.spin.get() print("Hello " + strData) # Printing the Global works print(GLOBAL_CONST) # call method self.usingGlobal() # Place cursor into name Entry nameEntered.focus() # Add a Tooltip to the Spinbox tt.createToolTip(self.spin, 'This is a Spin control.') # Add Tooltips to more widgets tt.createToolTip(nameEntered, 'This is an Entry control.') tt.createToolTip(self.action, 'This is a Button control.') tt.createToolTip(self.scr, 'This is a ScrolledText control.')
class ResizeImageDialog(CustomDialog): def __init__(self, root, width, height, maintain_aspect_ratio=False, primary_dimension='width', title="Resize", on_change=list(), on_cancel=list(), on_confirm=list(), **kwargs): self.init_width = width self.init_height = height self.init_maintain_aspect_ratio = maintain_aspect_ratio self.init_primary_dimension = primary_dimension self.on_change = on_change self.on_confirm = on_confirm self.on_cancel = on_cancel self.window = Toplevel() self.window.title(title) self.window.transient(root) self.window.grab_set() self.primary_dimension = StringVar() self.primary_dimension.set(primary_dimension) self.resize_mode = StringVar() self.resize_mode.set('percentage') self.resize_percentage = IntVar() self.resize_percentage.set(100.0) self.resize_width = IntVar() self.resize_width.set(width) self.resize_height = IntVar() self.resize_height.set(height) self.maintain_aspect_ratio = IntVar() # See https://stackoverflow.com/a/4140988/11628429 self.vcmd_is_float = (self.window.register(self.is_float), '%P') self.vcmd_is_int = (self.window.register(self.is_int), '%P') self.percentage_radiobutton = Radiobutton(self.window, text='By percentage', value='percentage', variable=self.resize_mode, command=self.set_mode) self.percentage_radiobutton.grid(row=0, column=0) self.percentage_entry = Spinbox(self.window, from_=0, to=float('inf'), textvariable=self.resize_percentage, validate='all', validatecommand=self.vcmd_is_float) self.percentage_entry.grid(row=0, column=1) self.absolute_radiobutton = Radiobutton(self.window, text='By absolute value', value='absolute', variable=self.resize_mode, command=self.set_mode) self.absolute_radiobutton.grid(row=2, column=0) self.ratio_checkbox = Checkbutton(self.window, text='Maintain aspect ratio', variable=self.maintain_aspect_ratio, command=self.ratio_change) self.ratio_checkbox.grid(row=3, column=0) self.width_label = Label(self.window, text='Width') self.width_label.grid(row=5, column=0) self.width_entry = Spinbox( self.window, from_=0, to=float('inf'), textvariable=self.resize_width, validate='all', validatecommand=self.vcmd_is_int ) # needs a command to respect aspect ratio on change self.width_entry.grid(row=5, column=1) self.height_label = Label(self.window, text='Height') self.height_label.grid(row=6, column=0) self.height_entry = Spinbox(self.window, from_=0, to=float('inf'), textvariable=self.resize_height, validate='all', validatecommand=self.vcmd_is_int) self.height_entry.grid(row=6, column=1) self.cancel_button = Button(self.window, text='Cancel', command=self.cancel) self.cancel_button.grid(row=9, column=0) self.reset_button = Button(self.window, text='Reset', command=self.reset) self.reset_button.grid(row=9, column=1) self.confirm_button = Button(self.window, text='Confirm', command=self.confirm) self.confirm_button.grid(row=9, column=2) self.resize_percentage.trace('w', self.on_percentage_change) self.resize_width_trace_id = self.resize_width.trace( 'w', self.on_width_change) self.resize_height_trace_id = self.resize_height.trace( 'w', self.on_height_change) self.set_mode() def set_resize_width_without_trace(self, value): if not isinstance(value, int): raise TypeError('height should be an int') self.resize_width.trace_vdelete("w", self.resize_width_trace_id) self.resize_width.set(value) self.resize_width_trace_id = self.resize_width.trace( 'w', self.on_width_change) def set_resize_height_without_trace(self, value): if not isinstance(value, int): raise TypeError('width should be an int') self.resize_height.trace_vdelete("w", self.resize_height_trace_id) self.resize_height.set(value) self.resize_height_trace_id = self.resize_height.trace( 'w', self.on_height_change) def on_update(self, *args): mode = self.resize_mode.get() for callback in self.on_change: if mode == 'percentage': percentage = self.resize_percentage.get() / 100 callback(percentage, percentage, self.maintain_aspect_ratio.get(), self.primary_dimension.get()) else: callback(self.resize_width.get(), self.resize_height.get(), self.maintain_aspect_ratio.get(), self.primary_dimension.get()) def on_percentage_change(self, *args): self.on_update() def on_width_change(self, *args): self.primary_dimension.set('width') if self.maintain_aspect_ratio.get(): self.set_resize_height_without_trace( round(self.init_height * (self.resize_width.get() / self.init_width))) self.on_update() def on_height_change(self, *args): self.primary_dimension.set('height') if self.maintain_aspect_ratio.get(): self.set_resize_width_without_trace( round(self.init_width * (self.resize_height.get() / self.init_height))) self.on_update() def reset(self): self.resize_percentage.set(100.0) self.set_resize_width_without_trace(self.init_width) self.set_resize_height_without_trace(self.init_height) self.maintain_aspect_ratio.set(self.init_maintain_aspect_ratio) self.primary_dimension.set(self.init_primary_dimension) self.on_update() def set_mode(self): mode = self.resize_mode.get() if mode == 'percentage': self.percentage_entry.config(state='normal') self.ratio_checkbox.config(state='disabled') self.width_label.config(state='disabled') self.width_entry.config(state='disabled') self.height_label.config(state='disabled') self.height_entry.config(state='disabled') else: self.percentage_entry.config(state='disabled') self.ratio_checkbox.config(state='normal') self.width_label.config(state='normal') self.width_entry.config(state='normal') self.height_label.config(state='normal') self.height_entry.config(state='normal') def is_float(self, P): try: float(P) return True except ValueError: return False def is_int(self, P): return str.isdecimal(P) def ratio_change(self): if self.maintain_aspect_ratio.get(): if self.primary_dimension.get() == 'width': self.set_resize_height_without_trace( round(self.init_height * (self.resize_width.get() / self.init_width))) else: self.set_resize_width_without_trace( round(self.init_width * (self.resize_height.get() / self.init_height))) self.on_update() print(self.maintain_aspect_ratio.get()) print('w', self.resize_width.get()) print('h', self.resize_height.get())
class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("") #self.style = Style() #self.style.theme_use("clam") #self.pack(fill=BOTH, expand = 1) self.labelU = Label(self, text="U:") self.labelP = Label(self, text="P:") self.mailrecipient = 'GoldenSights' self.entryUsername = Entry(self) self.entryUsername.focus_set() self.entryUsername.bind('<Return>', lambda event: self.entryPassword.focus_set()) self.entryPassword = Entry(self) self.entryPassword.config(show='•') self.entryPassword.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton = Button(self, text="Login", command= lambda: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get())) self.newbutton.config(width=6) self.quitbutton = Button(self, text="Quit", command= lambda: self.quit()) self.quitbutton.config(width=6) self.labelU.grid(row=0, column=0,padx=0) self.entryUsername.grid(row=0, column=1) self.labelP.grid(row=1, column=0) self.entryPassword.grid(row=1, column=1, pady=4) self.newbutton.grid(row=2, column=1) self.quitbutton.grid(row=3, column=1, pady=4) self.labelErrorPointer = Label(self, text="◀") self.indicatorGreen = PhotoImage(file="indicatorGreen.gif") self.indicatorRed = PhotoImage(file="indicatorRed.gif") self.indicatorBlue = PhotoImage(file="indicatorBlue.gif") self.indicatorBlack = PhotoImage(file="indicatorBlack.gif") sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() w=400 h=480 x = (sw - w) / 2 y = (sh - h) / 2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50)) def login(self, username, password): print('U: ' + username) self.username = username if username == '' or not all(char in string.ascii_letters+string.digits+'_-' for char in username): print('Please enter a username') self.entryUsername.focus_set() self.labelErrorPointer.grid(row=0, column=2) elif password == '': print('Please enter a password') self.entryPassword.focus_set() self.labelErrorPointer.grid(row=1, column=2) else: self.labelErrorPointer.grid_forget() print('Attempting login for ' + username) try: self.USERAGENT = username + ' practices Tkinter+PRAW mixing with utility by /u/GoldenSights.' self.r = praw.Reddit(self.USERAGENT) #self.r.login(username, password) print('Success') self.labelU.grid_forget() self.labelP.grid_forget() self.entryUsername.grid_forget() self.entryPassword.grid_forget() self.newbutton.grid_forget() self.quitbutton.grid_forget() self.usernamelabel = Label(self, text=username + ', Sending to /u/' + self.mailrecipient) self.usernamelabel.grid(row=0, column=0, columnspan=8) self.quitbutton.grid(row=900, column=0) self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] self.optionDiscuss = "Discussion Flair + Crossposting" self.optionRegister = "Register a new Candidate" self.prevmode = self.optionDiscuss self.curmode = self.optionDiscuss self.optionvar = tkinter.StringVar(self) self.optionvar.trace("w",self.permaloop) self.optionvar.set(self.optionDiscuss) self.option = OptionMenu(self, self.optionvar, self.optionDiscuss, self.optionRegister, "three", "four") self.newbutton.unbind("<Return>") self.entryUsername.unbind("<Return>") self.entryPassword.unbind("<Return>") self.option.grid(row=1,column=0,columnspan=8,pady=8) self.updategui(True) except praw.errors.InvalidUserPass: pass print('Invalid username or password') self.entryPassword.delete(0,200) self.labelErrorPointer.grid(row=1, column=2) def permaloop(self, *args): self.curmode = self.optionvar.get() print('Was: ' + self.prevmode + ' | Now: ' + self.curmode) if self.curmode != self.prevmode: self.prevmode = self.curmode self.updategui(True) def updategui(self, *args): if args[0] == True: print('Cleaning GUI') for item in self.labellist: item.grid_forget() for item in self.entrylist: item.grid_forget() for item in self.verifylist: item.grid_forget() for item in self.misclist: item.grid_forget() self.labellist = [] self.entrylist = [] self.verifylist = [] self.misclist = [] if self.curmode == self.optionDiscuss: self.newrowindex = 4 self.labelPermalink = Label(self, text="Thread Permalink:") self.entryPermalink = Entry(self) self.rowconfigure(2,weight=2) self.labelPermalink.grid(row=2,column=0) self.entryPermalink.grid(row=2,column=1) self.labelcrossposting = Label(self,text="Crosspost to:") self.labelcrossposting.grid(row=3,column=0,columnspan=2,sticky="w") for m in range(5): self.redditlabel = Label(self,text="/r/") self.redditlabel.grid(row=self.newrowindex,column=0, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex,column=1) self.entrylist.append(self.redditentry) self.newrowindex +=1 self.morerowbutton = Button(self,text="+row",command=lambda: self.morerows('/r/', 0, 1, 20)) self.morerowbutton.grid(row=898,column=0,columnspan=2) self.verifybutton = Button(self,text="Verify",command= lambda: self.updategui(False)) self.verifybutton.grid(row=899,column=0,columnspan=2) self.newrowindex += 2 self.misclist.append(self.labelPermalink) self.misclist.append(self.labelcrossposting) self.misclist.append(self.entryPermalink) self.misclist.append(self.morerowbutton) self.misclist.append(self.verifybutton) if self.curmode == self.optionRegister: self.newrowindex = 6 self.labelCanUsername = Label(self, text="Candidate's Username: /u/") self.entryCanUsername = Entry(self) self.labelCanRealname = Label(self, text="Candidate's Realname:") self.entryCanRealname = Entry(self) self.labelCanFlair = Label(self, text="Candidate's Flair:") self.entryCanFlair = Entry(self) self.entryMo = Spinbox(self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')) self.entryDa = Spinbox(self, width=2, from_=1, to=31) self.entryYr = Spinbox(self, width=4, from_=2014, to=2500) self.labelHH = Label(self, text="Schedule time UTC:") self.entryHH = Spinbox(self, from_=0, to=23, width=2) self.entryMM = Spinbox(self, from_=0, to=59, width=2) self.entryYr.delete(0,'end') self.entryYr.insert(0,2014) self.morerowbutton = Button(self,text="+question",command=lambda: self.morerows('Q:', 0, 1, 25)) self.morerowbutton.grid(row=898,column=0,columnspan=8) self.verifybutton = Button(self,text="Verify",command= lambda: self.updategui(False)) self.verifybutton.grid(row=899,column=0,columnspan=8) self.misclist.append(self.labelCanUsername) self.misclist.append(self.labelCanRealname) self.misclist.append(self.entryCanUsername) self.misclist.append(self.entryCanRealname) self.misclist.append(self.labelHH) self.misclist.append(self.entryHH) self.misclist.append(self.entryMM) self.misclist.append(self.entryMo) self.misclist.append(self.entryDa) self.misclist.append(self.entryYr) self.labelCanUsername.grid(row=2, column=0, sticky="e") self.labelCanRealname.grid(row=3, column=0, sticky="e") self.entryCanUsername.grid(row=2, column=1, columnspan=3) self.entryCanRealname.grid(row=3, column=1, columnspan=3) self.entryMo.grid(row=4, column=1,sticky="e") self.entryDa.grid(row=4, column=2) self.entryYr.grid(row=4, column=3) self.labelHH.grid(row=4, column=0, sticky="se", pady=5) self.entryHH.grid(row=5, column=1, sticky="e") self.entryMM.grid(row=5, column=2, sticky="w") else: if self.curmode == self.optionDiscuss: verifies = [] i = self.entryPermalink.get() if len(i) == 6: pid = i else: if 'www.reddit.com/r/' in i and '/comments/' in i: pid = i.split('/comments/')[1].split('/')[0] if 'http://redd.it/' in i: pid = i.split('redd.it/')[1] for flag in self.verifylist: flag.grid_forget() self.verifylist.remove(flag) try: print('Fetching Submission ' + pid) self.r.get_info(thing_id="t3_" + pid).title + 'Check' self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=2,column=2) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: print('Failed. Make sure to include the http://. Copy and paste straight from your browser for best result') self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2,column=2) self.verifylist.append(self.redditlabel) verifies.append(False) for entry in self.entrylist: i = entry.get() if i != '': print('Fetching /r/' + i) if all(char in string.ascii_letters+string.digits+'_-' for char in i): try: sub = self.r.get_subreddit(i,fetch=True) self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=entry.grid_info()['row'],column=2) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=entry.grid_info()['row'],column=2) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') time.sleep(2) else: self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=entry.grid_info()['row'],column=2) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') print(verifies) if self.curmode == self.optionRegister: verifies = [] u=self.entryCanUsername.get() print('Fetching /u/' + u) if not all(char in string.ascii_letters+string.digits+'_-' for char in u): self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2, column=4) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tBad characterage') else: try: u = self.r.get_redditor(u) print(u) self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=2,column=4) self.verifylist.append(self.redditlabel) verifies.append(True) print('\tSuccess') except: self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=2,column=4) self.verifylist.append(self.redditlabel) verifies.append(False) print('\tFailed') try: print('Checking Time') t = self.entryMo.get() + ' ' + self.entryDa.get() + ' ' + self.entryYr.get() + ' ' + self.entryHH.get() + ':' + self.entryMM.get() plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M") plandate = datetime.datetime.utcfromtimestamp(plandate.timestamp()) print('\t' + str(plandate.timestamp())) self.redditlabel = Label(self, image=self.indicatorGreen) self.redditlabel.grid(row=5,column=3) self.verifylist.append(self.redditlabel) verifies.append(True) except: print('\tFailed') self.redditlabel = Label(self, image=self.indicatorRed) self.redditlabel.grid(row=5,column=3) self.verifylist.append(self.redditlabel) verifies.append(False) print(verifies) def morerows(self, label, columnm, columnn, limit, *args): self.redditlabel = Label(self,text=label) self.redditlabel.grid(row=self.newrowindex,column=columnm, sticky="e") self.labellist.append(self.redditlabel) self.redditentry = Entry(self) self.redditentry.grid(row=self.newrowindex,column=columnn, columnspan=8) self.entrylist.append(self.redditentry) self.newrowindex += 1 if self.newrowindex >= limit: self.morerowbutton.grid_forget() print(self.newrowindex)
root = Tk() root.title('Spinbox example') def spbox_val(): """Display spinbox current value.""" # If input is invalid, eg.non-numeric or blank, then return. try: spnbx_val = VAR.get() except TclError: return messagebox.showinfo('Spinbox', 'Spinbox value is ' + str(spnbx_val)) main_frame = LabelFrame(root, fg='blue', text=' Spinbox ') main_frame.grid(padx=10, pady=13, ipadx=5, ipady=3) VAR = IntVar() VAR.set(50) spn_bx = Spinbox(main_frame, from_=0, to=100, width=4, textvariable=VAR) Button(main_frame, bg='green2', text='Spinbox value', command=spbox_val).grid(row=0, column=1) spn_bx.grid(column=0, row=0, padx=10, pady=10) root.mainloop()
def createWidgets(self): tabControl= ttk.Notebook(self.win) tab1=ttk.Frame(tabControl) tabControl.add(tab1, text='Tab 1') tab2 = ttk.Frame(tabControl) tabControl.add(tab2, text='Tab 2') tab3 = ttk.Frame(tabControl) tabControl.add(tab3, text='Tab 3') tabControl.pack(expand=1, fill='both') tab3=tk.Frame(tab3,bg='blue') tab3.pack() for orangeColor in range(2): canvas = tk.Canvas(tab3, width=150,height=80,highlightthickness=0,bg='orange') canvas.grid(row=orangeColor,column=orangeColor) # create container to hold all widgets self.monty = ttk.LabelFrame(tab1,text=' Monty Python ') self.monty.grid(column=0,row=0,padx=8,pady=4) self.monty2 = ttk.LabelFrame(tab2,text=' The Snake ') self.monty2.grid(column=0,row=0,padx=8,pady=4) #Label ttk.Label(self.monty,text="Enter a name:").grid(column=0,row=0,sticky='W') #add a text box widget name = tk.StringVar() self.nameEntered = ttk.Entry(self.monty, width=12, textvariable=name) self.nameEntered.grid(column=0,row=1,sticky=tk.W) tt.createToolTip(self.nameEntered, 'This is an entry control') # combo box and label ttk.Label(self.monty, text='Choose a number:').grid(column=1, row=0) number = tk.StringVar() numberChosen = ttk.Combobox(self.monty, width=12, textvariable=number, state='readonly') numberChosen['values'] = (1,2,4,42,100) numberChosen.grid(column=1, row=1) numberChosen.current(0) # add a button action = ttk.Button(self.monty, text="Click Me!", command=self.clickMe) action.grid(column=2, row=1) #action.configure(state='disabled') #add check boxes chVarDis = tk.IntVar() check1 = tk.Checkbutton(self.monty2, text='Disabled',variable=chVarDis, state='disabled') check1.select() check1.grid(column=0,row=4, sticky=tk.W) chVarUn = tk.IntVar() check2 = tk.Checkbutton(self.monty2, text='UnChecked',variable=chVarUn) check2.deselect() check2.grid(column=1,row=4,sticky=tk.W) chVarEn = tk.IntVar() check3 = tk.Checkbutton(self.monty2, text='Enabled',variable=chVarEn) check3.select() check3.grid(column=2,row=4,sticky=tk.W) # Radiobutton list colors = ["Blue", "Gold", "Red"] #create three radio buttons self.radVar=tk.IntVar() self.radVar.set(99) for col in range(3): curRad = 'rad' + str(col) curRad = tk.Radiobutton(self.monty2, text=colors[col], variable=self.radVar, value = col, command=self.radCall) curRad.grid(column=col, row=5, sticky=tk.W) #add a spinbox self.spin = Spinbox(self.monty,from_=0,to=10,width=5,bd=8, command=self._spin) self.spin.grid(column=0,row=2) # add a tooltip tt.createToolTip(self.spin,'This is a Spin control.') spin2 = Spinbox(self.monty, values=(0,50,100),width=5,bd=10,command=self._spin,relief=tk.RIDGE) spin2.grid(column=1,row=2) # add scrolled text widget scrolW= 50 scrolH = 3 self.scr = scrolledtext.ScrolledText(self.monty, width=scrolW, height=scrolH, wrap=tk.WORD) self.scr.grid(column=0, sticky='WE',columnspan=3) #scr.grid(column=0, columnspan=3) tt.createToolTip(self.scr,'This is a ScrolledText widget.') # container to hold labels labelsFrame = ttk.LabelFrame(self.monty, text=' Labels in a Frame ') labelsFrame.grid(column=0,row=7,padx=20,pady=40) # place labels into the container ttk.Label(labelsFrame,text='Label1').grid(column=0,row=0) ttk.Label(labelsFrame,text='Label2').grid(column=0,row=1) ttk.Label(labelsFrame,text='Label3').grid(column=0,row=2) for child in labelsFrame.winfo_children(): child.grid_configure(padx=8,pady=4) # menu commands def _quit(self): self.win.quit() self.win.destroy() exit() #create menubar menuBar=Menu(self.win) self.win.config(menu=menuBar) # add menu items fileMenu = Menu(menuBar, tearoff=0) fileMenu.add_command(label='New') fileMenu.add_separator() fileMenu.add_command(label='Exit', command=_quit) menuBar.add_cascade(label='File',menu=fileMenu) helpMenu = Menu(menuBar,tearoff=0) helpMenu.add_command(label='About',command=self._msgBox) menuBar.add_cascade(label='Help',menu=helpMenu)