2010-11-05 10 views
0

Je cherche des suggestions sur la façon dont on pourrait implémenter une barre d'outils qui permet d'éditer couper, copier, coller des commandes en utilisant le framework Tkinter. Je comprends comment construire une barre d'outils et lier les commandes de la barre d'outils, mais je ne sais pas comment les commandes liées au bouton de la barre d'outils sauront quel widget appliquer l'action Couper, Copier ou Coller car le widget avec l'activité d'édition perdra son focus. le bouton de la barre d'outils est cliqué. Ma première idée était de faire en sorte que chaque widget avec une activité d'édition potentielle définisse une variable globale lorsque le widget gagne en focus et que d'autres widgets (sans activité d'édition, boutons, curseurs, cases à cocher/radiobox, etc.) effacent cette variable globale. Mais cela semble compliqué à maintenir si je ne construis pas un framework de widgets qui hérite de ce comportement.Python/Tkinter: Construire une barre d'outils qui édite les commandes couper, copier, coller

Existe-t-il un moyen plus simple d'y parvenir ou suis-je sur la bonne voie?

Répondre

1

Vous pouvez indiquer aux boutons de la barre d'outils de ne pas effectuer le focus; C'est une option de configuration et aucune directive de l'interface utilisateur que j'ai jamais vu ont eu des boutons de barre d'outils avec focus. (Au lieu de cela, la fonctionnalité est toujours disponible via un autre mécanisme pouvant être activé au clavier, par exemple, une combinaison de touches de raccourci.)

+0

Donal: Merci. Pour le bénéfice des autres lecteurs: Utilisez widget.config (takefocus = False) pour empêcher un widget de barre d'outils de gagner en focus. Pour déterminer le widget qui a actuellement le focus (à partir de la fenêtre active), utilisez window.focus_get() où window est une variable contenant une référence à votre fenêtre racine Tk() ou à la fenêtre Toplevel actuellement active. – Malcolm

2

Vous n'avez pas à gérer une grande structure, vous pouvez créer une liaison unique sur le widget racine pour <FocusIn> et mettre toute la logique dans cette liaison. Ou, utilisez focus_class et liez à la classe all.

La liaison à la racine affectera uniquement les enfants de la racine, la liaison à all affectera tous les widgets dans l'application entière. Cela importe seulement si vous avez plus d'un widget toplevel.

+0

Merci. Cela ressemble à une fonctionnalité très puissante. Est-ce que le concept de classe est codé en dur au type de widget (Entrée, Texte, Bouton, etc.) ou est-ce que je peux créer plusieurs classes nommées basées sur le même widget? – Malcolm

+2

@Malcom: c'est l'un des secrets les mieux gardés de tk. Le concept est appelé "bind tags". Regardez ça sur google. L'idée de base est, les liaisons sont en fait sur les étiquettes, pas sur les widgets. C'est juste que les widgets par défaut ont une étiquette du même nom que le widget, plus un avec le même nom que la classe de widget, la fenêtre de niveau supérieur, et "tout". Vous pouvez ajouter tous les autres tags que vous voulez, réorganiser les tags qui s'y trouvent, ou les supprimer entièrement –

+1

Vous me faites des illusions! Obtenir ma tête autour des étiquettes de liaison devrait détruire ma productivité pour les prochaines heures. Combien de secrets de Tkinter caches-tu de plus parmi nous? :) – Malcolm