[[:oktatas:programozás:python|< Python]] ====== Python Tk GUI ====== * **Szerző:** Sallai András * Copyright (c) 2011, Sallai András * Szerkesztve: 2011, 2020 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Helló Világ ===== import tkinter as tk ablak = tk.Tk() ablak.mainloop() ===== Gomb ===== import tkinter as tk ablak = tk.Tk() gomb = tk.Button(ablak, text="Kilép") gomb.pack() ablak.mainloop() ===== Gomb eseménnyel ===== import tkinter as tk ablak = tk.Tk() gomb = tk.Button(ablak, text="Kilép", command=ablak.quit) gomb.pack() ablak.mainloop() ===== Importálás külön-külön ===== from tkinter import Tk from tkinter import Button ablak = Tk() gomb = Button(ablak, text="Kilép", command=ablak.quit) gomb.pack() ablak.mainloop() ===== Fontbeállítások ===== A következő programban fontbeállításokat is végzünk: import tkinter as tk ablak = tk.Tk() ablak.option_add("*font","lucida 14 bold italic") gomb = tk.Button(ablak, text="Kilép", command=ablak.quit) gomb.pack() ablak.mainloop() ===== Nyomógombok ===== import tkinter as tk class App: def __init__(self, master): frame = tk.Frame(master) frame.pack() self.button = tk.Button(frame, text="Kilépés", fg="red", command=frame.quit) self.button.pack(side=tk.LEFT) self.hi_there = tk.Button(frame, text="Szia", command=self.say_hi) self.hi_there.pack(side=tk.LEFT) def say_hi(self): print("Lenyomott gomb") ablak = tk.Tk() app = App(ablak) ablak.mainloop() ===== Nyomógomb megint ===== import tkinter as tk from tkinter import messagebox class App: def __init__(self, master): frame = tk.Frame(master) frame.pack() self.kilepes_gomb = tk.Button(frame, text="Kilépés", fg="red", command=frame.quit) self.kilepes_gomb.pack(side=tk.LEFT) self.udv_gomb = tk.Button(frame, text="Szia", command=self.udvozlet) self.udv_gomb.pack(side=tk.LEFT) def udvozlet(self): messagebox.showinfo("Címsor", "Üdvözlet") return ablak = tk.Tk() app = App(ablak) ablak.mainloop() ===== Üzenetablak ===== A tkMessageBox modult üzenetdobozok megjelenítésére használjuk programokban. Ez a modul több függvényt tartalmaz az üzenetek megjelenítésének variálásához. Ezek a függvények a következők: showinfo, showwarning, showerror, askquestion, askokcancel, askyesno, és askretryignore Szintaxis: Itt egyszerű szintaxist találsz a használatára: tkMessageBox.FuggvenyNev(cim, uzenet [, opciok]) Paraméterek: * FuggvenyNev: A kívánt üzenetformához tartozó függvénynév * cim: Az üzenetablak címsorában látszik * uzenet: A megjelenített üzenet * opciok: Alternatív lehetőségek megadása az alapértelmezett megjelenés helyett. * showinfo() * showwarning() * showerror() * askquestion() * askokcancel() * askyesno() * askretrycancel() Példa: import tkinter from tkinter import messagebox top = tkinter.Tk() def hello(): messagebox.showinfo("Üdv ablak", "Üdv") gomb1 = tkinter.Button(top, text = "Mond: Üdv", command = hello) gomb1.pack() top.mainloop() Választott gomb visszaadása: from tkinter import messagebox if messagebox.askyesno("Másik", "Valami") == 1: print("Akarja") else: print("Nem akarja") input() ^ Funkció ^ Egy fájl ^ Több fájl ^ Elérhető kapcsolók ^ | fájl megnyitása | askopenfile(mode='r', **options) | askopenfiles(mode='r', **options) | defaultextension, filetypes, initialdir, initialfile, multiple, message, parent, title | | egy fájlnév kinyerése megnyitáshoz | askopenfilename(**options) | askopenfilenames(**options) | defaultextension, filetypes, initialdir, initialfile, multiple, message, parent, title | | fájl mentése | asksaveasfile(mode='w', **kapcsolók) | n/a | defaultextension, filetypes, initialdir, initialfile, multiple, message, parent, title | | egy fájlnév kinyerése mentéshez | asksaveasfilename(**kapcsolók) | n/a | defaultextension, filetypes, initialdir, initialfile, multiple, message, parent, title | | könyvtárválasztás | askdirectory(**) | n/a | initialdir, parent, title, mustexist | ==== Kapcsolók ==== -defaultextension kiterjesztés * A fájlhoz egy kiterjesztést fűz hozzá, ha nem volt kiterjesztése. Az alapértelmezetten ez üres karaktersorozat. Macintosh rendszeren ez a kapcsoló nem működik. -filetypes filePatternList * Az elérhető fájltípusok egy listadobozban. Ha a felhasználó kiválaszt egy fájltípust, akkor csak az látszik. -initialdir directory * Amikor a párbeszédablak megjelenik, melyik könyvtár legyen az alapértelmezett könyvtár. Ha nincs megadva, akkor az aktuális munkakönyvtár lesz a kezdőkönyvtár. -initialfile filename * Alapértelmezett fájlnév induláskor -message string * A párbeszédablak egy üzenete. -multiple boolean * Engedélyezi több fájl kiválasztását. Macintoshon csak telepített szolgáltatás mellett érhető el. -mustexist boolean * Ha be van állítva, akkor csak létező könyvtárakat tudunk megnyitni. -parent ablak * A párbeszédablak szülőablakát állíthatjuk be. -title címszöveg * A címsor szövege ===== Kurzor ===== * "arrow" * "circle" * "clock" * "cross" * "dotbox" * "exchange" * "fleur" * "heart" * "heart" * "man" * "mouse" * "pirate" * "plus" * "shuttle" * "sizing" * "spider" * "spraycan" * "star" * "target" * "tcross" * "trek" * "watch" Példa a kurzor használatára: from tkinter import Tk from tkinter import Button from tkinter import RAISED gyoker = Tk() gomb1 = Button(gyoker, text="Kör", relief=RAISED,\ cursor="circle") gomb2 = Button(gyoker, text="Plusz", relief=RAISED,\ cursor="plus") gomb1.pack() gomb2.pack() gyoker.mainloop() * http://docs.huihoo.com/tkinter/tkinter-reference-a-gui-for-python/cursors.html ===== Font ===== Font objektum fontok létrehozásához: Készíthetsz egy font objektumot, amelyet a tkFont modul importálása után érhetsz el. Használd a Font konstruktort: import tkinter.font as font sajatfont = tkinter.font.Font (kapcsoló, ... ) Az kapcsolók listája: * family: A fontcsalád neve karakteresorozatként. * size: A font magassága, egész számként képpontokban. * weight: "bold" félkövér, "normal" általános stílusért. * slant: "italic" dőlt, "roman" nem dőlt. * underline: 1 aláhúzás, 0 normál. * overstrike: 1 áthúzott szöveg, 0 normál. Linux alatt a használható fontok listája: fc-list Példák: self.font = font.Font( family="Bitstream Vera Sans", size=48, weight=font.BOLD, slant=font.ITALIC ) helv36 = font.Font(family="Helvetica",size=36,weight="bold") Komplett példa: from tkinter import Tk from tkinter import Entry from tkinter.font import Font def result(e): print(ent.get()) gyoker = Tk() hevl36 = Font(family="Helvetica", size=30, weight="bold") ent = Entry(gyoker, width=25) ent.insert(0,"Valami szöveg") ent.config(bg="#ffeeff", fg="#ff0000", bd=25, cursor="clock", font=hevl36) ent.bind('', result) ent.pack() gyoker.mainloop() ===== Események ===== ^ Esemény ^ Leírás ^ | | Egy egérgomb lenyomásakor keletkezik (bal, jobb vagy középső). | | | Az Enter billentyű megnyomása | ===== Text ===== Több soros szövegdoboz from tkinter import Tk from tkinter import INSERT from tkinter import Text from tkinter.font import Font gyoker = Tk() font1 = Font(family="Helvetica", size=30, weight="bold") text = Text(gyoker, width=30, height=4) text.insert(INSERT, "Valami") text.pack() text.config(bg="#ffeeff", fg="#ff0000", font=font1 ) gyoker.mainloop() ===== Menü ===== ==== Egyszerű menü ==== from tkinter import Tk from tkinter import Menu gyoker = Tk() def hello(): print("Helló") menusav = Menu(gyoker) menusav.add_command(label="Helló", command=hello) menusav.add_command(label="Kilépés", command=gyoker.quit) gyoker.config(menu=menusav) gyoker.mainloop() ==== Legördülő menü ==== from tkinter import Tk from tkinter import Menu gyoker = Tk() def hello(): print("Helló") menusav = Menu(gyoker) #Legördülő menü fajlmenu = Menu(menusav, tearoff=0) fajlmenu.add_command(label="Megnyitás", command=hello) fajlmenu.add_command(label="Mentés", command=hello) fajlmenu.add_separator() fajlmenu.add_command(label="Kilépés", command=gyoker.quit) menusav.add_cascade(label="Fájl", menu=fajlmenu) editmenu = Menu(menusav, tearoff=0) editmenu.add_command(label="Kivágás", command=hello) editmenu.add_command(label="Másolás", command=hello) editmenu.add_command(label="Beillesztés", command=hello) menusav.add_cascade(label="Szerkesztés", menu=editmenu) helpmenu = Menu(menusav, tearoff=0) helpmenu.add_command(label="Névjegy", command=hello) menusav.add_cascade(label="Segítség", menu=helpmenu) gyoker.config(menu=menusav) gyoker.mainloop() ==== Popup menü ==== from tkinter import Tk from tkinter import Menu from tkinter import Frame gyoker = Tk() def hello(): print("Helló") menu = Menu(gyoker, tearoff=0) menu.add_command(label="Visszavonás", command=hello) menu.add_command(label="Ismétlés", command=hello) frame = Frame(gyoker, width=512, height=512) frame.pack() def popup(event): menu.post(event.x_root, event.y_root) frame.bind("", popup) gyoker.mainloop() ==== Menü változtatása futási időben ==== from tkinter import Tk from tkinter import Menu counter = 0 def update(): global counter counter = counter + 1 menu.entryconfig(0, label=str(counter)) gyoker = Tk() menusav = Menu(gyoker) menu = Menu(menusav, tearoff=0, postcommand=update) menu.add_command(label=str(counter)) menu.add_command(label="Kilépés", command=gyoker.quit) menusav.add_cascade(label="Teszt", menu=menu) gyoker.config(menu=menusav) gyoker.mainloop() ===== Geometria kezelése ===== Minden Tkinter widgets rendelkezik geometriát kezelő metódusokkal, amelynek célja a szülő widgeten való elhelyezés beállítása. A Tkinter a következő geometriakezelőkkel van felszerelve: pack, grid és a place. * A pack() metódus - A komponenseket blokkokba rendezi. * A grid() metódus - A komponenseket táblázatba helyezi el. * A place() metódus - Az adott pozícióban helyezzük el a komponenseket. ==== Automatikus elhelyezés egymás alatt ==== from tkinter import Tk from tkinter import Button gyoker = Tk() gomb1 = Button(gyoker, text="Első") gomb2 = Button(gyoker, text="Második") gomb1.pack() gomb2.pack() gyoker.mainloop() ==== Táblázatos elhelyezés ==== from tkinter import Tk from tkinter import Button gyoker = Tk() gomb1 = Button(gyoker, text="Első") gomb2 = Button(gyoker, text="Második") gomb1.grid(row=0, column=1) gomb2.grid(row=0, column=2) gyoker.mainloop() ==== Elhelyezés adott pozícióban 1 ==== from tkinter import Tk from tkinter import Frame from tkinter import Button gyoker = Tk() keret = Frame(gyoker, width=800,height=600) keret.pack() gomb1 = Button(gyoker, text="Első") gomb2 = Button(gyoker, text="Második") gomb1.place(x=200, y=200) gomb2.place(x=100, y=200) gyoker.mainloop() ==== Elhelyezés adott pozícióban 2 ==== from tkinter import Tk from tkinter import Frame from tkinter import Button gyoker = Tk() keret = Frame(gyoker, width=800,height=600) keret.pack() gomb1 = Button(gyoker, text="Kör") gomb2 = Button(gyoker, text="Plusz") gomb1.place(x=200, y=200) gomb2.place(x=100, y=200) gyoker.mainloop() ==== Komplexebb példa ==== from tkinter import Frame from tkinter import Button from tkinter import Text from tkinter import Entry from tkinter import INSERT from tkinter import W from tkinter import E from tkinter import N from tkinter import S class GridDemo( Frame ): def __init__( self ): Frame.__init__( self ) self.master.title( "Grid Demo" ) self.master.rowconfigure( 0, weight = 1 ) self.master.columnconfigure( 0, weight = 1 ) self.grid( sticky = W+E+N+S ) self.text1 = Text( self, width = 15, height = 5 ) self.text1.grid( rowspan = 3, sticky = W+E+N+S ) self.text1.insert( INSERT, "Text1" ) self.button1 = Button( self, text = "Button 1", width = 25 ) self.button1.grid( row = 0, column = 1, columnspan = 2, sticky = W+E+N+S ) self.button2 = Button( self, text = "Button 2" ) self.button2.grid( row = 1, column = 1, sticky = W+E+N+S ) self.button3 = Button( self, text = "Button 3" ) self.button3.grid( row = 1, column = 2, sticky = W+E+N+S ) self.button4 = Button( self, text = "Button 4" ) self.button4.grid( row = 2, column = 1, columnspan = 2, sticky = W+E+N+S ) self.entry = Entry( self ) self.entry.grid( row = 3, columnspan = 2, sticky = W+E+N+S ) self.entry.insert( INSERT, "Entry" ) self.text2 = Text( self, width = 2, height = 2 ) self.text2.grid( row = 3, column = 2, sticky = W+E+N+S ) self.text2.insert( INSERT, "Text2" ) self.rowconfigure( 1, weight = 1 ) self.columnconfigure( 1, weight = 1 ) def main(): GridDemo().mainloop() if __name__ == "__main__": main() ==== Egy egyszerű szövegszerkesztő ==== from tkinter import Tk from tkinter import Frame from tkinter import Menu from tkinter import Text from tkinter import END from tkinter import filedialog from tkinter import messagebox class App(object): def __init__(self, master): frame = Frame(master) frame.pack() self.text = Text() self.text.pack() menu = Menu(master) root.config(menu=menu) # file menü filemenu = Menu(menu, tearoff=0) filemenu.add_command(label="Új") filemenu.add_command(label="Megnyitás", command=self.file_open) filemenu.add_command(label="Mentés", command=self.file_save) filemenu.add_separator() filemenu.add_command(label="Kilépés", command=self.do_exit) # help menü helpmenu = Menu(menu, tearoff=0) helpmenu.add_command(label="Névjegy", command=self.do_about) menu.add_cascade(label="Fájl", menu=filemenu) menu.add_cascade(label="Segítség", menu=helpmenu) def file_open(self): """Fájl megnyitása""" # Alapértelmezett könyvtár (esetleg c:\vhol) initial_dir = "/home" # Fájlmaszk megadása mask = \ [("Szöveges és Python fájlok","*.txt *.py *.pyw"), ("HTML fájlok","*.htm"), ("Minden fájl","*")] fin = filedialog.askopenfile(initialdir=initial_dir, filetypes=mask, mode='r') text = fin.read() if text != None: self.text.delete(0.0, END) self.text.insert(END,text) def file_save(self): """Fájl mentése""" # Alapértelmezett kiterjesztés, ha nincs akkor automatikusan megadja fout = filedialog.asksaveasfile(mode='w', defaultextension=".txt") text2save = str(self.text.get(0.0,END)) fout.write(text2save) fout.close() def do_exit(self): root.destroy() def do_about(self): messagebox.showinfo("Névjegy", "Egyszerű szövegszerkesztő\nSallai András") root = Tk() root.title("Egyszerű szövegszerkesztő") app = App(root) root.mainloop() ===== Külső linkek ===== * http://docs.huihoo.com/tkinter/tkinter-reference-a-gui-for-python/index.html (2020) * http://effbot.org/tkinterbook/tkinter-index.htm (2020) * http://www.pythonware.com/library/ (2020) * http://www.tutorialspoint.com/python/tk_messagebox.htm (2020) * https://www.delftstack.com/howto/python-tkinter/ (2020)