2016-11-09 1 views
2

J'utilise des étiquettes pour afficher des données. Cependant, j'ai tellement d'étiquettes placées l'une en dessous de l'autre que je ne peux pas les mettre toutes dans la même fenêtre. Je souhaite utiliser une barre de défilement pour faire défiler les étiquettes. Cependant, comme je l'ai lu, ce n'est pas si simple. Si je comprends bien, mon meilleur pari est d'utiliser un cadre pour rassembler toutes mes étiquettes, puis insérer le cadre dans une toile, qui peut ensuite être utilisé en parallèle avec la barre de défilement, même si j'ai du mal à le faire. La fonction que j'utilise pour créer mes étiquettes estComment utiliser place dans un cadre incorporé dans une toile?

def Tab(root, y): 
    #Print the team 
    playerTeam = Label(root, bg = "white", text = "Hello") 
    playerTeam.config(height = 1, width = 13) 
    playerTeam.place(x=20,y=y) 

J'ai essayé d'ajouter le code suivant en même temps que ma fonction

def onFrameConfigure(canvas): 
    '''Reset the scroll region to encompass the inner frame''' 
    canvas.configure(scrollregion=canvas.bbox("all")) 

root = tk.Tk() 
root.geometry("400x400") 
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") 
frame = tk.Frame(canvas, background="#ffffff") 
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview) 
canvas.configure(yscrollcommand=vsb.set) 

vsb.pack(side="right", fill="y") 
canvas.pack(side="left", fill="both", expand=True) 
canvas.create_window((4,4), window=frame, anchor="nw") 

frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas)) 

Tab(frame, 20) 

Lorsque couru, une fenêtre vide est produit. Cependant, lorsque .grid est utilisé à la place de .place, Tab() fonctionne correctement et l'étiquette est affichée sur la fenêtre. Bien que, lorsque j'appelle Tab() plusieurs fois, les étiquettes quittent la fenêtre et la possibilité de défiler vers le bas n'est pas disponible.

Comment faire pour que la fonction .place fonctionne correctement. Et deuxièmement comment puis-je faire fonctionner la barre de défilement correctement. Merci

Répondre

0

Le problème est que place ne fonctionne pas comme les autres gestionnaires de géométrie - il ne changera pas la taille de son parent. Ainsi, même si vous placez une grande étiquette (ish) dans le cadre, le cadre conserve sa taille par défaut d'un pixel de large et d'un pixel de hauteur. C'est là, vous ne pouvez pas le voir.

Vous pouvez vérifier cela en donnant le cadre d'une largeur explicite et la hauteur (et en ajoutant une couleur distinctive permet de visualiser, aussi):

frame.configure(width=100, height=100, background="bisque") 

De l'official documentation for place:

Contrairement à beaucoup d'autres gestionnaires de géométrie (tels que l'emballeur) le placeur ne fait aucune tentative de manipuler la géométrie des fenêtres maître ou les parents des fenêtres esclaves (c'est à dire qu'il ne fixe pas leurs tailles demandées ). Pour contrôler les tailles de ces fenêtres, faites-les des fenêtres comme des cadres et des toiles qui offrent des options de configuration à cet effet.

Je vous encourage fortement à ne pas utilisation place. Les gestionnaires de géométrie pack et grid de Tkinter sont exceptionnellement doués pour la mise en page de widgets. Si vous utilisez place, vous devez faire beaucoup de calculs vous-même, et le résultat ne sera probablement pas redimensionné correctement ou résister à des changements de résolution ou de taille de police sans beaucoup de travail.

+0

Merci Bryan, mais je ne peux vraiment pas voir les gestionnaires de géométrie de la grille et de l'emballage qui fonctionnent bien avec ma conception de l'interface. Mais en plus, pourquoi la barre de défilement ne fonctionnera pas dans l'exemple que j'ai donné? –

+0

Les barres de défilement ne fonctionnent pas car 'scrollregion' n'est pas défini, car le cadre est petit. Définissez 'scrollregion' sur une valeur plus grande que le canevas et les barres de défilement fonctionneront. Je serais prêt à parier qu'il n'y a presque pas de design d'interface que vous pouvez trouver qui ne puisse fonctionner avec 'pack' ou' grid', sauf pour un design qui demande à l'utilisateur de pouvoir interactivement déplacer des widgets. –

+0

Ok merci. Je serais en mesure d'utiliser les méthodes pack/grille, mais pour le moment j'ai eu du mal à obtenir les étiquettes où je les veux sans que les étiquettes soient trop rapprochées. –