web-dev-qa-db-fra.com

Gtk.SelectionMode.MULTIPLE permet la sélection d'une seule ligne dans Gtk.TreeView

Je développe une application utilisant Quickly. J'ai un Gtk.TreeView avec un Gtk.ListStore comme modèle. Le mode de sélection de Gtk.SelectionMode est défini sur Gtk.SelectionMode.MULTIPLE.

Le problème est que le Gtk.SelectionMode ne se comporte pas comme il se doit:

  • Une seule ligne peut être sélectionnée à la fois.
  • Impossible de sélectionner plusieurs lignes à l'aide de la touche Ctrl ou Maj.
  • Une fois qu'une ligne est sélectionnée, elle ne peut pas être désélectionnée à l'aide de la touche Ctrl.
  • Rien ne se passe lorsque j'appuie sur les touches fléchées.

Le problème peut être facilement reproduit en créant une nouvelle application Ubuntu à l'aide de Quickly (ou vous pouvez télécharger une application de test ci-dessous).

$ quickly create ubuntu-application test
$ cd test
$ quickly design

Créez un TreeView avec un ListStore comme modèle. Réglez le mode de GtkTreeSelection sur "Multiple". Ajoutez des colonnes et des valeurs au ListStore. Ajoutez des TreeViewColumns avec CellRendererTexts à l'arborescence.

$ quickly run -v

Notez que vous ne pouvez pas sélectionner plusieurs lignes.

J'ai déjà essayé certaines choses, mais je n'ai rien changé:

  • Réglage du mode de sélection dans le code.

    self.ui.selection.set_mode(Gtk.SelectionMode.MULTIPLE)

    ou

    self.ui.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)

  • Déplacement de GtkTreeSelection <child> Sous GtkTreeViewColumn <child> Dans le fichier d'interface utilisateur.

  • Suppression de GtkTreeSelection du fichier UI et définition de la sélection avec

    self.ui.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)

Suis-je en train d'oublier quelque chose d'évident? Ou cela pourrait-il être un bug?

Sur une note latérale, si vous définissez la sélection sur 'Single', il n'est également pas possible de désélectionner la ligne.

MODIFIER

Si vous souhaitez m'aider, vous pouvez télécharger une application de test ici au lieu de créer un nouveau projet avec Quickly par vous-même. Veuillez noter que vous avez besoin de l'exécuter rapidement.

$ cd test
$ quickly run

J'ai implémenté des rappels à des fins de test dans test/test/TestWindow.py. Vous pouvez trouver la définition de l'interface utilisateur dans test/data/ui/TestWindow.ui.

1
tectux

J'ai trouvé la solution à mon propre problème.

La propriété 'can-focus' de Gtk.TreeView est définie par défaut sur False. La définition de True corrige le comportement de sélection étrange, ainsi que d'autres comportements étranges qui peuvent se produire, comme ne pas pouvoir redimensionner une colonne alors que sa propriété 'resizable' Est définie sur True.

0
tectux

Je ne peux pas donner une réponse complète, mais je voulais la partager. Si vous posez une question de programmation, incluez toujours un exemple de travail minimal afin que les autres puissent rapidement (ha, jeu de mots voulu) s'exécuter et tester dans votre code. Je vais devoir installer Quickly, créer un projet Quickly et changer le code juste pour voir de quoi parle votre question et essayer de la corriger, ce que je ne ferai pas.

Cela étant dit, voici un exemple de travail minimal qui se comporte correctement, donc je suppose que Quickly fait quelque part de la magie quelque part qui remplace ce comportement.

from gi.repository import Gtk

class TestWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.resize(400, 400)
        self.connect("delete-event", Gtk.main_quit)

        ls = Gtk.ListStore(str)
        ls.append(["Testrow 1"])
        ls.append(["Testrow 2"])
        ls.append(["Testrow 3"])
        tv = Gtk.TreeView(ls)
        tr = Gtk.CellRendererText()
        col = Gtk.TreeViewColumn("Testcolumn", tr, text=0)
        tv.append_column(col)
        sel = tv.get_selection()
        sel.set_mode(Gtk.SelectionMode.MULTIPLE)

        self.add(tv)
        self.show_all()

if __== "__main__":
    app = TestWindow()
    Gtk.main()

Notez que vous utilisez un mode de sélection d'arbre incorrect dans votre question, le bon est Gtk.SelectionMode.MULTIPLE.

2
Timo