# Snippets tk/tkinter
Tk est léger, rapide et surtout très pratique pour coder rapidement une interface.
En python :
```
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
from tkinter import ttk
```
## Barre de progression en tk
```
canvas=Canvas(parentframe, width=300, height=20, bg='ivory')
canvas.configure(bd=2, relief='groove')
canvas.pack()
perc = float(perc[0].strip("%")) # this is a percent
canvas.create_rectangle(0, 0, perc/100*300, 20, fill='green')
canvas.update()
```
## Récupérer le presse-papier et le mettre dans une saisie
```
try :
c = self.root.clipboard_get().strip()
if c:
self.entry.delete(0, END)
self.entry.insert(0, c)
except:
c= ""
```
## Avoir une fenêtre pour choisir un fichier
```
def chdir(self):
dldir = filedialog.askdirectory(\
initialdir=(os.path.expanduser("~")),\
title="Télécharger dans",\
parent=self.root)
if dldir != ():
self.dldir = dldir
self.chgbtn.configure(text="Emplacement {}".format(\
self.dldir))
```
## Afficher une information dans une popup
```
messagebox.showinfo(message = txt)
```
## Déplacer des widget dans un treeview
```
def bMove(self, event):
# To move item in treeview
# https://stackoverflow.com/questions/11570786/tkinter-treeview-drag-and-drop
tv = event.widget
moveto = tv.index(tv.identify_row(event.y))
for s in tv.selection():
tv.move(s, '', moveto)
```
## Remplacer zenity
```
# replace zenity --title=$1 --text=$2 --entry
from tkinter import *
from tkinter import simpledialog
def help():
print("usage : ")
print("{}
".format(sys.argv[0]))
sys.exit(1)
def main():
if len(sys.argv) == 3:
root = Tk()
root.withdraw()
ans = simpledialog.askstring(sys.argv[1], sys.argv[2])
if str(ans) != "" :
print(ans)
return 0
else:
help()
if __name__ == '__main__':
main()
```
## Enlever la barre de la fenêtre
```
self.root.overrideredirect(True)
```
## Centrer une fenêtre
```
def center(self):
self.root.update_idletasks()
w = self.root.winfo_screenwidth()
h = self.root.winfo_screenheight()
size = tuple(int(_) for _ in self.root.geometry().split('+')[0].split('x'))
x = w/2 - size[0]/2
y = h/2 - size[1]/2
self.root.geometry("%dx%d+%d+%d" % (size + (x, y)))
```
## Support du systray
Il faut tktray d'installé
```
class Icon(tkinter.BaseWidget, tkinter.Wm):
def __init__(self, master=None, cmd = None, cnf={}, **kw):
if not master:
if tkinter._support_default_root:
if not tkinter._default_root:
tkinter._default_root = tkinter.Tk()
master = tkinter._default_root
self.TktrayVersion = master.tk.call('package', 'require', 'tktray')
# stolen from tkinter.Toplevel
if kw:
cnf = tkinter._cnfmerge((cnf, kw))
extra = ()
for wmkey in ['screen', 'class_', 'class', 'visible', 'colormap']:
if wmkey in cnf.keys():
val = cnf[wmkey]
# TBD: a hack needed because some keys
# are not valid as keyword arguments
if wmkey[-1] == '_': opt = '-'+wmkey[:-1]
else: opt = '-'+wmkey
extra = extra + (opt, val)
del cnf[wmkey]
tkinter.BaseWidget.__init__(self, master, 'tktray::icon', cnf, {}, extra)
self.protocol("WM_DELETE_WINDOW", self.destroy)
if cmd:
self.bind("", lambda x: Popen(cmd))
```
## Changer l'icône de la fenêtre
```
# set window icon
image = Image.open(icon)
imgicon = ImageTk.PhotoImage(image)
self.root.tk.call('wm', 'iconphoto', self.root._w, imgicon)
```
## Simple demande d'entrée par l'user
```
from tkinter import simpledialog
pw = simpledialog.askstring(txt_passphrase,txt_passphrase)
```
## Simple dialog
```
from tkinter import simpledialog
class Dialogue(simpledialog.Dialog):
def __init__(self, parent, title=None, other_args=""):
super().__init__(parent,title)
self.args = other_args
def body(self, master):
frame = ttk.Frame(master)
titlelabel = ttk.Label(frame, text=txt_configuration)
titlelabel.grid(sticky=N, column=0, columnspan=2, row=0, pady=5, padx=5)
wlanlabel = ttk.Label(frame, text=txt_wlanlabel)
wlanlabel.grid(column=0, row=1, sticky=W, pady=5, padx=5)
wlan_ifaces = [ i for i in get_ifaces() if get_iface_type(i) == "wlan" ]
self.wlan_box_value = StringVar()
self.wlan_box = ttk.Combobox(frame, textvariable=self.wlan_box_value)
self.wlan_box['values'] = wlan_ifaces
self.wlan_box.current(0)
self.wlan_box.grid(column=1, row=1, pady=5, padx=5)
ethlabel = ttk.Label(frame, text=txt_ethlabel)
ethlabel.grid(column=0, row=2, sticky=W, pady=5, padx=5)
eth_ifaces = [ i for i in get_ifaces() if get_iface_type(i) == "eth" ]
self.eth_box_value = StringVar()
self.eth_box = ttk.Combobox(frame, textvariable=self.eth_box_value)
self.eth_box['values'] = eth_ifaces
self.eth_box.current(0)
self.eth_box.grid(column=1, row=2, pady=5, padx=5)
for child in master.winfo_children():
child.grid_configure(padx=5, pady=5)
return self.wlan_box # initial focus
def apply(self):
wlaniface = self.wlan_box.get()
ethiface = self.eth_box.get()
saveconfig("DEFAULT", "wlaniface", wlaniface)
saveconfig("DEFAULT", "ethiface", ethiface)
```
## Console dans la fenêtre
```
root = Tk()
termf = Frame(root, height=700, width=1000)
termf.pack(fill=BOTH, expand=YES)
wid = termf.winfo_id()
f=Frame(root) cmd('xterm -into {} -geometry 160x50 -sb -bg black -fg grey -e "ls; ksh" &'.format(wid))
root.mainloop()
```
## Icône de la fenêtre en base64
```
from PIL import Image, ImageTk
from io import BytesIO
import base64
# set window icon
imgicon = Image.open(BytesIO(base64.b64decode(tkmenuicon)))
imgicon = ImageTk.PhotoImage(imgicon)
```