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)
Beispiel #2
0
    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)
Beispiel #3
0
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)])])
Beispiel #4
0
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()})
Beispiel #6
0
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')
Beispiel #7
0
    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)
Beispiel #9
0
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)
Beispiel #10
0
    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)
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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()
Beispiel #14
0
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
Beispiel #16
0
    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()
Beispiel #17
0
 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())
Beispiel #18
0
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!")
Beispiel #19
0
    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)
Beispiel #20
0
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()))
Beispiel #21
0
 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)
Beispiel #24
0
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')
Beispiel #27
0
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.')   
Beispiel #30
0
    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.')   
Beispiel #33
0
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)
Beispiel #34
0
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')
Beispiel #37
0
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)
Beispiel #38
0
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)
Beispiel #39
0
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)
Beispiel #40
0
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.')
Beispiel #44
0
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())
Beispiel #45
0
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)
Beispiel #46
0
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()
Beispiel #47
0
    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)