Créer une application graphique avec Tkinter de Python

J'ai décidé de créer une application graphique avec Python, et l'utilisation de Tkinter a été rapide, c'est donc un mémorandum pour la prochaine utilisation.

Modèle

import Tkinter as Tk

class Application(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack()

root = Tk.Tk()
app = Application(master=root)
app.mainloop()

Divers widgets seront joints ici.

Widget[^1]

Nom rôle
Button bouton
Canvas Coller et dessiner des images
Checkbutton Bouton de vérification
Entry Zone de texte sur une ligne. Plusieurs lignes sont du texte
Frame Un cadre qui rassemble d'autres widgets
Label étiquette. Les images peuvent également être affichées
Listbox zone de liste
Menu Créer une barre de menus
Message Étiquette multiligne
OptionMenu boîte combo
Radiobutton Boutons radio
Scale glissière
Scrollbar barre de défilement
Text Zone de texte multiligne
Toplevel Pour créer des fenêtres pop-up, etc.

[^ 1]: tous ne sont pas couverts

Placement des widgets

Utilisez l'une des méthodes pack, place et grid pour placer le widget. pack organise les widgets dans une colonne ou une ligne. place spécifie l'emplacement de chaque widget et le place. grid organise les widgets sur des coordonnées 2D (cela ressemble à du papier quadrillé Excel). Après cela, nous utilisons essentiellement la grille.

    def __init__(self, master=None):
        #réduction
        self.create_widgets()

    def create_widgets(self):
        self.label = Tk.Label(self, text=u'Fichier d'entrée')
        self.entry = Tk.Entry(self)
        self.button = Tk.Button(self, text=u'ouvert')
        self.check = Tk.Checkbutton(self, text=u'Extension limitée à txt')
        self.text = Tk.Text(self)

        self.label.grid(column=0, row=0)
        self.entry.grid(column=1, row=0)
        self.button.grid(column=2, row=0)
        self.check.grid(column=0, row=1)
        self.text.grid(column=0, columnspan=3, row=2)

Prise en charge de l'ajustement du placement et de l'expansion / contraction

Tout d'abord, définissez développer, remplir et ancrer pour rendre le cadre parent compatible avec l'expansion et la contraction. La position de Tk.XX qui apparaît avec l'ancre et le collant décrit plus loin peut être spécifiée par nord, sud, est et ouest (NSEW).

    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
        self.create_widgets()

Ensuite, lors de l'organisation de chaque widget avec une grille, spécifiez où et comment développer et contracter avec sticky. Une autre chose importante est que lorsque vous placez un widget avec une grille, vous devez spécifier quelle ligne / colonne se développe et se contracte à quel rapport avec la configuration de la colonne et la configuration de la ligne. Par défaut, le paramètre de poids est 0 (ne s'étire pas), il vous suffit donc de définir le poids de la ligne / colonne que vous souhaitez étirer sur 1. Dans l'exemple ci-dessous, seule la deuxième ligne avec Texte correspond à l'expansion et à la contraction de la première colonne avec Entrée, qui est censée contenir le nom de fichier sélectionné.

        self.label.grid(column=0, row=0, sticky=Tk.W)
        self.entry.grid(column=1, row=0, sticky=Tk.EW)
        self.button.grid(column=2, row=0, sticky=Tk.E)
        self.check.grid(column=0, columnspan=2, row=1, sticky=Tk.W)
        self.text.grid(column=0, columnspan=3, row=2, sticky=Tk.NSEW)

        self.columnconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)

Obtenez le contenu de l'entrée et l'état de vérification du bouton Vérifier

Le contenu de Entry et le statut de contrôle de Checkbutton peuvent être obtenus en définissant une variable dans l'option (texte) variable.

        self.var_entry = Tk.StringVar()
        self.entry = Tk.Entry(self, textvariable=self.var_entry)
        self.var_check = Tk.BooleanVar()
        self.check = Tk.Checkbutton(self, text=u'Extension limitée à txt',
                                    variable=self.var_check)

Utilisez set () et get () pour définir et obtenir les valeurs de Tk.StringVar () et Tk.BooleanVar ().

Action en appuyant sur un bouton

La méthode à exécuter lorsque le bouton est enfoncé est spécifiée par l'option de commande.

    def create_widgets(self):
        self.var_entry = Tk.StringVar()
        self.entry = Tk.Entry(self, textvariable=self.var_entry)
        self.button = Tk.Button(self, text=u'ouvert', command=self.button_pushed)

    def button_pushed(self):
        self.var_entry.set(u'Le bouton a été enfoncé.')

Boîte de dialogue de fichier

Pour ouvrir la boîte de dialogue de fichier, importez tkFileDialog et utilisez askopenfilename. Vous pouvez spécifier le type de fichier à l'aide de l'option filetypes. De plus, tkFileDialog inclut askopenfile, askopenfiles, askopenfilenames, askaveasfile, askaveasfilename, askdirectory, etc.

import tkFileDialog as tkFD

    def button_pushed(self):
        ft = [('text files', '.txt')] if self.var_check.get() else []
        self.var_entry.set(tkFD.askopenfilename(filetypes=ft))

Actions en fonction des changements de variables

Pour surveiller une variable et appeler une méthode lorsqu'elle change, utilisez la méthode trace.

    def create_widgets(self):
        self.var_entry = Tk.StringVar()
        self.var_entry.trace('w', self.entry_changed)

    def entry_changed(self, *args):
        if os.path.exists(self.var_entry.get()):
            self.text.delete('1.0', Tk.END)
            self.text.insert('1.0', open(self.var_entry.get()).read())

entry_changed est appelé lorsque la valeur de var_entry est réécrite. Tout d'abord, effacez tout le contenu de Texte, puis affichez le contenu du fichier.

barre de défilement

Vous pouvez ajouter une barre de défilement au texte. [^ 2] Il semble y avoir un widget appelé ScrolledText qui a une barre de défilement verticale depuis le début.

        self.text = Tk.Text(self, wrap=Tk.NONE)
        self.yscroll = Tk.Scrollbar(self, command=self.text.yview)
        self.xscroll = Tk.Scrollbar(self, command=self.text.xview,
                                    orient=Tk.HORIZONTAL)
        self.text['yscrollcommand'] = self.yscroll.set
        self.text['xscrollcommand'] = self.xscroll.set

        self.text.grid(column=0, columnspan=3, row=2, rowspan=2, sticky=Tk.NSEW)
        self.yscroll.grid(column=2, row=2, sticky=Tk.NS + Tk.E)
        self.xscroll.grid(column=0, columnspan=3, row=3, sticky=Tk.EW + Tk.S)

[^ 2]: L'intersection des barres de défilement, j'ai l'impression de pouvoir en faire un peu plus

Coller l'image

Il semble que Tkinter assume fondamentalement le gif. D'un autre côté, par exemple, savefig de matplotlib (pyplot) ne peut pas enregistrer les images au format gif (n'est-ce pas?). Je l'ai donc converti comme suit, puis je l'ai collé, mais y a-t-il un moyen plus intelligent?

from PIL import Image
    def create_widgets(self):
        self.canvas = Tk.Canvas(self)
        self.canvas.grid(column=0, columnspan=3, row=4, sticky=Tk.NSEW)

    def set_image(self):
        img = Image.open('foo.png')
        img.save('_tmp.gif')
        self.image_data = Tk.PhotoImage(file='_tmp.gif')
        self.canvas.create_image(200, 100, image=self.image_data)

Redirection de sortie standard

Ceci est une copie de stackoverflow. .. .. Vous pouvez exporter le contenu de la sortie standard vers Texte, etc.

import sys

    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
        self.create_widgets()
        sys.stdout = self.StdoutRedirector(self.text)
        sys.stderr = self.StderrRedirector(self.text)

    class IORedirector(object):
        def __init__(self, text_area):
            self.text_area = text_area

    class StdoutRedirector(IORedirector):
        def write(self, st):
            self.text_area.insert(Tk.INSERT, st)

    class StderrRedirector(IORedirector):
        def write(self, st):
            self.text_area.insert(Tk.INSERT, st)

sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

Compatible Python3

Il semble que Tkinter a été renommé en tkinter et tkFileDialog a été renommé en fileialog.

Recommended Posts

Créer une application graphique avec Tkinter de Python
Créez une application graphique native avec Py2app et Tkinter
Créer un fichier exécutable GUI créé avec tkinter
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
Créer une interface graphique python à l'aide de tkinter
Application GUI facile avec Tkinter Text
Créer une application GUI simple en Python
Créez une application Web simple avec Flask
Vous pouvez facilement créer une interface graphique même avec Python
Créer une matrice avec PythonGUI (combo tkinter)
Procédure de création d'application multi-plateforme avec kivy
Créer une application Todo avec Django REST Framework + Angular
Créer une page d'accueil avec django
Essayez de créer une application Todo avec le framework Django REST
Créer une visionneuse d'images avec Tkinter
Créer une application Todo avec Django ③ Créer une page de liste de tâches
Créons une application Mac avec Tkinter et py2app
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créer un répertoire avec python
Créer une application Todo avec Django ⑤ Créer une fonction d'édition de tâches
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot
Créez un jeu de vie mis à jour manuellement avec tkinter
[Fiche d'apprentissage] Créez un mystérieux jeu de donjon avec Pyhton's Tkinter
Créer une interface graphique aussi facilement que possible avec python [édition tkinter]
Créer une application Todo avec Django ① Créer un environnement avec Docker
Faisons une interface graphique avec python.
Créez un environnement virtuel avec Python!
Créez un stepper de poisson avec numpy.random
Dessinez un graphique avec l'interface graphique PySimple
Créer un téléchargeur de fichiers avec Django
Créer un décorateur de fonction Python avec Class
Créer une application de fractionnement d'image avec Tkinter
Créez une image factice avec Python + PIL.
Jouez comme une application Web avec ipywidgets
Rendez les applications GUI super faciles avec tkinter
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Démonisez une application Web Python avec Supervisor
Créer un gros fichier texte avec shellscript
Créez un système stellaire avec le script Blender 2.80
Créer une machine virtuelle avec un fichier YAML (KVM)
Créer une application Python-GUI dans Docker (PySimpleGUI)
Créer un compteur de fréquence de mots avec Python 3.4
Création de la première application avec Django startproject
Créer un voisin le plus proche de connexion avec NetworkX
Créez une application de mots anglais avec python
Créer un service Web avec Docker + Flask
Créer un référentiel privé avec AWS CodeArtifact
Créez une application de bureau avec Python avec Electron
Créez un compteur de voiture avec Raspberry Pi
Créez une image diabolique avec le script de Blender
Créer une matrice avec PythonGUI (zone de texte)
Créer un graphique avec des bordures supprimées avec matplotlib
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Introduction)
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
Créez une application qui devine les étudiants avec Python