Erstellen Sie eine GUI-App mit Tkinter of Python

Ich habe beschlossen, eine GUI-Anwendung mit Python zu erstellen, und Tkinter konnte schnell verwendet werden. Dies ist also ein Memorandum für die nächste Verwendung.

Vorlage

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()

Hier werden verschiedene Widgets angehängt.

Widget[^1]

Name Rolle
Button Taste
Canvas Bilder einfügen und zeichnen
Checkbutton Schaltfläche überprüfen
Entry Einzeiliger Textbereich. Mehrere Zeilen sind Text
Frame Ein Rahmen, der andere Widgets zusammenhält
Label Etikette. Bilder können auch angezeigt werden
Listbox Listenfeld
Menu Erstellen einer Menüleiste
Message Mehrzeiliges Etikett
OptionMenu Kombinationsfeld
Radiobutton Radio knopf
Scale Schieberegler
Scrollbar Scrollleiste
Text Mehrzeiliger Textbereich
Toplevel Zum Erstellen von Popup-Fenstern usw.

[^ 1]: Nicht alle sind abgedeckt

Widget-Platzierung

Verwenden Sie eine der Pack-, Platzierungs- und Rastermethoden, um das Widget zu platzieren. pack ordnet Widgets in einer Spalte oder einer Zeile an. place gibt den Speicherort jedes Widgets an und platziert es. Raster ordnet Widgets auf 2D-Koordinaten an (es sieht aus wie Excel-Rasterpapier). Danach verwenden wir grundsätzlich das Raster.

    def __init__(self, master=None):
        #Kürzung
        self.create_widgets()

    def create_widgets(self):
        self.label = Tk.Label(self, text=u'Eingabedatei')
        self.entry = Tk.Entry(self)
        self.button = Tk.Button(self, text=u'öffnen')
        self.check = Tk.Checkbutton(self, text=u'Begrenzte Erweiterung auf 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)

Unterstützung für Platzierungsanpassung und Expansion / Kontraktion

Stellen Sie zunächst "Erweitern", "Füllen" und "Verankern" ein, um den übergeordneten Rahmen mit der Erweiterung und Kontraktion kompatibel zu machen. Die später beschriebene Position von Tk.XX mit Anker und Klebrigkeit kann durch Nord, Süd, Ost und West (NSEW) angegeben werden.

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

Geben Sie dann beim Anordnen jedes Widgets mit Raster an, wo und wie mit Sticky erweitert und verkleinert werden soll. Eine weitere wichtige Sache ist, dass Sie beim Platzieren eines Widgets mit Raster angeben müssen, welche Zeile / Spalte in welchem Verhältnis mit Spaltenkonfiguration und Zeilenkonfiguration erweitert und verkleinert wird. Standardmäßig ist der Gewichtungsparameter 0 (wird nicht gedehnt). Setzen Sie daher einfach das Gewicht der Zeile / Spalte, die Sie dehnen möchten, auf 1. Im folgenden Beispiel entspricht nur die zweite Zeile mit Text der Erweiterung und Kontraktion der ersten Spalte mit Eintrag, die den ausgewählten Dateinamen enthalten soll.

        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)

Rufen Sie den Inhalt des Eintrags und den Prüfstatus der Schaltfläche Prüfen ab

Der Inhalt der Eingabe und der Prüfstatus der Schaltfläche werden durch Festlegen einer Variablen in der Option (Text-) Variable abgerufen.

        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'Begrenzte Erweiterung auf txt',
                                    variable=self.var_check)

Verwenden Sie set () und get (), um die Werte von Tk.StringVar () und Tk.BooleanVar () festzulegen und abzurufen.

Aktion beim Drücken einer Taste

Die Methode, die beim Drücken der Taste ausgeführt werden soll, wird durch die Befehlsoption festgelegt.

    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'öffnen', command=self.button_pushed)

    def button_pushed(self):
        self.var_entry.set(u'Der Knopf wurde gedrückt.')

Dateidialog

Importieren Sie zum Öffnen des Dateidialogs tkFileDialog und verwenden Sie askopenfilename. Sie können den Dateityp mithilfe der Option Dateitypen angeben. Darüber hinaus enthält tkFileDialog askopenfile, askopenfiles, askopenfilenames, askaveasfile, askaveasfilename, askdirectory usw.

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))

Aktionen entsprechend Änderungen in Variablen

Verwenden Sie die Trace-Methode, um eine Variable zu überwachen und eine Methode aufzurufen, wenn sie sich ändert.

    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 wird aufgerufen, wenn der Wert von var_entry neu geschrieben wird. Löschen Sie zuerst den gesamten Textinhalt und zeigen Sie dann den Inhalt der Datei an.

Scrollleiste

Sie können Text eine Bildlaufleiste hinzufügen. [^ 2] Es scheint ein Widget namens ScrolledText zu geben, das von Anfang an eine vertikale Bildlaufleiste hat.

        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]: Der Schnittpunkt der Bildlaufleisten, ich habe das Gefühl, dass ich etwas mehr tun kann

Bild einfügen

Es scheint, dass Tkinter grundsätzlich GIF annimmt. Andererseits kann beispielsweise savefig von matplotlib (pyplot) keine Bilder als gif speichern (nicht wahr?). Also habe ich es wie folgt konvertiert und dann eingefügt, aber gibt es einen intelligenteren Weg?

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)

Standardausgangsumleitung

Dies ist eine Kopie von stackoverflow. .. .. Sie können den Inhalt der Standardausgabe in Text usw. ausgeben.

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__

Python3-kompatibel

Es scheint, dass Tkinter in tkinter umbenannt wurde und tkFileDialog in fileialog umbenannt wurde.

Recommended Posts

Erstellen Sie eine GUI-App mit Tkinter of Python
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
Erstellen Sie mit tkinter eine Python-GUI
Einfache GUI App mit Tkinter Text
Erstellen Sie eine einfache GUI-App in Python
Erstellen Sie eine einfache Web-App mit Flasche
Sie können auch mit Python problemlos eine GUI erstellen
Erstellen Sie eine Matrix mit PythonGUI (tkinter-Kombinationsfeld)
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Erstellen Sie eine Homepage mit Django
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie den Image Viewer mit Tkinter
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie ein Verzeichnis mit Python
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
Erstellen Sie eine App für maschinelles Lernen mit ABEJA Platform + LINE Bot
Erstellen Sie ein Lebensspiel, das manuell mit tkinter aktualisiert wird
[Lernrekord] Erstelle mit Pyhtons Tkinter ein mysteriöses Dungeon-Spiel
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Lassen Sie uns eine GUI mit Python erstellen.
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie einen Poisson-Stepper mit numpy.random
Zeichnen Sie ein Diagramm mit der PySimple-Benutzeroberfläche
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen einer Bildaufteilungs-App mit Tkinter
Erstellen Sie mit Python + PIL ein Dummy-Image.
Spielen Sie wie eine Web-App mit ipywidgets
Machen Sie GUI-Apps mit tkinter ganz einfach
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Erstellen Sie eine große Textdatei mit Shellscript
Erstellen Sie ein Sternensystem mit Blender 2.80-Skript
VM mit YAML-Datei (KVM) erstellen
Erstellen Sie eine Python-GUI-App in Docker (PySimpleGUI).
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Erstellen der ersten App mit Django Startprojekt
Erstellen Sie mit NetworkX einen verbindenden nächsten Nachbarn
Erstellen Sie eine englische Wort-App mit Python
Erstellen Sie einen Webdienst mit Docker + Flask
Erstellen Sie ein privates Repository mit AWS CodeArtifact
Erstellen Sie eine Desktop-App mit Python mit Electron
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Erstellen Sie ein teuflisches Bild mit Blenders Skript
Erstellen Sie eine Matrix mit PythonGUI (Textfeld)
Erstellen Sie ein Diagramm mit Rändern, die mit matplotlib entfernt wurden
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Einführung)
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Erstellen Sie eine App, die Schüler mit Python errät