Accueil > Forum > > > > Tkinter - ScrolledCanvas - Les objets dépassents du Canevas
Tkinter - ScrolledCanvas - Les objets dépassents du Canevas
vendredi 12 août 2011 à 16:24:27 |
Tkinter - ScrolledCanvas - Les objets dépassents du Canevas

Chris3392
|
Bonjour,
Je suis en train de coder une console qui surveille des abus d'utilisation d'armes sur des jeux en réseau (FPS). A cet effet j'ai codé un ScrolledCanvas qui doit accueillir plusieurs objets (contrôles d'utilisation abusive d'armes). Chacun de ces objets est un objet composite dont les éléments sont réunis par un Frame.
Le problème est que quand je fais un scroll, les objets composites dépassent du canevas (parfois en haut, parfois en bas)
Voici la partie du code qui pose problème :
Code Python :
##############################################################################
# Objets d'interface graphique spécifiques à la gestion des armes
class ScrolledCanvas(Frame):
def __init__(self, boss, width=100, height=100, bg=None, bd=2, scrollregion=(0, 0, 300, 300), relief=SUNKEN):
Frame.__init__(self, boss, bd=bd, relief =relief)
self.can = Canvas(self, width=width-20, height=height-20, bg=bg, scrollregion=scrollregion, bd=1)
self.can.grid(row=0, column=0)
scrolv = Scrollbar(self, orient=VERTICAL, command=self.can.yview, bd=1)
scrolh = Scrollbar(self, orient=HORIZONTAL, command=self.can.xview, bd=1)
self.can.configure (xscrollcommand=scrolh.set, yscrollcommand=scrolv.set)
scrolv.grid(row=0, column=1, sticky=NS)
scrolh.grid(row=1, column=0, sticky=EW)
class ControleArme(Frame):
"""Ligne de contrôle de limitation d'armes"""
def __init__(self, boss =None, objArme=None, strArme=None):
Frame.__init__(self, bd =2)
#Variables de l'objet
self.objArme = objArme
self.nomArme = strArme
self.intSeuil = int(self.objArme.Liste[strArme][0])
self.CtrleArme = Frame()
#Instanciation des objets du contrôle
self.lblClasse = Label(self.CtrleArme, text=self.objArme.Liste[strArme][1], width=7, anchor=W)
self.lblNature = Label(self.CtrleArme, text=self.objArme.Liste[strArme][2], width=7, anchor=W)
self.lblArme = Label(self.CtrleArme, text=strArme, width=20, anchor=W)
self.entSeuil = Entry(self.CtrleArme, width=4)
self.entSeuil.delete (0, END)
self.entSeuil.insert(END, self.objArme.Liste[strArme][0])
self.butAppliquer = Button(self.CtrleArme, text='Appliquer',command=self.ActualiserListeArmes)
#Mise en place des objets
self.lblClasse.pack(side=LEFT, anchor=N, padx=1, pady=1)
self.lblNature.pack(side=LEFT, anchor=N, padx=1, pady=1)
self.lblArme.pack(side=LEFT, anchor=N, padx=1, pady=1)
self.entSeuil.pack(side=LEFT, anchor=N, padx=1, pady=1)
self.butAppliquer.pack(side=LEFT, anchor=N, padx=1, pady=1)
def ActualiserListeArmes(self):
self.intSeuil = int(self.entSeuil.get())
self.objArme.ModifierSeuil(self, self.nomArme, self.intSeuil)
class ControlesArmes(Frame):
"""Bloc de contrôle des limitations d'armes"""
def __init__(self, boss=None, objArme=None, width=400, height=300):
Frame.__init__(self, bd =2, relief =SUNKEN)
#Reclassement du dictionnaire des armes par numéro d'ordre
intCompteur = 0
ListeArmes ={}
print('Tri de la liste des armes avant mise en place des controles')
for strArme in objArme.Liste.keys():
ListeArmes [objArme.Liste[strArme][3]] = (strArme, objArme.Liste[strArme][0], objArme.Liste[strArme][1], objArme.Liste[strArme][2])
intCompteur += 1
print (str(objArme.Liste[strArme][3]) + ':' + strArme + ':' + str(objArme.Liste[strArme][0]) + ':' + objArme.Liste[strArme][1] + ':' + objArme.Liste[strArme][2])
#Instanciation d'un bloc et d'un ascenseur en vue d'y stocker les objets de contrôle d'arme
ligne = 0
hauteur = 30
CadreLC = ScrolledCanvas(self, width=400, height=300, relief=SOLID, scrollregion=(0, 0, 400, (hauteur * intCompteur)))
CadreLC.pack(expand=NO, fill=BOTH, padx=6, pady=6)
#Instanciation des controles du bloc
Ctrle = {} #Reset du dictionnaire regroupant les définitions d'objet
self.CtrleCadre = {}
for intOrdre in ListeArmes.keys(): #Remplissage du dictionnaire avec les objets + instanciation de ces derniers
Ctrle [ListeArmes[intOrdre][0]] = ControleArme(CadreLC.can, objArme, ListeArmes[intOrdre][0])
self.CtrleCadre [ListeArmes[intOrdre][0]] = CadreLC.can.create_window(0, ligne, anchor=NW, window=Ctrle[ListeArmes[intOrdre][0]].CtrleArme)
ligne += hauteur
Cette section de code est appelée dans une fenêtre principale :
Code Python :
class Application(Frame):
"""Application principale"""
def __init__(self, boss =None):
Frame.__init__(self)
#Chargement des données de limitation d'armes
self.objArmes = ListeArmes(self)
self.ChargerArmes()
print('Verification du chargement des armes')
for strArme in self.objArmes.Liste.keys():
print(strArme + ',' + str(self.objArmes.Liste[strArme][0]) + ',' + self.objArmes.Liste[strArme][1] + ',' + self.objArmes.Liste[strArme][2])
#Initialisation de la fenêtre de l'application principale
self.master.title("""Limiteur d'armes - v 1.0""")
self.mBar = MenuBar(self)
self.mBar.grid(row=0, column=0, columnspan=2, sticky=W, padx=8, pady=8)
self.frmArmes = ControlesArmes(self, self.objArmes)
self.frmArmes.grid (row=1, column=0, sticky=W, padx=8, pady=8)
#self.frmJoueurs = ControlesJoueurs(self) #A coder
#self.frmJoueurs.grid (row=1, column=1, sticky=W) #A coder
self.st =ScrolledText(self, baseFont="System 8 normal", width =100, height =5)
self.st.grid(row=2, column=0, columnspan=2, sticky=W, padx =8, pady =8)
D'avance je remercie quiconque qui aurait une solution à cette question.
Chris
|
|
vendredi 12 août 2011 à 22:42:12 |
Re : Tkinter - ScrolledCanvas - Les objets dépassents du Canevas

Chris3392
|
Réponse acceptée !
J'ai finalement trouvé la réponse à mon problème (un peu par hasard!). Peut-être mon analyse est-elle inexacte, dans ce cas j'espère que les modérateurs voudront bien m'en excuser ; toutefois, si quelqu'un rencontre le même problème, voici ma compréhension de celui-ci :
En fait la frame qui regroupe les objets composites doit être un objet esclave du canvas. Il faut donc rajouter le mot boss lors de son instanciation. En outre, j'ai pu lire qu'il est déconseillé de mélanger des méthodes pack() et grid(), j'ai donc remplacé chaque méthode pack() par une méthode grid(). Avec ces deux opérations, celà fonctionne.
Voici par ailleurs la partie de code modifiée :
Code Python a écrit
class ControleArme(Frame):
"""Ligne de contrôle de limitation d'armes"""
def __init__(self, boss =None, objArme=None, strArme=None):
Frame.__init__(self, bd =2)
#Variables de l'objet
self.objArme = objArme
self.nomArme = strArme
self.intSeuil = int(self.objArme.Liste[strArme][0])
self.CtrleArme = Frame(boss)
#Instanciation des objets du contrôle
self.lblClasse = Label(self.CtrleArme, text=self.objArme.Liste[strArme][1], width=7, anchor=W)
self.lblNature = Label(self.CtrleArme, text=self.objArme.Liste[strArme][2], width=7, anchor=W)
self.lblArme = Label(self.CtrleArme, text=strArme, width=20, anchor=W)
self.entSeuil = Entry(self.CtrleArme, width=4)
self.entSeuil.delete (0, END)
self.entSeuil.insert(END, self.objArme.Liste[strArme][0])
self.butAppliquer = Button(self.CtrleArme, text='Appliquer',command=self.ActualiserListeArmes)
#Mise en place des objets
self.lblClasse.grid(row=0, column=0, padx=1, pady=1)
self.lblNature.grid(row=0, column=1, padx=1, pady=1)
self.lblArme.grid(row=0, column=2, padx=1, pady=1)
self.entSeuil.grid(row=0, column=3, padx=1, pady=1)
self.butAppliquer.grid(row=0, column=4, padx=1, pady=1)
def ActualiserListeArmes(self):
self.intSeuil = int(self.entSeuil.get())
self.objArme.ModifierSeuil(self, self.nomArme, self.intSeuil)
|
|
vendredi 7 octobre 2011 à 21:01:12 |
Re : Tkinter - ScrolledCanvas - Les objets dépassents du Canevas

fireman0865
|
salut,surveille bien tes premieres lignes de codes:scrolv.grid(row=0, column=1, sticky=NS)
scrolh.grid(row=1, column=0, sticky=EW)
|
|
Cette discussion est classée dans : liste, self, objets, strarme, objarme
Répondre à ce message
Sujets en rapport avec ce message
mise a jour d'une liste d'une listbox en wxpython [ par maissaab ]
bonjour, j'ai un gros problème qui peut être évident pour certain mais je suis débutante en wxpython en fait sur mon interface j'ai une list box qui i
aide pour Jeu puissance 4 [ par soso586 ]
bonjour, j'aimerai modifier ce code python pour que le jeu ne s'arrete pas lorsque le joueur à fait un alignement de 4 pions , mais 3 alignements.
aide avec mon script [ par s0ca ]
Bonjour tout le monde. Je vous explique ma situation: Dans le cadre d'un concours je doit faire un bot pour irc répondant au question du quizz a ma pl
Comment parcourir une liste pour tester des combinaisons [ par lifetor ]
Bonjour à tous, j'ai un petit problème,enfin que je n'arrive pas à résoudre. J'ai une liste [code=py]table = [[[0, 0, 0, 0], [4, 1, 4, 4], [1, 4, 4, 3
mise à jour des listes deroulantes pour poster un commentaire PHP [ par jeffreynaz ]
Bonjour Pour mon site je souhaite faire cela: un utilisateur choisi un article, choisi un commentaire déjà posté sur l'article, ensuite il rempli u
é et è convertir ! [ par gomofr ]
Bonjour, J'ai développé un toolkit pour un jeu en ligne appellé "grepolis" ! [^^!2] Voici mon problème, la liste de donné télécharger (donné d'allia
Validation d'un code baree [ par vianneyba ]
Boujour, j'utilise un programme a mon boulot fait par mes soins en python et avec une interface TKinter qui permet de lister une commande apres avoir
python:index des elements d'une liste [ par zarash ]
Bonjour, Lorsque j'execute ce code sous python [code=py]liste=[1,2,1,1,1,1,1,1] for e in liste: print(liste.index(e))[/code] comme resultat j'ai
toutes les lignes+colonnes d'un QTreeWidget [ par WieWeet ]
bonjour, mes recherches ( google et autres ) n'ayant rien donné, [code=py] import sys from PyQt4 import QtGui from PyQt4.QtGui import QTreeWidget clas
WXPython, probleme avec un notebook [ par faucheuse ]
Par défaut Probleme sizer dans un panel dans un notebook Bonjour à tous, J'ai créer un notebook dans lequel je met plusieurs panel ainsi que un ou pl
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|