Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter problème redimensionnement des boutons

Sujet résolu
    20 mai 2022 à 1:07:51

    Salut à tous

    J'ai un petit problème d'auto redimensionnement de bouton dans mon démineur

    J'ai ma grille de boutons bien dimensionné:

    Quand un chiffre apparait, la dimension change (j'ai cherché des heures sur internet mais je n'ai rien trouvé), c'est dérangeant au niveau esthétique et aussi au niveau performances (quand la grille devient assez grande, cela crée de gros lags pour actualiser tous les boutons sur la même colonne) :

    J'ai trouvé une solution alternative pour ce problème, changer la taille de la police, mais c'est vraiment pas le but, car si je change de taille de bouton il y aura le même problème.

    2ème problème,

    Quand le nombre de mine est assez élevé, et que je perds, toutes les mines s'affichent puis leur dimensions se rétrécissent énormément (ici j'ai mit 100 mines sur un terrain 10x10):

    J'ai essayé screen.grid_rowconfigure() et screen.grid_columnconfigure() sans résultats

    Je suis bloqué

    Code (il manque les deux images mine et drapeau que je ne peux pas joindre sur le sujet): 

    import tkinter
    from tkinter import Tk, Button
    import random
    from PIL import Image, ImageTk
    
    screen = Tk()
    
    ROW = 10
    COLUMN = 10
    SIZE_CASE = 3
    BOMBES = 100
    n_bombe_color = ['blue', 'green', 'red', '#000080', '#660000', '#3399ff', 'black', 'grey']
    bomb_img = ImageTk.PhotoImage(Image.open('bomb.png').convert().resize((SIZE_CASE * 7, SIZE_CASE * 7)))
    flag_img = ImageTk.PhotoImage(Image.open('flag.png').resize((SIZE_CASE * 7, SIZE_CASE * 7)))
    
    class Bouton:
        def __init__(self, x, y):
            self.x = x // COLUMN
            self.y = y % COLUMN
            self.relief = tkinter.GROOVE
            #
            self.button = Button(screen, width=SIZE_CASE, height=SIZE_CASE // 2,
                                 command=lambda: self.utiliser() if not self.button['image'] else None,
                                 relief=self.relief)
            self.button.bind("<Button-3>", self.clic_droit)
            self.button.grid(row=self.x, column=self.y, sticky="NSEW", ipady=0, ipadx=0)
    
        def clic_droit(self, *args):
            if self.relief == self.button['relief'] and not self.button['state'] == 'disabled':
                if not self.button['image']:
                    self.button.config(image=flag_img)
                elif self.button['image'] == 'pyimage2':
                    self.button.config(image='')
            # print(self.button['image'])
    
        def utiliser(self):
            def verif_bombes():
                if not self in button_list:
                    return True
                else:
                    b = bombe_list
                    n = 0
                    if (self.x - 1, self.y - 1) in b:
                        n += 1
                    if (self.x - 1, self.y + 1) in b:
                        n += 1
                    if (self.x - 1, self.y) in b:
                        n += 1
                    if (self.x, self.y - 1) in b:
                        n += 1
                    if (self.x, self.y + 1) in b:
                        n += 1
                    if (self.x + 1, self.y - 1) in b:
                        n += 1
                    if (self.x + 1, self.y) in b:
                        n += 1
                    if (self.x + 1, self.y + 1) in b:
                        n += 1
                    return n
    
            # print(f"Emplacement x: {self.x}\nEmplacement y: {self.y}")
            n_bombe = verif_bombes()
            if n_bombe is True:
                for button in button_unsafe_list:
                    button.button.config(image=bomb_img, relief=tkinter.SUNKEN)
                for button in button_list:
                    button.button['state'] = 'disabled'
            else:
                del button_list[button_list.index(self)]
                self.button.config(text=str(n_bombe) if n_bombe > 0 else " ", font=("bold", 11),
                                   fg=n_bombe_color[n_bombe - 1], relief=tkinter.SUNKEN)
    
    
    # Génération des boutons
    button_list = []
    button_unsafe_list = []
    for i in range(0, ROW * COLUMN):
        button_list.append(Bouton(i, i))
    # Génération des bombes sur le terrain
    bombe_list = []
    for i in range(BOMBES):
        if button_list:
            random_i = random.randint(0, len(button_list) - 1)
            bombe_list.append((button_list[random_i].x, button_list[random_i].y))
            button_unsafe_list.append(button_list[random_i])
            del button_list[random_i]
        else:
            break
    
    print(bombe_list)
    screen.mainloop()
    



    -
    Edité par Damien_G 20 mai 2022 à 1:10:26

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 mai 2022 à 7:14:13

      Bonjour,

      C'est en effet à cause de la police, une solution que j'avais dénichée à l'époque :

      pixelVirtual = PhotoImage(width=1, height=1)
      button = Button(fr, text="Toto", borderwidth=1, width=20, height=20, image=pixelVirtual, bg=bgcolor, fg=fgcolor, font=("Arial",10), compound="c")



      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2022 à 12:15:37

        c'est que la dimension du bouton ne prend pas les mêmes unités selon qu'il y a du texte ou une image (cf la doc de height/width du bouton http://tkinter.fdex.eu/doc/bw.html ): pour le texte, c'est un nombre de ligne/lettre, pour une image, une dimension en pixel.
        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2022 à 14:08:35

          Merci pour vos conseils, je vous tiens au courant si j'ai d'autres problèmes

          EDIT: 

          Le problème persiste toujours

          Quand je passe d'une image à du texte, tous les boutons se redimensionne automatiquement

          Comment faire pour fixer la dimension d'un bouton, pour qu'elle ne bouge plus peu importe ce que l'on met à l'intérieur ??

          -
          Edité par Damien_G 20 mai 2022 à 17:34:16

          • Partager sur Facebook
          • Partager sur Twitter

          Tkinter problème redimensionnement des boutons

          × 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