Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

tk and tkinter snippets

Tk est génial pour faire des interfaces graphiques ! Il est léger, rapide et surtout très pratique pour coder.

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="Téléchargement dans {}".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))