• [^] # Avec deux listbox

    Posté par . En réponse au message Tkinter et scrollbar. Évalué à 1.

    Un autre code fait à l'arrache =D

    import tkinter as tk
    from tkinter import font as tk_font
    import json
    SCROLL_WIDTH = 18
    LISTBOX_HEIGHT = 12
    def players_load(path):
     with open(path) as f:
     return json.load(f)
    def player_select(list_box):
     i = list_box.curselection()
     if not i:
     return
     value = list_box.get(i)
     if players_selected[not list_box.id] == value:
     return
     players_selected[list_box.id] = value
     players_label.config(
     text=f'{players_selected[0]} - {players_selected[1]}'
     )
    players_selected = {0:'', 1:'',}
    players = dict(sorted(players_load('joueurs.json').items()))
    list_box_width = max(len(p) for p in players) + 2
    window = tk.Tk()
    font = tk_font.Font(family='mono', size=18)
    frame_box = tk.Frame(window, bg='#000')
    frame_box.grid()
    left_scroll = tk.Scrollbar(
     frame_box, orient=tk.VERTICAL, width=SCROLL_WIDTH,
    )
    left_scroll.grid(row=0, column=0, sticky=tk.NSEW,)
    left_list = tk.Listbox(
     frame_box,
     font=font,
     width=list_box_width,
     height=LISTBOX_HEIGHT,
     xscrollcommand=left_scroll.set,
     yscrollcommand=left_scroll.set,
    )
    left_list.grid(row=0, column=1, padx=(10, 5),)
    left_scroll.config(command=left_list.yview)
    left_list.id = 0 # C'est crade !
    right_scroll = tk.Scrollbar(
     frame_box, orient=tk.VERTICAL, width=SCROLL_WIDTH,
    )
    right_scroll.grid(row=0, column=3, sticky=tk.NSEW,)
    right_list = tk.Listbox(
     frame_box,
     font=font,
     width=list_box_width,
     height=LISTBOX_HEIGHT,
     xscrollcommand=right_scroll.set,
     yscrollcommand=right_scroll.set,
    )
    right_list.grid(row=0, column=2, padx=(5, 10),)
    right_scroll.config(command=right_list.yview)
    right_list.id = 1 # C'est crado !
    players_label = tk.Label(
     frame_box, height=3, font=font, bg='#000', fg='#fff',
    )
    players_label.grid(row=1, column=0, columnspan=4,)
    left_list.insert(0, *players)
    right_list.insert(0, *players)
    left_list.bind(
     '<<ListboxSelect>>', lambda e: player_select(left_list)
    )
    right_list.bind(
     '<<ListboxSelect>>', lambda e: player_select(right_list)
    )
    window.mainloop()

    Y a des trucs un peu moches, notamment d'insérer des attributs id aux listbox (permettant de savoir si la sélection courante n'est pas la même que celle de l'autre listbox), il serait préférable de créer une classe dérivée de Listbox et y intégrer un id via un attribut de classe.