4 votes

Python Tkinter : Ajouter des widgets aux dialogues de fichiers

J'utilise Tkinter avec Python 2.6 y 2.7 pour la programmation d'interfaces utilisateur graphiques.

Ces interfaces utilisateur contiennent des boîtes de dialogue permettant d'ouvrir des fichiers et de sauvegarder des données à partir de l'interface utilisateur. tkFileDialog module. J'aimerais adapter les boîtes de dialogue et ajouter d'autres widgets de saisie, par exemple pour permettre à l'utilisateur de laisser des commentaires.

Existe-t-il un moyen de le faire ?

Il semble que les dialogues de fichiers soient directement issus du système d'exploitation. Dans Tkinter elles sont dérivées de la classe Dialog dans le fichier tkCommonDialog et appeler le module tk.call("tk_getSaveFile") d'un widget de cadre (dans ce cas, pour sauvegarder les données).

Je n'ai pas pu trouver où cette méthode est définie.

4voto

Anton Kovalenko Points 12838

call est définie dans _tkinter.c mais il n'y a rien d'intéressant pour votre tâche particulière. Il appelle simplement une commande Tcl, et la commande tk_getSaveFile fait tout le travail.

Et oui, quand il y a est un dialogue de fichier natif sur le système d'exploitation, tk_getSaveFile les utilise (par exemple GetSaveFileName est utilisé sous Windows). Il pourrait être possible d'y ajouter des widgets, mais pas sans altérer les sources C de Tk. Si vous êtes sûr que votre utilise des boîtes de dialogue Tk non natives, vous pouvez ajouter quelque chose à sa hiérarchie de widgets en piratant ::tk::dialog::file:: de la procédure Tk (voir library/tkfbox.tcl ).

Je préfère prendre un implémentation alternative de tk_getSaveFile écrit en Tcl/Tk pur et n'utilisant jamais le système d'exploitation. De cette façon, nous pouvons être sûrs que sa disposition est la même pour tous les systèmes d'exploitation, et qu'elle ne changera pas soudainement avec une nouvelle version de Tk. Il est encore loin d'être trivial de fournir une API pratique pour python autour de lui, mais au moins, c'est possible.

1voto

Michael Westwort Points 156

J'ai dû me débarrasser des déclarations canvasx/y. Cette ligne se lit maintenant simplement set item [$data(canvas) find closest $x $y] qui fonctionne bien. $data(canvas) canvasx $x pour ses propres travaux bien mais pas en relation avec find closest ni si elle est écrite en deux lignes.

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