Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème TKINTER

    21 juin 2021 à 22:02:52

    J'ai voulu combiner un système de login / inscription à un générateur de mot de passe mais j'ai une erreur ligne 55 que je en comprends absolument pas, qi quelqu'un peut m'aider, merci d'avance. (PS: Ne jugez pas je débute et le generateur de mot de passe n'est pas forcément abouti c'était juste pour essayer)
    from tkinter import *
    import os
    
    def Inscription_code():
        nom_Inscription = Nominscription_entry.get()
        pass_Inscription = Passinscription_entry.get()
        File_inscription_name = os.listdir()
        if str(nom_Inscription) + ".txt" in File_inscription_name :
            print("Erreur 3 : Le nom d'utilisateur est déjà pris")
        else :
            File = open(str(nom_Inscription) + ".txt", "w")
            File.write(str(nom_Inscription) + ":" + str(pass_Inscription))
            File.close()
            print("Message 2 : Votre compte a été créé avec succès.")
    
    def Login_code():
        nom_login = Nomlogin_entry.get()
        pass_login = Passlogin_entry.get()
        File_login_name = os.listdir()
        if str(nom_login) + ".txt" in File_login_name :
            File1 = open(str(nom_login) + ".txt", "r")
            liste_info_login = File1.read().split(":")
            File1.close()
            if pass_login == liste_info_login[1] :
                print("Message 1 : Bienvenue, votre nom et votre mot de passe sont justes")
                from random import randint, choice
                import string
    
                def generate_password() :
                    password_min = 8
                    password_max = 12
                    all_chars = string.ascii_letters + string.punctuation + string.digits
                    password = "".join(choice(all_chars) for x in range(randint(password_min, password_max)))
                    password_entry.delete(0, END)
                    password_entry.insert(0, password)
    
                def reset_gen() :
                    password_entry.delete(0, END)
    
                # creer la fenetre
                window = Tk()
                window.title("Générateur de mot de passe")
                window.geometry("720x480")
                window.iconbitmap("logo.ico")
                window.config(background='#4065A4')
    
                # creer frame
                frame = Frame(window, bg='#4065A4')
    
                # creation d'image
                width = 300
                height = 300
                image = PhotoImage(file="privacy.png").zoom(15).subsample(32)
                canvas = Canvas(frame, width=width, height=height, bg='#4065A4', bd=0, highlightthickness=0)
                canvas.create_image(width/2, height/2, image=image)
                canvas.grid(row=0, column=0, sticky=W)
    
                # creer une sous boite
                right_frame = Frame(frame, bg='#4065A4')
    
                # creer un titre
                label_title = Label(right_frame, text="Mot de passe", font=("Helvetica", 20), bg='#4065A4', fg='white')
                label_title.pack()
    
                # creer un champ
                password_entry = Entry(right_frame, font=("Helvetica", 20), bg='#4065A4', fg='white')
                password_entry.pack()
    
                # creer un bouton
                generate_password_button = Button(right_frame, text="Générer", font=("Helvetica", 20), bg='#4065A4',
                                                  fg='white', command=generate_password)
                generate_password_button.pack(fill=X)
    
                # on place la sous boite a droite de la frame principale
                right_frame.grid(row=0, column=1, sticky=W)
    
                # afficher la frame
                frame.pack(expand=YES)
    
                # creation d'une barre de menu
                menu_bar = Menu(window)
    
                # creer un premier menu
                file_menu = Menu(menu_bar, tearoff=0)
                file_menu.add_command(label="Nouveau", command=generate_password)
                file_menu.add_command(label="Quitter", command=window.quit)
                file_menu.add_command(label="Reset", command=reset_gen)
                menu_bar.add_cascade(label="Fichier", menu=file_menu)
    
                # configurer la fenetre pour ajouter la menu bar
                window.config(menu=menu_bar)
    
                # afficher la fenetre
                window.mainloop()
    
            else :
                print("Erreur 2 : Le mot de passe est incorrect")
        else :
            print("Erreur 1 : L'identifiant n'existe pas")
    
    
    def login_window_open():
    
        Login_window = Tk()
        Login_window.title("Login")
        Login_window.geometry("470x400")
        Login_window.minsize(470,400)
        Login_window.maxsize(470,400)
        Login_window.config(background='#282882')
        Login_frame = Frame(Login_window, bg="#6D6DE3")
        Nom = Label(Login_frame, text="Nom :", font=("Arial", 20), width=15, height=1, bg="#6D6DE3", fg='black')
        Nom.grid(row=0, column=0)
        global Nomlogin_entry
        Nomlogin_entry = Entry(Login_frame, font=("Arial", 18), bg='white', fg='black', width=25)
        Nomlogin_entry.grid(row=0, column=1)
    
        Space = Label(Login_frame, text="", bg="#6D6DE3", height=1)
        Space.grid(row=1, column=0)
    
        Pass = Label(Login_frame, text="Mot de passe :", font=("Arial", 20), width=15, height=1, bg="#6D6DE3", fg='black')
        Pass.grid(row=2, column=0)
        global Passlogin_entry
        Passlogin_entry = Entry(Login_frame, font=("Arial", 18), bg='white', fg='black', width=25)
        Passlogin_entry.grid(row=2, column=1)
    
        Space = Label(Login_frame, text="", bg="#6D6DE3", height=1)
        Space.grid(row=4, column=0)
    
        Login_button = Button(Login_frame, text="Login", font=("Arail", 18), bg='white', fg='black', command=Login_code)
        Login_button.grid(row=4, column=1)
    
        Login_frame.pack(expand=YES)
        Login_window.mainloop()
    
    
    def inscription_window_open() :
        Inscription_window = Tk()
        Inscription_window.title("Inscription")
        Inscription_window.geometry("470x400")
        Inscription_window.minsize(470, 400)
        Inscription_window.maxsize(470, 400)
        Inscription_window.config(background='#282882')
        Inscription_frame = Frame(Inscription_window, bg="#6D6DE3")
        Nom = Label(Inscription_frame, text="Nom :", font=("Arial", 20), width=15, height=1, bg="#6D6DE3", fg='black')
        Nom.grid(row=0, column=0)
        global Nominscription_entry
        Nominscription_entry = Entry(Inscription_frame, font=("Arial", 18), bg='white', fg='black', width=25)
        Nominscription_entry.grid(row=0, column=1)
    
        Space = Label(Inscription_frame, text="", bg="#6D6DE3", height=1)
        Space.grid(row=1, column=0)
    
        Pass = Label(Inscription_frame, text="Mot de passe :", font=("Arial", 20), width=15, height=1, bg="#6D6DE3", fg='black')
        Pass.grid(row=2, column=0)
        global Passinscription_entry
        Passinscription_entry = Entry(Inscription_frame, font=("Arial", 18), bg='white', fg='black', width=25)
        Passinscription_entry.grid(row=2, column=1)
    
        Space = Label(Inscription_frame, text="", bg="#6D6DE3", height=1)
        Space.grid(row=4, column=0)
    
        Inscription_button = Button(Inscription_frame, text="Inscription", font=("Arail", 18), bg='white', fg='black', command=Inscription_code)
        Inscription_button.grid(row=4, column=1)
    
        Inscription_frame.pack(expand=YES)
        Inscription_window.mainloop()
    
    Menu_window = Tk()
    Menu_window.title("Menu :")
    Menu_window.geometry("350x175")
    Menu_window.minsize(350,175)
    Menu_window.maxsize(350,175)
    Menu_window.config(background="#007082")
    Menu_frame = Frame(Menu_window,width=310,height=135, bg='black')
    
    Login_button = Button(Menu_frame, text="Login", font=("Arial", 20), bg='white', fg='black', width=8, height=3, command=login_window_open)
    Login_button.grid(row=0, column=0)
    
    inscription_button = Button(Menu_frame, text="Inscription", font=("Arial", 20), bg='white', fg='black', width=8, height=3, command=inscription_window_open)
    inscription_button.grid(row=0, column=1)
    
    Menu_frame.pack(expand=YES)
    Menu_window.mainloop()

    -
    Edité par Dadou6942 21 juin 2021 à 22:05:17

    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2021 à 22:51:07

      Vous ne donnez pas le message d'erreur et on ne peut pas essayer vraiment votre programme puisque vous ne fournissez pas les images. J'ai cru que ça venait de zoom et subsample ligne 53 mais en fait non, voir peut-être cette discussion, je ne serais pas étonné que ce soi à cause du fait que vous ayez trois ou quatre mainloop dans votre programme, ce n'est absolument pas recommandé (mps avait donné un exemple récemment mais je ne trouve plus le lien), à moins que vous sachiez ce que vous faites, utilisez plutôt toplevel si vous voulez du multifenêtrage.

      • Partager sur Facebook
      • Partager sur Twitter
        22 juin 2021 à 7:49:40

        PascalOrtiz a écrit:

        Vous ne donnez pas le message d'erreur et on ne peut pas essayer vraiment votre programme puisque vous ne fournissez pas les images. J'ai cru que ça venait de zoom et subsample ligne 53 mais en fait non, voir peut-être cette discussion, je ne serais pas étonné que ce soi à cause du fait que vous ayez trois ou quatre mainloop dans votre programme, ce n'est absolument pas recommandé (mps avait donné un exemple récemment mais je ne trouve plus le lien), à moins que vous sachiez ce que vous faites, utilisez plutôt toplevel si vous voulez du multifenêtrage.


        D'accord je vais retirer les mainloop et voici l'erreur :

        Exception in Tkinter callback

        Traceback (most recent call last):

          File "C:\Users\theod\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__

            return self.func(*args)

          File "C:\Users\theod\login_project\main.py", line 57, in Login_code

            canvas.create_image(width/2, height/2, image=image)

          File "C:\Users\theod\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2790, in create_image

            return self._create('image', args, kw)

          File "C:\Users\theod\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2776, in _create

            return self.tk.getint(self.tk.call(

        _tkinter.TclError: image "pyimage3" doesn't exist

        • Partager sur Facebook
        • Partager sur Twitter
          22 juin 2021 à 8:05:50

          Dadou6942 a écrit:


          D'accord je vais retirer les mainloop et voici l'erreur :

          Exception in Tkinter callback

          Traceback (most recent call last):

           ...

          _tkinter.TclError: image "pyimage3" doesn't exist


          Il faudrait donner le nouveau code. Quand je dis retirer les mainloop, je me suis mal exprimé, ce que je veux dire c'est que vous devez essayer de n'écrire qu'un seul appel à Tk sur le résultat duquel vous brancherez l'unique mainloop, les autres fenêtres étant obtenues via Toplevel. Et sinon, vous avez essayé la solution proposée par le message de SO ?
          • Partager sur Facebook
          • Partager sur Twitter
            22 juin 2021 à 9:23:57

            L'erreur vient des multiples Tk.

            Une solution pour ne pas tout ré-écrire est de forcer le master lors de la création du PhotoImage:

                       image = PhotoImage(master=window, file="privacy.png").zoom(15).subsample(32)
             


            mais, un seul Tk, des Toplevel et un seul appel à mainloop restent la base et vous allez avoir d'autres soucis à utiliser des constructions avancés sans trop savoir pourquoi.

            • Partager sur Facebook
            • Partager sur Twitter
              22 juin 2021 à 17:19:33

              PascalOrtiz a écrit:

              Dadou6942 a écrit:


              D'accord je vais retirer les mainloop et voici l'erreur :

              Exception in Tkinter callback

              Traceback (most recent call last):

               ...

              _tkinter.TclError: image "pyimage3" doesn't exist


              Il faudrait donner le nouveau code. Quand je dis retirer les mainloop, je me suis mal exprimé, ce que je veux dire c'est que vous devez essayer de n'écrire qu'un seul appel à Tk sur le résultat duquel vous brancherez l'unique mainloop, les autres fenêtres étant obtenues via Toplevel. Et sinon, vous avez essayé la solution proposée par le message de SO ?

              Désolé mais je suis débutant et je ne sais absolument pas ce qu'est Toplevel 

              :)

              ps: si vous voulez abandonner avec moi, aucun problème :)



              • Partager sur Facebook
              • Partager sur Twitter
                22 juin 2021 à 17:23:29

                Dadou6942 a écrit:

                Désolé mais je suis débutant et je ne sais absolument pas ce qu'est Toplevel 




                Suffit de chercher :) :

                Toplevel

                • Partager sur Facebook
                • Partager sur Twitter

                Problème TKINTER

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown