Partage
  • Partager sur Facebook
  • Partager sur Twitter

[tkinter] Explications Toplevel()

Sujet résolu
    26 février 2014 à 14:46:22

    Bonjour,

    Je cherche des explications et des informations concernant le fonctionnement de la classe Toplevel(), la documentation étant trop pauvre à mon goût...

    Voilà le code qui m'intrigue :

    from tkinter import Toplevel
    
    fenetre = Toplevel()
    print(fenetre.geometry())
    fenetre.mainloop()

    Deux questions :

    • Pourquoi ce bout de code me crée-t-il deux fenêtres ?
    • Et pourquoi la géométrie renvoyée est 1x1+0+0, ce qui ne correspond absoluement pas à la géométrie réelle...
    Merci d'avance, ce post n'a pas de but précis, je suis simplement curieux. :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 février 2014 à 15:06:38

      Toplevel est une fenêtre fille à la fenêtre mère qui n'est pas indiqué dans ton cas. Ça s'utilise plus dans ce sens

      from tkinter import *
      
      root = Tk()
      
      t = Toplevel(root)
      
      root.mainloop()


      Pour la méthode geometry, 1x1 donne des informations sur la taille qui est de 1x1 pixel, ce qui arrive quand tu ne places pas de widgets dans ta fenêtre.

      Pour le 0+0, la fenêtre sera positionnée en (0, 0)

      • Partager sur Facebook
      • Partager sur Twitter
        26 février 2014 à 15:36:02

        Ok, merci, vous répondez bien à ma première question, mais pas vraiment à ma deuxième : en effet, j'ai maintenant le code suivant :

        from tkinter import *
        
        fenetre = Tk()
        top = Toplevel(fenetre)
        bouton = Button(top, text = "Ok", command = fenetre.destroy)
        bouton.pack()
        print(top.geometry(), fenetre.geometry()) # Affiche 1x1+0+0 1x1+0+0
        top.geometry("{}x{}+{}+{}".format(300, 100, 400, 400))
        print(top.geometry()) # Affiche 1x1+400+400
        fenetre.mainloop()

        Ce qui me pose problème est que : premièrement la géométrie renvoyée ne correspond pas à la géométrie réelle, puisque, évidemment, aucune des deux fenêtre ne fait 1 pixel, et elles ne sont en pratique pas placées au point de coordonnées (0, 0), mais un peu plus bas en général.

        De plus, même en plaçant un bouton à l'intérieur et en changeant manuellement la taille de la fenêtre Toplevel(), la géométrie affichée n'est pas affectée comme il le faudrait (pour être précis, la largeur et la hauteur de la fenêtre restent à 1).

        -
        Edité par zintor 26 février 2014 à 15:38:05

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          26 février 2014 à 16:32:56

          C'est une fenêtre, je lui imposerais une taille minimale, puis j'indiquerais les infos comme tu l'as fais

          from tkinter import *  
          
          root = Tk()
          
          WIDTH, HEIGHT = 300, 100
          
          win = Toplevel(root)
          win.minsize(width=300, height=100)
          win.wm_geometry("{}x{}+{}+{}".format(WIDTH, HEIGHT, 400, 400))
          
          button = Button(win, text='OK', command=win.destroy)
          button.pack()
          
          root.mainloop()

          Je pense que pour retrouver les informations sur la fenêtre, ça doit être une autre méthode que geometry, mais je ne sais laquelle.

          Le positionnement et la taille semble correct chez moi... c'est pourquoi j'en déduis la phrase du dessus

          • Partager sur Facebook
          • Partager sur Twitter
            26 février 2014 à 16:41:54

            Oui, les dimensions réelles (visibles) de la fenêtre correspondont bien à celles attendues, c'est juste la méthode geometry() qui ne fonctionne pas comme elle devrait. Merci quand même, comme je le disais ce n'est pas très important, c'est juste par curiosité :)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              26 février 2014 à 17:02:17

              Encore une fois Tkinter est vicieux, j'ai trouvé !!!

              Il faut remettre à jour ta Toplevel

              from tkinter import *
               
              fenetre = Tk()
              top = Toplevel(fenetre)
              bouton = Button(top, text = "Ok", command = fenetre.destroy)
              bouton.pack()
              print(top.geometry(), fenetre.geometry()) # Affiche 1x1+0+0 1x1+0+0
              top.geometry("{}x{}+{}+{}".format(300, 100, 400, 400))
              
              top.update()
              
              print(top.geometry()) # Affiche 300x100+400+400
              fenetre.mainloop()

              En gros un calcul préalable de la géométrie a été fait, il faut raffraîchir pour avoir les nouvelles valeurs mises à jour !



              -
              Edité par Anonyme 26 février 2014 à 17:15:33

              • Partager sur Facebook
              • Partager sur Twitter
                26 février 2014 à 17:49:46

                Super, merci je ne connaissais pas cette méthode ! :)
                • Partager sur Facebook
                • Partager sur Twitter

                [tkinter] Explications Toplevel()

                × 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