# 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("{} <Title> <Question>".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("<ButtonPress-1>", 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) ``` --- (DIR) /