Ejemplo n.º 1
0
def askComplicationjour(tache, periodeManager):
    choix = None
    periode = None

    def onClose(bouton):
        # Permet de modifier les valeurs des variables
        nonlocal choix, periode
        if bouton == 'Ok':
            choix = varRadio.get()
            if choix == "changer":
                for p in periodeManager.getPeriodes():
                    if p.nom == combo.get():
                        periode = p
        fen.destroy()

    def stateCombobox():
        if varRadio.get() == "changer":
            combo.config(state=ACTIVE)
        else:
            combo.config(state=DISABLED)

    fen = Dialog(title="%s n'est pas dans la période active" % tache.getNom(),
                 buttons=("Ok", "Annuler"),
                 command=onClose,
                 exitButton=('Ok', 'Annuler', "WM_DELETE_WINDOW"))

    # Binding des touches
    fen.bind_all("<Return>", lambda e: fen.execute("Ok"))
    fen.bind_all("<Escape>", lambda e: fen.execute("Annuler"))

    l = Label(
        fen,
        text=
        "La tache \"%s\" se trouve maintenant hors de la période. Que voulez-vous faire ?"
        % tache.getNom())

    frameRadio = LabelFrame(fen, text="Options")
    varRadio = StringVar()
    r1 = Radiobutton(frameRadio,
                     text="Agrandir la période",
                     value="agrandir",
                     variable=varRadio,
                     command=stateCombobox)
    r2 = Radiobutton(frameRadio,
                     text="Faire de %s une tache indépendante" %
                     tache.getNom(),
                     value="independante",
                     variable=varRadio,
                     command=stateCombobox)
    r3 = Radiobutton(frameRadio,
                     text="Supprimer %s." % tache.getNom(),
                     value="supprimer",
                     variable=varRadio,
                     command=stateCombobox)
    r4 = Radiobutton(frameRadio,
                     text="Changer la période de %s." % tache.getNom(),
                     value="changer",
                     variable=varRadio,
                     command=stateCombobox)
    # valeur par défaut :
    varRadio.set("agrandir")

    r1.grid(sticky="w")
    r2.grid(row=1, sticky="w")
    r3.grid(row=2, sticky="w")
    r4.grid(row=3, sticky="w")

    periodesExistantes = periodeManager.getPeriodes()
    pp = Periode(periodeManager, "",
                 tache.getDebut().date(),
                 tache.getFin().date(), "")
    periodesExistantes = [
        p.nom for p in periodesExistantes if p.intersectWith(pp)
    ]
    combo = Combobox(frameRadio, values=periodesExistantes)

    combo.grid(row=3, column=1, sticky="we")
    if periodesExistantes:
        combo.set(combo.cget("values")[0])
    else:
        combo.config(state=DISABLED)
        r4.config(state=DISABLED)

    l.pack()
    frameRadio.pack(expand=YES, fill=BOTH, pady=4, padx=4)

    # Active et attend (un peu comme une mainloop)
    fen.activateandwait()
    return choix, periode
Ejemplo n.º 2
0
def askDecalJour(debut, fin, totBloque, tarBloque):
    """
    Dialog pour demander comment décaler les tâches
    @param debut     : (date) jour de début de la période
    @param fin       : (date) jour de fin de la période
    @param totBloque : (int) nombre de jours à partir duquel le blocage devient utile
    @param tarBloque : (int) nombre de jours à partir duquel le blocage devient utile
    """
    nbJour = None
    position = None
    param = None

    def onClose(bouton):
        # Permet de modifier les valeurs des variables
        nonlocal nbJour, position, param
        if bouton == 'Ok':
            position = varRadioGestion.get()
            param = varRadioParam.get()
            nbJour = int(sb.get())
            if varRadioGestion.get() == "tot":
                nbJour = nbJour * -1
        fen.destroy()

    # Pour adapter le nombre d'jour max du spinBoc
    def adapteSpinbox():
        newVar = 0
        if varRadioGestion.get() == "tot" and varRadioParam.get() == "bloquer":
            newVar = totBloque
        elif varRadioGestion.get() == "tard" and varRadioParam.get(
        ) == "bloquer":
            newVar = tarBloque
        elif varRadioGestion.get() == "tot" or varRadioGestion.get() == "tard":
            newVar = "+inf"

        # On config
        sb.config(to=newVar)
        # Si on dépasse, on reset au max
        if isinstance(newVar, str):
            return
        if int(sb.get()) > newVar:
            sb.set(int(newVar))

    fen = Dialog(title="Nombre de jours à déplacer",
                 buttons=("Ok", "Annuler"),
                 command=onClose,
                 exitButton=('Ok', 'Annuler', "WM_DELETE_WINDOW"))
    # Binding des touches
    fen.bind_all("<Return>", lambda e: fen.execute("Ok"))
    fen.bind_all("<Escape>", lambda e: fen.execute("Annuler"))

    # Mettre les widgets
    framePos = Frame(fen)
    varRadioGestion = StringVar()
    rG1 = Radiobutton(framePos,
                      text="Déplacer plus tot",
                      variable=varRadioGestion,
                      value="tot",
                      command=adapteSpinbox)
    rG2 = Radiobutton(framePos,
                      text="Déplacer plus tard",
                      variable=varRadioGestion,
                      value="tard",
                      command=adapteSpinbox)
    rG1.grid(row=0, sticky="w")
    rG2.grid(row=1, sticky="w")

    frameJour = Labelframe(fen, text="Déplacer de combien de jours ?")
    lb = Label(frameJour, text="Nombre de jours :")
    sb = Spinbox(frameJour, from_=0, to="+inf")
    sb.set(0)
    lb.pack(side=LEFT, fill=BOTH)
    sb.pack(side=LEFT, fill=X, expand=YES)

    frameParametre = Frame(fen)
    varRadioParam = StringVar()
    rP1 = Radiobutton(frameParametre,
                      text="Garder la même durée entre chaque tache",
                      variable=varRadioParam,
                      value="duree",
                      command=adapteSpinbox)
    rP2 = Radiobutton(
        frameParametre,
        text="Garder les tâches entre le %02i/%02i et le %02i/%02i" %
        (debut.day, debut.month, fin.day, fin.month),
        variable=varRadioParam,
        value="bloquer",
        command=adapteSpinbox)
    rP1.grid(row=0, sticky="w")
    rP2.grid(row=1, sticky="w")

    framePos.pack(side=TOP, expand=YES, fill=BOTH)
    frameJour.pack(side=TOP, expand=YES, fill=BOTH)
    frameParametre.pack(side=TOP, expand=YES, fill=BOTH)

    varRadioGestion.set("tard")
    varRadioParam.set("duree")

    # Active et attend (un peu comme une mainloop)
    fen.activateandwait()
    return nbJour, position, param
Ejemplo n.º 3
0
def askAjouterJour(totalJour):
    nbJour   = None
    position = None

    def onClose(bouton):
        # Permet de modifier les valeurs des variables
        nonlocal nbJour, position
        if bouton == 'Ok':
            position = varRadioBouton.get()
            nbJour = int(sb.get())
            if varRadioGestion.get() == "Retirer":
                nbJour = nbJour*-1
        fen.destroy()

    # Pour adapter le nombre de jour max du spinBox
    def adapteSpinbox():
        newVar = 0
        if   varRadioGestion.get() == "Retirer":
            newVar = totalJour
            # Si on dépasse, on reset au max
            if int(sb.get()) > newVar:
                sb.set(int(newVar))
        elif varRadioGestion.get() == "Ajouter":
            newVar = "+inf"
        # On config
        sb.config(to = newVar)

    fen = Dialog(title = "Nombre de jours à ajouter",
           buttons = ("Ok", "Annuler"), command = onClose, exitButton = ('Ok', 'Annuler', "WM_DELETE_WINDOW"))
    # Binding des touches
    fen.bind_all("<Return>", lambda e: fen.execute("Ok"))
    fen.bind_all("<Escape>", lambda e: fen.execute("Annuler"))

    # Mettre les widgets
    frameGestion = Frame(fen)
    varRadioGestion = StringVar()
    rG1= Radiobutton(frameGestion, text = "Ajouter les jours", variable = varRadioGestion, value = "Ajouter", command = adapteSpinbox)
    rG2= Radiobutton(frameGestion, text = "Retirer les jours", variable = varRadioGestion, value = "Retirer", command = adapteSpinbox)
    rG1.grid(row=0, sticky="w")
    rG2.grid(row=1, sticky="w")

    framejour = Labelframe(fen, text="Combien de jours ajouter ?")
    lb = Label(framejour,text="Nombre d'jour :")
    sb = Spinbox(framejour, from_ = 0, to="+inf")
    sb.set(0)
    lb.pack(side=LEFT, fill=BOTH)
    sb.pack(side=LEFT, fill=X, expand=YES)

    framePos = Labelframe(fen, text="Où rajouter les jours ?")
    varRadioBouton = StringVar()
    r1 = Radiobutton(framePos, text = "Au début de la période", variable = varRadioBouton, value = "Avant", command = adapteSpinbox)
    r2 = Radiobutton(framePos, text = "À la fin de la période", variable = varRadioBouton, value = "Apres", command = adapteSpinbox)
    r1.grid(row=0, sticky="w")
    r2.grid(row=1, sticky="w")

    frameGestion.pack(side = TOP, expand = YES, fill = BOTH)
    framejour.pack(  side = TOP, expand = YES, fill = BOTH)
    framePos.pack(    side = TOP, expand = YES, fill = BOTH)

    varRadioGestion.set("Ajouter")
    varRadioBouton.set("Apres")




    # Active et attend (un peu comme une mainloop)
    fen.activateandwait()
    return nbJour, position
Ejemplo n.º 4
0
def askDecalHeure(heureRetirerMax, heureAjoutMax, debut, fin, totBloque,
                  tarBloque):
    """
    Dialog pour demander comment décaler les tâches
    @param heureRetirerMax : (int) nombre d'heure que l'on peut retirer maximum à la tache qui commence le plus tardivement
    @param heureAjoutMax   : (int) nombre d'heure que l'on peut ajouter maximum à la tache qui termine le plus tôt
    @param debut           : (time) heure de début d'affichage
    @param fin             : (time) heure de fin d'affichage
    @param totBloque       : (int) nombre d'heure à partir duquel le blocage devient utile
    @param tarBloque       : (int) nombre d'heure à partir duquel le blocage devient utile
    """
    nbHeure = None
    position = None
    param = None

    def onClose(bouton):
        # Permet de modifier les valeurs des variables
        nonlocal nbHeure, position, param
        if bouton == 'Ok':
            position = varRadioGestion.get()
            param = varRadioParam.get()
            nbHeure = int(sb.get())
            if varRadioGestion.get() == "tot":
                nbHeure = nbHeure * -1
        fen.destroy()

    # Pour adapter le nombre d'heure max du spinBoc
    def adapteSpinbox():
        newVar = 0
        if varRadioGestion.get() == "tot" and varRadioParam.get() == "bloquer":
            newVar = totBloque
        elif varRadioGestion.get() == "tot":
            newVar = heureRetirerMax
        elif varRadioGestion.get() == "tard" and varRadioParam.get(
        ) == "bloquer":
            newVar = tarBloque
        elif varRadioGestion.get() == "tard":
            newVar = heureAjoutMax

        # On config
        sb.config(to=newVar)
        # Si on dépasse, on reset au max
        if int(sb.get()) > newVar:
            sb.set(int(newVar))

    fen = Dialog(title="Nombre d'heure à déplacer",
                 buttons=("Ok", "Annuler"),
                 command=onClose,
                 exitButton=('Ok', 'Annuler', "WM_DELETE_WINDOW"))
    # Binding des touches
    fen.bind_all("<Return>", lambda e: fen.execute("Ok"))
    fen.bind_all("<Escape>", lambda e: fen.execute("Annuler"))

    # Mettre les widgets
    framePos = Frame(fen)
    varRadioGestion = StringVar()
    rG1 = Radiobutton(framePos,
                      text="Déplacer plus tot",
                      variable=varRadioGestion,
                      value="tot",
                      command=adapteSpinbox)
    rG2 = Radiobutton(framePos,
                      text="Déplacer plus tard",
                      variable=varRadioGestion,
                      value="tard",
                      command=adapteSpinbox)
    rG1.grid(row=0, sticky="w")
    rG2.grid(row=1, sticky="w")

    frameHeure = Labelframe(fen, text="Déplacer de combien d'heure ?")
    lb = Label(frameHeure, text="Nombre d'heure :")
    sb = Spinbox(frameHeure, from_=0, to=heureAjoutMax)
    sb.set(0)
    lb.pack(side=LEFT, fill=BOTH)
    sb.pack(side=LEFT, fill=X, expand=YES)

    frameParametre = Frame(fen)
    varRadioParam = StringVar()
    rP1 = Radiobutton(frameParametre,
                      text="Garder la même durée entre chaque tache",
                      variable=varRadioParam,
                      value="duree",
                      command=adapteSpinbox)
    rP2 = Radiobutton(frameParametre,
                      text="Garder les tâches entre %s:%02i et %s:%02i" %
                      (debut.hour, debut.minute, fin.hour, fin.minute),
                      variable=varRadioParam,
                      value="bloquer",
                      command=adapteSpinbox)
    rP1.grid(row=0, sticky="w")
    rP2.grid(row=1, sticky="w")

    framePos.pack(side=TOP, expand=YES, fill=BOTH)
    frameHeure.pack(side=TOP, expand=YES, fill=BOTH)
    frameParametre.pack(side=TOP, expand=YES, fill=BOTH)

    varRadioGestion.set("tard")
    varRadioParam.set("duree")

    # Active et attend (un peu comme une mainloop)
    fen.activateandwait()
    return nbHeure, position, param
Ejemplo n.º 5
0
def askProfil(obligatoire, app, listeProfil):
    """
    Dialogue qui demande a créer un profil
    @param obligatoire : <bool> True  = création d'un profil, pour un user si il en a 0
                                False = création d'un profil, facultatif
    @param app         : <Application> pour quitter en cas de Bool True et croix
    @param listeProfil : <dict> de tout les profils avec leurs paths, on dois la passer car la premiere fois on peut pas passer par l'app car le profil manager n'est pas encore crée
    """
    listeFolder = listeProfil.values(
    )  # <dict_values> contient tous les paths des profils
    nom = None
    folder = None

    def onClose(bouton):
        # Permet de modifier les valeurs des variables
        nonlocal nom, folder
        # Récupération des valeurs
        nom = entryNom.get()
        folder = varEntryPath.get()

        if bouton == "Ok":
            # On regarde si le dossier est vide
            testVide(folder)
            # Ne cherche que dans les "keys" qui sont les noms des profils ☺
            if nom in listeProfil:
                showerror(title="Erreur",
                          message="Ce nom est déjà pris pour un autre profil")
                return
            elif folder in listeFolder:
                showerror(
                    title="Erreur",
                    message="Ce dossier est déjà pris pour un autre profil")
                return

        # Dans tous les cas quand c'est annulé :
        else:
            if obligatoire:
                if not askyesnowarning(
                        title="Erreur",
                        message=
                        "Vous n'avez pas encore de profil, vous devez un créer un pour commencer.\nCliquez sur \"non\" pour fermer l'application"
                ):
                    # Si vraiment il est conscient et qu'il veut quitter...
                    app.destroy()
                    raise SystemExit(0)  # Pour finir le programme sans soucis
                return
            else:
                nom = folder = None

        fen.destroy()

    def parcourir():
        """
       fonction qui demande où stocker les fichier ET vérifie si le dossier est bien vide
       """
        path = askFolder(vide=True)
        # on set le nouveau path
        if path is not None:
            varEntryPath.set(path)

    fen = Dialog(master=app,
                 title="Création d'un profil",
                 buttons=("Ok", "Annuler"),
                 command=onClose,
                 exitButton=[])
    # Binding des touches
    fen.bind_all("<Return>", lambda e: fen.execute("Ok"))
    fen.bind_all("<Escape>", lambda e: fen.execute("Annuler"))

    # Widgets
    lbDebut = Label(fen, text="Créez un profil pour sauvegarder vos données")
    lbNom = Label(fen, text="Nom :")
    entryNom = Entry(fen)

    framePath = Frame(fen)
    lbPathCustomFile = Label(
        framePath,
        text="Chemin d'enregistrement de vos fichiers de préférences")
    varEntryPath = StringVar()
    entryPathCustomFile = Entry(framePath,
                                state="normal",
                                textvariable=varEntryPath)
    btnParcourir = Button(framePath, text="...", command=parcourir, width=3)

    # Affichage
    lbDebut.grid(column=0, row=0, columnspan=2, sticky="wens", pady=3)
    lbNom.grid(column=0, row=1, sticky="w")
    entryNom.grid(column=1, row=1, sticky="we")
    framePath.grid(column=0, row=2, columnspan=2, sticky="wens")
    lbPathCustomFile.grid(column=0, row=0, sticky="w")
    entryPathCustomFile.grid(column=0, row=1, sticky="we")
    btnParcourir.grid(column=1, row=1, sticky="w")

    # preset
    entryNom.insert(END, os.getlogin())
    varEntryPath.set((os.path.expanduser("~/.taskManager/")).replace(
        "/", os.sep).replace("\\", os.sep))

    fen.activateandwait()
    return nom, folder