Pb de récupération de valeur Entry dans fenêtre secondaire

Résolu
LPAUC Messages postés 5 Statut Membre -  
LPAUC Messages postés 5 Statut Membre -
Bonjour à tous,
J'ai un problème qui persiste sur un code concernant la récupération de valeur d'"entry" ou pour un "checkbutton" dans une fenêtre secondaire.
J'ai beau utilisé ?.get() pour récupérer la valeur, mais l'erreur dit que mes variables ? n'existent pas hors elles ont été déclarées dans une fonction juste avant.

J'ai déjà réussi à récupérer des valeurs d'une fonction à une autre mais c'était dans une fenêtre principale (mainloop).

Auriez-vous une idée du problème?

Merci d'avance pour votre aide

1 réponse

  1. trifou
     
    Bonjour,

    Il faudrait que tu montres un exemple de code reproductible et simplifié, car on ne peut imaginer ce que tu as fait et où se situent tes erreurs.
    1
    1. LPAUC Messages postés 5 Statut Membre
       
      Voici le code simplifier:
      Dans la première fenêtre veuillez cliquer sur Mag.
      Ensuite dans la fenêtre, aller dans File --> Filtrer
      0
    2. LPAUC Messages postés 5 Statut Membre
       
      from tkinter import *
      from tkinter import filedialog
      from tkinter import *
      from tkinter import filedialog
      import shutil
      from tkinter.messagebox import *
      from bokeh.plotting import *
      from bokeh.io import output_notebook
      from bokeh.models import LinearColorMapper, BasicTicker, ColorBar
      from ipywidgets import interact
      from scipy.interpolate import griddata
      import numpy as np
      import matplotlib.pyplot as plt
      from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
      from matplotlib.figure import Figure

      Topo,Long,Lat,Mag=[],[],[],[]

      class mclassGravi:
      def __init__(self,window):
      self.window = window
      self.window.minsize(780,420)
      self.window.title("MAG - Sixense Engineering")
      self.window.iconbitmap("SixenseLogo.ico")
      Label(window,text="fonctionne pas")
      class mclassMag:
      def __init__(self,window):
      self.window = window
      self.window.minsize(780,420)
      self.window.title("MAG - Sixense Engineering")
      self.window.iconbitmap("SixenseLogo.ico")
      menubar = Menu(window)
      menu1 = Menu(menubar, tearoff=0)
      global Data

      menu1.add_command(label="Filtrer", command=self.Filt_WD)
      menu1.add_command(label="Quitter", command=self.quit1)
      menubar.add_cascade(label="File",menu=menu1)
      self.window.config(menu=menubar)
      def Filt_WD(self):
      global vv1,vv2,vv3,vv4
      windowFilt_WD=Tk()
      self.windowFilt_WD=windowFilt_WD
      self.windowFilt_WD.geometry("300x130")
      self.windowFilt_WD.title("Filter - Config Window")
      self.windowFilt_WD.iconbitmap("SixenseLogo.ico")
      vv1,vv2,vv3,vv4=IntVar(),IntVar(),DoubleVar(),DoubleVar()
      Check1=Checkbutton(windowFilt_WD, text = "HP", variable = vv1, onvalue = 1, offvalue = 0).grid(row=2, column=1)
      self.label=Label(windowFilt_WD,text="f (Hz): ").grid(row=3, column=1)
      minF=Entry(windowFilt_WD,textvariable=vv3).grid(row=3, column=2)

      Check2=Checkbutton(windowFilt_WD, text = "LP", variable = vv2, onvalue = 1, offvalue = 0).grid(row=5, column=1)
      self.label=Label(windowFilt_WD,text="f (Hz): ").grid(row=6, column=1)
      maxF=Entry(windowFilt_WD,textvariable=vv4).grid(row=6, column=2)
      self.button=Button (windowFilt_WD, text="Apply", command=self.Filt).grid(row=8, column=2)
      self.button=Button (windowFilt_WD, text="OK", command=self.quit9).grid(row=8, column=3)

      def Filt(self):
      Checkvar1,Checkvar2=vv1.get(),vv2.get()
      minF,maxF=vv3.get(), vv4.get()
      #Filtrage Data
      if minF==0 and Checkvar1==1:
      showerror("Alerte", "La fréquence minimale ne peut être égale à zéro.\nVeuillez modifier la valeur!!!")
      elif minF==0 and maxF==0 and Checkvar1==1 and Checkvar2==1:
      showerror("Alerte", "La fréquence minimale et maximale ne peuvent être égale à zéro.\nVeuillez modifier les valeurs!!!")
      elif maxF==0 and Checkvar1==1:
      showerror("Alerte", "La fréquence maximale ne peut être égale à zéro.\nVeuillez modifier la valeur!!!")
      elif Checkvar1==1 and Checkvar2==0:
      print(minF,maxF, Checkvar1,Checkvar2)
      elif Checkvar1==0 and Checkvar2==1:
      print(minF,maxF, Checkvar1,Checkvar2)
      elif Checkvar1==1 and Checkvar2==1:
      print(minF,maxF, Checkvar1,Checkvar2)
      else:
      showinfo("Alerte", "Problème avec les paramètres de filtrage!!!")

      def quit1 (self):
      self.window.destroy()
      def quit9 (self):
      self.windowFilt_WD.destroy()

      def mag():
      windowMagOrGravi.destroy()
      window=Tk()
      start=mclassMag(window)
      window.geometry("1000x550")
      window.mainloop()
      def gravi():
      windowMagOrGravi.destroy()
      window=Tk()
      start=mclassGravi(window)
      window.geometry("1000x550")
      window.mainloop()


      windowMagOrGravi=Tk()
      windowMagOrGravi.title("MagGrav - Sixense Engineering")
      windowMagOrGravi.iconbitmap("SixenseLogo.ico")
      Label(windowMagOrGravi,text=" \n \n \n \n \n \n \n").grid(row=1, column=1)
      Label(windowMagOrGravi,text=" ").grid(row=2, column=1)
      button1=Button (windowMagOrGravi, text="Mag", command=mag).grid(row=2, column=2)
      Label(windowMagOrGravi,text=" ").grid(row=2, column=3)
      button2=Button (windowMagOrGravi, text="Gravi", command=gravi).grid(row=2, column=4)
      Label(windowMagOrGravi,text=" ").grid(row=2, column=5)
      Label(windowMagOrGravi,text=" \n \n \n \n \n \n \n").grid(row=3, column=1)
      windowMagOrGravi.mainloop()
      0
      1. trifou > LPAUC Messages postés 5 Statut Membre
         
        On a pas la même notion du simple et reproductible.
        Et en l'état ton code ressemble à un gros pavé de texte illisible, c'est pour cela que les forums fournissent des balises codes afin de rendre un code lisible, ici c'est le bouton <>.

        Une fenêtre secondaire d'une fenêtre principale se fait avec Toplevel pas en définissant d'autres fenêtres principales Tk.

        def open_window():
            win = tk.Toplevel(root)
            entry = tk.Entry(win, textvariable=var_i).pack()    
            
        root = tk.Tk()
        var_i = tk.IntVar()
        
        tk.Button(root, text='open window', command=open_window).pack()
        tk.Button(root, text='show var', command=lambda: print(var_i.get())).pack()
        
        root.mainloop()


        Qui fonctionne parfaitement tant que l'on entre bien un entier *
        Remplace
        win = tk.Toplevel(root)
        par
        win = tk.Tk()
        et tu obtiendras le même problème que tu as.
        • Pour valider une saisie, Entry propose les paramètres validate et validatecommand afin d'autoriser la saisie de valeurs.
        0
    3. LPAUC Messages postés 5 Statut Membre
       
      Pour être dans le contexte du code, j'ai pris une partie du code, par contre pour la visualisation sur le message, je n'ai pas pris le temps de vérifier que les indentations étaient bien respectées.
      0
    4. LPAUC Messages postés 5 Statut Membre
       
      Merci pour ton aide!
      Le problème venait d'une mauvaise gestion des fenêtres!

      Désolé pour le manque de clarté du code!
      0