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