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.
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
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)
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)
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.
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.')
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))
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.
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
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)
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__
Es scheint, dass Tkinter in tkinter umbenannt wurde und tkFileDialog in fileialog umbenannt wurde.
Recommended Posts