J'ai lu un certain nombre de threads et d'autres ressources pour essayer de trouver la bonne façon de gérer cela, mais je n'ai rien trouvé qui fonctionne avec mon application. Voici ce que j'essaie d'accomplir.
Lorsqu'une requête est terminée et que l'insertion des données dans une Listbox est terminée, je n'arrive pas à la faire délimiter l'insertion de données d'un espace de 1 caractère.
J'utilise pack () et j'ai lu le manuel de tkinter pour cela et j'ai essayé chaque exemple disponible avec d'autres trouvés sur différents threads ici.
Le widget:
output = tkinter.Listbox(window_2, height = 20, font='Times 10', width=42, bd=1, bg = '#FFD599', fg = '#9A0615', selectmode=SINGLE) output.pack() output.place(x=210, y=195)
3 Réponses :
Les options padx / pady
et ipadx / ipady
de
pack
n'affectent pas les données qui se trouvent dans la zone de liste. La listbox elle-même n'a pas d'options pour ajouter une marge interne.
Pour obtenir une marge à l'intérieur de la listbox, ce que je fais normalement est de lui donner un zéro borderwidth
et highlightthickness
, puis placez-le dans un cadre avec la même couleur d'arrière-plan et laissez le cadre être la bordure. Vous pouvez ensuite ajouter le remplissage de votre choix entre la bordure et la zone de liste.
Ceci est également pratique car vous pouvez mettre une barre de défilement à l'intérieur du cadre, lui donnant l'impression qu'elle se trouve à l'intérieur de la listbox sans être réellement à l'intérieur de la listbox.
Exemple: p >
import tkinter as tk root = tk.Tk() root.configure(background="gray") listbox_border = tk.Frame(root, bd=1, relief="sunken", background="white") listbox_border.pack(padx=10, pady=10, fill=None, expand=False) listbox = tk.Listbox(listbox_border, width=20, height=10, borderwidth=0, highlightthickness=0, background=listbox_border.cget("background"), ) vsb = tk.Scrollbar(listbox_border, orient="vertical", command=listbox.yview) listbox.configure(yscrollcommand=vsb) vsb.pack(side="right", fill="y") listbox.pack(padx=10, pady=10, fill="both", expand=True) for i in range(100): listbox.insert("end", "Item #{}".format(i)) root.mainloop()
Merci Bryan J'apprécie l'exemple. Je l'ai regardé et exécuté et il fonctionne bien tel quel, mais lorsque je l'implémente dans mon code, il n'affichera pas le widget pour une raison quelconque. J'ai utilisé votre exemple exactement, en modifiant root en window_2 pour mon besoin mais il ne s'affichera pas du tout. Il n'y a pas d'erreur lors de l'exécution du code mais il ne s'affichera pas.
Tout d'abord, pour formater les caractères dans une listbox tkinter, vous devez utiliser une police fixe et une fonction python .format ....;
Vous pouvez donc faire quelque chose comme ça
Appuyez sur Charger pour charger données dans la zone de liste et faites attention à ce code de ligne
s = '{0:> 8} {1: 5}'. format (i [0], i [1])
self.list.insert (tk.END, s)
import tkinter as tk RS = (('Apple',10), ('Banana',20), ('Peack',8), ('Lemon',6),) class App(tk.Frame): def __init__(self,): super().__init__() self.master.title("Hello World") self.init_ui() def init_ui(self): self.pack(fill=tk.BOTH, expand=1,) f = tk.Frame() sb = tk.Scrollbar(f,orient=tk.VERTICAL) self.list = tk.Listbox(f, relief=tk.GROOVE, selectmode=tk.BROWSE, exportselection=0, background = 'white', font='TkFixedFont', yscrollcommand=sb.set,) sb.config(command=self.list.yview) self.list.pack(side=tk.LEFT,fill=tk.BOTH, expand =1) sb.pack(fill=tk.Y, expand=1) w = tk.Frame() tk.Button(w, text="Load", command=self.on_callback).pack() tk.Button(w, text="Close", command=self.on_close).pack() f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0) w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0) def on_callback(self,): for i in RS: s = '{0:>8}{1:5}'.format(i[0],i[1]) self.list.insert(tk.END, s) def on_close(self): self.master.destroy() if __name__ == '__main__': app = App() app.mainloop()
ok donc j'ai essayé cela mais cela ne fonctionne pas comme il se doit et je suis sûr que c'est mon erreur lors de la mise en œuvre des lignes nécessaires. pour la recette, dans les résultats:
s = '{0:> 2} {1: 5}'. format (recette, recette)
output.insert (END , s)
Cela insérera les données de la requête mais les insérera deux fois sur la même ligne. J'ai joué avec la ligne pour voir si je pouvais empêcher cela mais sans succès. s = '{0:> 2} {1: 5}'. format (recette, recette)
est clairement la ligne impérative pour que cela fonctionne, mais étant raisonnablement nouveau pour python et tkinter, je ne suis pas clair sur ce qu'il effectue afin de modifier mon code pour qu'il fonctionne correctement avec cela.
voici une variante de la réponse très appréciée de Bryan Oakley.
'
import tkinter as tk from tkinter import ttk try: # allows the text to be more crisp on a high dpi display from ctypes import windll windll.shcore.SetProcessDpiAwareness(1) except: pass root = tk.Tk() oStyle = ttk.Style() oStyle.theme_use("clam") oStyle.configure('LB.TFrame', bd=1, relief="sunken", background="white") listbox_border = ttk.Frame(root, style='LB.TFrame') listbox_border.pack(padx=4, pady=4, fill=None, expand=False) vsb = ttk.Scrollbar(listbox_border) vsb.pack(side="right", fill="y") listbox = tk.Listbox(listbox_border, width=20, height=10, borderwidth=0, highlightthickness=0, selectmode=tk.SINGLE, activestyle=tk.NONE) listbox.pack(padx=6, pady=6, fill="y", expand=True) listbox.config(yscrollcommand=vsb.set) vsb.config(command=listbox.yview) for i in range(100): listbox.insert("end", "Item #{}".format(i)) root.mainloop()
Êtes-vous en train de poser des questions sur le remplissage à l'intérieur de la lisbox ou à l'extérieur de la listbox? Veuillez fournir un exemple reproductible minimal .
padx
devrait fonctionner correctement en dehors de la liste lorsque vous utilisezpack
.le remplissage se trouve à l'intérieur de la Listbox, lorsque les données interrogées sont insérées dans la Listbox, elles se trouvent directement contre la bordure et j'essaie de délimiter les données insérées d'un espace de caractère. Quand j'utilise padx et pady. instructions = tkinter.Text (window_2, font = ('Times 10'), height = 21, width = 42, bd = 1, bg = '# FFD599', fg = '# 9A0615', padx = 5, pady = 5 ) Cela fonctionne dans le widget Texte mais pas dans Listbox