3 votes

Id caché sur tkInter Listbox

Je me demande s'il est possible de stocker un identifiant caché avec chaque entrée d'une boîte de liste. La raison en est que j'ai une table qui contient un identifiant unique provenant d'une base de données (non visible par l'utilisateur mais utilisé pour identifier de manière unique chaque enregistrement). Je mets en cache la table en mémoire et j'utilise un dictionnaire dont la clé est l'identifiant.

J'aimerais créer une boîte de liste qui me permette de sélectionner l'un des enregistrements - le texte affiché ne serait pas l'identifiant unique mais un champ descriptif (tel que 'Nom') qui est probablement unique mais qui n'est pas appliqué et sur lequel il n'y a pas d'index. Donc, par exemple, si j'ai :

Id  Name
--  ----
 2  Rod
 5  Jane
15  Freddy

Puis en sélectionnant Jane je pourrais d'une manière ou d'une autre accéder facilement à l'identifiant. 5

Mon problème est que je ne trouve pas le moyen d'associer l'identifiant unique ( 5 ) avec la sélection ( Jane ) afin que je puisse facilement identifier l'enregistrement mis en cache. Je sais que je peux utiliser des variables de contrôle, mais cela me donne simplement une liste de toutes les chaînes de caractères de la liste, ce qui n'est pas ce que je veux. De plus, l'index (par exemple lors de l'insertion) ne semble pas être fiable à cette fin.

Le seul moyen que j'ai trouvé pour y parvenir est d'avoir un autre dictionnaire faisant correspondre le nom à l'identifiant. Pour un certain nombre de raisons, cette solution n'est pas optimale.

Est-ce que je rate quelque chose ici ? Existe-t-il un moyen plus simple de procéder ?

4voto

Martijn Pieters Points 271458

Conservez vos identifiants dans une liste, puis utilisez la fonction .curselection() pour les faire correspondre aux identifiants de ligne, tant que l'ordre reste le même.

Dans votre exemple, Jane est le deuxième choix dans votre liste, donc si vous sélectionnez .curselection() renvoie à 1 . Si vous avez un rowids dans le même ordre, rowids[1] sera 5 :

>>> rowids = [2, 5, 15]
>>> rowids[listbox.curselection()]
5

Un peu plus efficace que la mise en correspondance des noms avec les rangées d'un dictionnaire.

1voto

Bryan Oakley Points 63365

Si vous utilisez le ttk.Treeview au lieu d'une boîte de liste, vous pouvez stocker l'identifiant dans une colonne invisible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X