IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

canvas.create_window déborde sur les ascenseurs [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 16
    Points : 15
    Points
    15
    Par défaut canvas.create_window déborde sur les ascenseurs
    Bonjour à tous,

    Voici un code avec des formes créées avec create_rectangle, create_text et un frame rouge créé avec create_window.
    Pourquoi le frame déborde sur les ascenseurs quand je réduit la fenêtre alors que les formes rectangles et le text disparaissent convenablement au bord des ascenseurs?

    Je ne trouve rien sur les forums qui semblent discuter de ce pb.
    Dans l'attente de vous lire.
    Passy261

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    import tkinter as tk
    from tkinter import *
    import random 
     
    #######################################################################################################
     
    class Appli(tk.Canvas):     # FENETRE PRINCIPALE
     
       def __init__(self,root):
          tk.Canvas.__init__(self,root)
     
          self.config(background="bisque") 
          self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.xview) 
          self.ysb = tk.Scrollbar(self, orient="vertical", command=self.yview) 
          self.config(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set) 
          self.config(scrollregion=(0,0,2000,2000)) 
     
          self.xsb.grid(row=1, column=0, sticky="ew") 
          self.ysb.grid(row=0, column=1, sticky="ns") 
          self.grid(row=0, column=0, sticky="nsew") 
          self.grid_rowconfigure(0, weight=1) 
          self.grid_columnconfigure(0, weight=1)
          for n in range(50): 
             x0 = random.randint(0, 900) 
             y0 = random.randint(50, 900) 
             x1 = x0 + random.randint(50, 100) 
             y1 = y0 + random.randint(50,100) 
             color = ("red", "orange", "yellow", "green", "blue")[random.randint(0,4)] 
             self.create_rectangle(x0,y0,x1,y1, outline="black", fill=color) 
          self.create_text(50,10, anchor="nw", 
               text="Click and drag to move the canvas")
     
          self.fr=Frame(self,width=270,height=300,bg="red")#pour obtenir toutes les données nécessaires
     
          self.create_window(30,50,anchor='nw',window=self.fr)#pour obtenir toutes les données nécessaires
     
     
         # This is what enables scrolling with the mouse: 
          self.bind("<ButtonPress-1>", self.scroll_start) 
          self.bind("<B1-Motion>", self.scroll_move) 
     
       def scroll_start(self, event): 
          self.scan_mark(event.x, event.y) 
     
       def scroll_move(self, event): 
          self.scan_dragto(event.x, event.y, gain=1) 
     
    ############# LANCEMENT PROGRAMME ##################
    root = Tk()
    root.title('tournoi')
    root.state('zoomed')
    Appli(root).pack(fill="both", expand=True)
    root.mainloop()  
     
    ############# FIN ##################

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Pour que ta Frame soit sous les scrollBars il faudrait que ce soit un objet dessiné dans le Canvas.
    Ce qui n'est pas le cas, c'est un widget indépendant du Canvas, peut importe que que tu le crées dans cette classe.

    Je suppose que tu dois "packer" cette Frame dans ta fenêtre principale dessus ou dessous ton canvas.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci pour la réponse.
    Si je mixe les lignes 33 et 35 en 1 seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.create_window(30,50,anchor='nw',window=Frame(width=270,height=300,bg="red"))
    cela ne change rien.

    Je ne vois pas comment déclarer ma frame pour que cela marche.
    Que veut dire "packer"?

    Merci pour vos participations.
    Passy261

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Quand vous utilisez "pack" et "grid", vous avez un "master", en général, un widget de type Frame qui définira le rectangle où seront placés (sans se chevaucher) les différents widgets.

    Puis vous avez une autre dimension qui s'appelle "z-order". Intuitivement, c'est quelque chose que vous visualisez bien avec les rectangles colorés que vous avez créés dans le Canvas: certains en chevauchent d'autres. Et l'information "est au dessus de" sera, par défaut, l'ordre de création des rectangles... et des widgets.

    Et dans votre code vous avez 2 soucis.
    Le premier est qu'au lieu de créer une Frame et d'y placer Canvas et Scrollbar, vos Scrollbar ont pour "master" le Canvas. Quand vous les placez via "grid", çà bouffe une partie normalement gérée par le Canvas pour y placer ses items... Et le second: la Frame "rouge" est créé en dernier, elle pourra aller "au dessus" des Scrollbars.

    Ajoutez les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          self.xsb.lift()
          self.ysb.lift()
    après le .create_window de la Frame "rouge" est le plus simple pour voir l'effet z-order.
    Ceci dit, créer une Frame pour y placer Canvas et Scrollbar sera un peu plus compliqué mais bien plus pérenne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci pour votre aide.
    J'ai donc maintenant une fenetre "root" qui contient un frame, qui contient lui-même un canvas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    import tkinter as tk
    from tkinter import *
    import random 
     
    #######################################################################################################
     
    class Appli(tk.Frame):     # FENETRE PRINCIPALE
     
       def __init__(self,root):
          tk.Frame.__init__(self,root)
     
          self.can=tk.Canvas(self,width=400,height=400,bg="bisque")
          self.can.grid(row=0, column=0, sticky="nsew")
     
          self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.can.xview) 
          self.ysb = tk.Scrollbar(self, orient="vertical", command=self.can.yview) 
          self.can.config(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set) 
          self.can.config(scrollregion=(0,0,2000,2000)) 
     
          self.xsb.grid(row=1, column=0, sticky="ew") 
          self.ysb.grid(row=0, column=1, sticky="ns") 
     
          self.grid_rowconfigure(0, weight=1) 
          self.grid_columnconfigure(0, weight=1)
          for n in range(50): 
             x0 = random.randint(0, 900) 
             y0 = random.randint(50, 900) 
             x1 = x0 + random.randint(50, 100) 
             y1 = y0 + random.randint(50,100) 
             color = ("red", "orange", "yellow", "green", "blue")[random.randint(0,4)] 
             self.can.create_rectangle(x0,y0,x1,y1, outline="black", fill=color) 
          self.can.create_text(50,10, anchor="nw", 
               text="Click and drag to move the canvas")
     
          self.fr=Frame(self.can,width=270,height=300,bg="red")#pour obtenir toutes les données nécessaires
     
          self.can.create_window(30,50,anchor='nw',window=self.fr)#pour obtenir toutes les données nécessaires
          self.can.create_text(500,500, anchor="nw", 
               text="texte 2")
     
         # This is what enables scrolling with the mouse: 
          self.bind("<ButtonPress-1>", self.scroll_start) 
          self.bind("<B1-Motion>", self.scroll_move) 
     
       def scroll_start(self, event): 
          self.scan_mark(event.x, event.y) 
     
       def scroll_move(self, event): 
          self.scan_dragto(event.x, event.y, gain=1) 
     
    ############# LANCEMENT PROGRAMME ##################
    root = Tk()
    root.title('tournoi')
    root.state('zoomed')
    Appli(root).pack(fill="both", expand=True)
    root.mainloop()  
     
    ############# FIN ##################
    Maintenant, cela fonctionne, mais est-ce ma structure est OK?
    Les lignes 35 et 37 sont-elles convenables pour gérer les parents?

    Merci pour votre aide;
    Passy261

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Passy261 Voir le message
    Maintenant, cela fonctionne, mais est-ce ma structure est OK?
    Les lignes 35 et 37 sont-elles convenables pour gérer les parents?
    Moi çà me va

    Si vous faites un peu bouger votre Canvas, en regardant ce qu'il se passe sur les "bords" vous devriez voir les rectangles coupés un peu avant le bord (du Canvas) alors que la Frame (gérée par .create_window) est coupée sur le bord.
    Pour çà, il n'y a rien à faire: c'est un "défaut" documenté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos réponses.
    Je coche "résolu"
    Amicalement
    Passy261

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo