2
votes

Ajout d'une insertion de requête de remplissage à Listbox

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)


2 commentaires

Ê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 utilisez pack .


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


3 Réponses :


3
votes

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()

 entrez la description de l'image ici


1 commentaires

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.



0
votes

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()


2 commentaires

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.



0
votes

voici une variante de la réponse très appréciée de Bryan Oakley.

  • il utilise des widgets ttk au lieu de widgets tk
  • la barre de défilement suit votre position dans la zone de liste lorsque vous faites défiler avec la souris
  • utilise oStyle.theme_use ("clam") car il peut paraître plus moderne ... cela peut être commenté

'

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()

' entrez la description de l'image ici


0 commentaires