programming:python:tkinter
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
programming:python:tkinter [2021/08/16 21:40] – [links] frank | programming:python:tkinter [2023/06/08 17:06] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== tkinter ====== | ||
+ | ===== links ===== | ||
+ | Basics: https:// | ||
+ | |||
+ | Layout: https:// | ||
+ | |||
+ | grid: https:// | ||
+ | |||
+ | Mixed layout: https:// | ||
+ | |||
+ | Radiobutton Gruppen: | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Buttons mit gemeinsamer click-Funktion: | ||
+ | |||
+ | MessageBox: https:// | ||
+ | |||
+ | Neues Fenster: https:// | ||
+ | ===== Bildschirmgröße ===== | ||
+ | |||
+ | * winfo_screenwidth() | ||
+ | * winfo_screenheight() | ||
+ | |||
+ | Fenster in Bildschirmmitte ausrichten: https:// | ||
+ | |||
+ | * X=(screenwidth-windowwidth)/ | ||
+ | * Y=(screenheight-windowheight)/ | ||
+ | |||
+ | die Position kann wie die Größe mit der geometry Methode gesetzt werden | ||
+ | |||
+ | root = Tk() | ||
+ | root.geometry(" | ||
+ | |||
+ | es kann auch nur die position verändert werden: | ||
+ | |||
+ | root.geometry(" | ||
+ | ===== Fenster als Klasse ===== | ||
+ | |||
+ | <code python> | ||
+ | import tkinter as tk | ||
+ | |||
+ | class App: | ||
+ | def __init__(self, | ||
+ | window.geometry(' | ||
+ | frame = tk.Frame(window) | ||
+ | frame.pack() | ||
+ | self.button = tk.Button(frame, | ||
+ | | ||
+ | | ||
+ | self.button.pack(side=tk.LEFT) | ||
+ | self.slogan = tk.Button(frame, | ||
+ | | ||
+ | | ||
+ | self.slogan.pack(side=tk.LEFT) | ||
+ | def write_slogan(self): | ||
+ | print(" | ||
+ | | ||
+ | if __name__ == " | ||
+ | root = tk.Tk() | ||
+ | app = App(root) | ||
+ | root.mainloop() | ||
+ | </ | ||
+ | |||
+ | alternativ kann man auch direkt von der tk.Tk-Klasse ableiten, somit muss das Fenster nicht extern erzeugt werden | ||
+ | |||
+ | <code python> | ||
+ | class App(tk.Tk): | ||
+ | def __init__(self): | ||
+ | tk.Tk.__init__(self) | ||
+ | self.geometry(' | ||
+ | frame = tk.Frame(self) | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Das sollte aber nur bei Anwendungen gemacht werden die nur 1 Fenster nutzen. Bei mehreren Fenstern sollte die Fenstererstellung außerhalb der Klasse und nur das Füllen des Fensters innerhalb ablaufen. | ||
+ | ===== Texteingabe ===== | ||
+ | |||
+ | hier wird ein neuer Frame erzeugt um die Scrollbars an der Textbox auszurichten | ||
+ | |||
+ | ggf. mainframe (Eltern-Element) und txt_frm.grid anpassen (ggf. pack o.ä.) | ||
+ | |||
+ | <code python> | ||
+ | import tkinter as tk | ||
+ | |||
+ | class scrolltext(tk.Frame): | ||
+ | def __init__(self, | ||
+ | tk.Frame.__init__(self, | ||
+ | # ensure a consistent GUI size | ||
+ | self.grid_propagate(False) | ||
+ | # implement stretchability | ||
+ | self.grid_rowconfigure(0, | ||
+ | self.grid_columnconfigure(0, | ||
+ | | ||
+ | self.txt = tk.Text(self, | ||
+ | self.txt.config(undo=True, | ||
+ | self.txt.grid(row=0, | ||
+ | | ||
+ | #create vertical scrollbar | ||
+ | self.vscrollb = tk.Scrollbar(self, | ||
+ | self.vscrollb.grid(row=0, | ||
+ | self.txt[' | ||
+ | | ||
+ | #create horizontal scrollbar | ||
+ | self.hscrollb = tk.Scrollbar(self, | ||
+ | self.hscrollb.grid(row=1, | ||
+ | self.txt[' | ||
+ | |||
+ | def focus(self): | ||
+ | self.txt.focus() | ||
+ | def getText(self): | ||
+ | return self.txt.get(" | ||
+ | def setText(self, | ||
+ | self.txt.delete(1.0," | ||
+ | self.txt.insert(1.0, | ||
+ | |||
+ | if __name__ == " | ||
+ | def clicked(): | ||
+ | print(txt.getText().splitlines()) | ||
+ | txt.setText(" | ||
+ | |||
+ | window = tk.Tk() | ||
+ | window.geometry(' | ||
+ | window.title(" | ||
+ | |||
+ | txt=scrolltext(window, | ||
+ | txt.pack(side = tk.LEFT, | ||
+ | |||
+ | btn = tk.Button(window, | ||
+ | btn.pack(side=tk.RIGHT) | ||
+ | |||
+ | txt.focus() | ||
+ | |||
+ | window.mainloop() | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | Beispiel mit yscrollcommand und zeilenweisem auslesen: https:// | ||
+ | Horizontale scrollbar: https:// | ||
+ | ===== treeview ===== | ||
+ | https:// | ||
+ | |||
+ | https:// | ||
+ | ===== PanedWindow ===== | ||
+ | |||
+ | ein PanedWindow is ein Container für mindestens 2 Widgets mit einer verschiebbaren Begrenzung. | ||
+ | |||
+ | <code python> | ||
+ | m1 = tk.PanedWindow(window) | ||
+ | m1.pack(fill = tk.BOTH, expand = 1) | ||
+ | |||
+ | button = tk.Button(m1, | ||
+ | m1.add(button, | ||
+ | | ||
+ | button2 = tk.Button(m1, | ||
+ | m1.add(button2, | ||
+ | |||
+ | #setzen des Schiebereglers (optional, falls always nicht richtig ist) | ||
+ | m1.update() | ||
+ | m1.sash_place(0, | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ===== Notebook ===== | ||
+ | |||
+ | <code python> | ||
+ | tc = ttk.Notebook(master) | ||
+ | t1 = ttk.Frame(tc) | ||
+ | t2 = ttk.Frame(tc) | ||
+ | tc.add(t1, text =' | ||
+ | tc.add(t2, text =' | ||
+ | tc.pack(expand = 1, fill =" | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | |||
+ | ===== Beispiel-Gui ===== | ||
+ | |||
+ | <code python> | ||
+ | from tkinter import Tk, RIGHT, BOTH, RAISED, | ||
+ | from tkinter import messagebox | ||
+ | from tkinter.ttk import Label, Frame, Button, Entry, Checkbutton, | ||
+ | |||
+ | class Example(): | ||
+ | |||
+ | def __init__(self, | ||
+ | self.window=window | ||
+ | self.initUI(window) | ||
+ | |||
+ | def initUI(self, | ||
+ | self.tc=Notebook(window) | ||
+ | self.t1 = Frame(self.tc) | ||
+ | self.t2 = Frame(self.tc) | ||
+ | self.t3 = Frame(self.tc) | ||
+ | self.tc.add(self.t1, | ||
+ | self.tc.add(self.t2, | ||
+ | self.tc.add(self.t3, | ||
+ | self.tc.pack(fill=BOTH, | ||
+ | |||
+ | closeButton = Button(window, | ||
+ | closeButton.pack(side=RIGHT, | ||
+ | okButton = Button(window, | ||
+ | okButton.pack(side=RIGHT) | ||
+ | mvButton = Button(window, | ||
+ | mvButton.pack(side=RIGHT) | ||
+ | |||
+ | self.filltabs() | ||
+ | |||
+ | def filltabs(self): | ||
+ | l1=Label(self.t1, | ||
+ | l1.grid(row=0, | ||
+ | self.e1=Entry(self.t1) | ||
+ | self.e1.grid(row=0, | ||
+ | l2=Label(self.t1, | ||
+ | l2.grid(row=1, | ||
+ | self.chkvar1 = IntVar() | ||
+ | self.chkvar1.set(1) | ||
+ | c1=Checkbutton(self.t1, | ||
+ | c1.grid(row=1, | ||
+ | |||
+ | l3=Label(self.t2, | ||
+ | l3.grid(row=0, | ||
+ | rf=Frame(self.t2) | ||
+ | rf.grid(row=0, | ||
+ | self.radvar1=StringVar() | ||
+ | r1=Radiobutton(rf, | ||
+ | r1.pack(anchor=" | ||
+ | r2=Radiobutton(rf, | ||
+ | r2.pack(anchor=" | ||
+ | |||
+ | self.tree1=Treeview(self.t3, | ||
+ | self.tree1.pack(fill=BOTH, | ||
+ | |||
+ | self.tree1.insert(parent='', | ||
+ | self.tree1.insert(parent=0, | ||
+ | |||
+ | def main(): | ||
+ | |||
+ | root = Tk() | ||
+ | root.geometry(" | ||
+ | root.title(" | ||
+ | root.style = Style().theme_use(" | ||
+ | app = Example(root) | ||
+ | root.mainloop() | ||
+ | |||
+ | |||
+ | if __name__ == ' | ||
+ | main() | ||
+ | </ |
programming/python/tkinter.txt · Zuletzt geändert: 2023/06/08 17:06 von 127.0.0.1