Problème d'affichage d'items dans canvas

Résolu
pycarpe Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour, 

Je suis débutant sur python. 

J'ai un problème d'affichage d'items dans mon canvas. 

Dans l'image que j'ai attaché là, vous pouvez constater que entre la ligne 1999 et celle juste au-dessus il y a un problème...Cela passe de (X = 1245) à 1999. À noter que si je relance le programme sans rien changer le X peut changer de façon aléatoire sans savoir pourquoi. Bref en tout cas il y a un couak à partir d'un certain nombre de lignes affichées. À noter que sur une range de 1000 par exemple tout va bien. Mais à partir d'une certaine range le problème apparait.

Quelqu'un peut m'aider à comprendre svp? Merci.

from tkinter import *
from tkinter import ttk
import tkinter as tk

class Main_frame(Frame):
    
    # Init
    def __init__(self, fenetre_principale=None):

       
        tk.Frame.__init__(self, fenetre_principale)


      
        self.grid(sticky = "news")

        self.main_frame = tk.Frame(self, bg = "blue")
        self.main_frame.grid(sticky = "news")
       


        self.frame_canvas = tk.Frame(self.main_frame, bg = "yellow")
        self.frame_canvas.grid(row = 2, column = 0, pady = 5, sticky="nw")
        self.frame_canvas.grid_rowconfigure(0, weight=1)
        self.frame_canvas.grid_columnconfigure(0, weight=1)

        self.frame_canvas.grid_propagate(False)

        self.canvas = tk.Canvas(self.frame_canvas, bg  = "yellow")
        self.canvas.grid(row = 0, column = 0, sticky='news')

        self.vbar = tk.Scrollbar(self.frame_canvas, orient = "vertical", command = self.canvas.yview)
        self.vbar.grid(row = 0, column = 1, sticky = "ns")
        self.canvas.configure(yscrollcommand= self.vbar.set)
        self.frame_buttons = tk.Frame(self.canvas, bg = "grey")
        self.canvas.create_window((0, 0), window=self.frame_buttons, anchor="nw")



        self.ajout()




        
    def ajout(self):
        self.bu_aj = tk.Button(self.main_frame, text = "Ajout", command = self.update_).grid(row = 0, column= 0, pady = 5, sticky="nw")
    
    def update_(self):
        

        for k in range(2000):
            self.bu = tk.Button(self.frame_buttons, text = f"Test{k}")
            self.bu.grid(row = k, column= 0, sticky="news")
            self.frame_buttons.update_idletasks()

            first5columns_width = sum([self.bu.winfo_width() for j in range(0, 15)])
            first5rows_height = sum([self.bu.winfo_height() for i in range(0, 5)])
            self.frame_canvas.config(width=first5columns_width + self.vbar.winfo_width(),height=first5rows_height)
        
            self.canvas.config(scrollregion=self.canvas.bbox("all"))
        print("ok")

  
if __name__ == "__main__":
    root = tk.Tk()
    root.grid_rowconfigure(0, weight=1)
    root.columnconfigure(0, weight=1)
    root.title("Title")
    interface = Main_frame(fenetre_principale=root)
    interface.mainloop()
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

Il serait plus propre, en effet, que tu reçoives un message d'erreur t'informant que tu es trop gourmand.
Ceux qui t'offrent ce code n'ont sans doute pas testé toutes les situations possibles.

T'attends-tu réellement à pouvoir afficher autant de boutons que tu le souhaites?

0
pycarpe Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 

Hello,

Merci d'avoir répondu aussi vite déjà.

Ca veut dire quoi être gourmand?... La limite est fixé par quoi exactement? Je pensais que la limite était fixé par la config de mon pc seulement...

0
gromeleur
 

Salut, "gourmand" est plus dans l'occupation mémoire, d'ailleurs bug avec ttk sur mon système qui résume pourquoi y a une telle limitation de tcl/tk.

_____

# X Error of failed request:  BadAlloc (insufficient resources for operation)
  # Major opcode of failed request:  53 (X_CreatePixmap)
  # Serial number of failed request:  119
  # Current serial number in output stream:  127

_____                           .

Dans quel optique as-tu besoin de générer autant de boutons ?

Et si la justification de ce besoin était établi, il vaudrait mieux générer les bouton à la volée plutôt que d'en générer 2000 d'un coup.

                                   .

**HS**

Purée, mais remettez l'ancien système d'édition de ccm, je ne sais pas comment les membres peuvent supporter ce truc foutant du js dans un div au lieu de laisser un textarea qui bizarrement est destiné à ça...

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > gromeleur
 

Il existe un forum "bugs et suggestions CCM".

0
gromeleur > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Salut, yep je sais, mais à quoi bon ? Je ne suis qu'un visiteur, mon avis importe peu, ce nouveau système n'a l'air de gêner aucun membres, en effet ce n'est pas le lieu pour discuter de cela, désolé.

0
pycarpe Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   > gromeleur
 

Hello, je n'ai pas de but particulier, je cherche seulement à comprendre même si je pense qu'il peut y avoir une utilité à générer 2000 items suivant ce qu'on veut faire.

Les générer à la voler ne change rien j'ai déjà essayé avec une automatisation du click one by one avec pyautogui.

Bref en tout cas visiblement c'est assez limité je trouve. Merci en tout cas pour ta réponse. A+

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > pycarpe Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 

Tu utilises des logiciels qui te sont offerts gratuitement par des bénévoles.  SI tu trouves qu'ils sont limités, n'hésite pas à investir tes compétences pour améliorer ces logiciels.

0