Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGUI] Tkinter
#1
Hi,

I'd like to have a GUI for a little project, a directory hasher. It works fine with CLI. I'm completely new to Tkinter, could you please help me out, how could I make it work like this:
when I press the Choose Directory button, the chosen directory should appear in the Entry field, and given to dirmd5 function, and than the calculated hash should be displayed.

Here is the code:

from tkinter import *
from tkinter import filedialog
from checksumdir import dirhash

def dirmd5(dir):
    md5hash = dirhash(dir, 'md5')
    return md5hash

def browse():
    dir=filedialog.askdirectory()
    return dir

root = Tk(className='Directory MD5')

chooseDirectoryButton = Button(root, text='Choose directory:', command=browse)
directoryPath = Entry(root)
hashStartButton = Button(root, text='Start', command=dirmd5)
hashLabel = Label(root, text='MD5 hash:')

chooseDirectoryButton.grid(row=0)
directoryPath.grid(row=0, column=1)
hashStartButton.grid(row=1, column=1, sticky=E)
hashLabel.grid(row=1, sticky=W)

root.mainloop()
Thanks
Reply
#2
Have a look at this link:
https://gist.github.com/Yagisanatode/0d1...a871587ab1
It could be what you want.
Reply
#3
Here are two files (still work with python 3.6 with some minor tweeking) that were written for a tkinter demo back in 2005.
this file should be named template.py
#! /usr/bin/env python3.4

"""
This is a template for demo codes of Tkinter.
"""

import sys
import string
import tkinter as tk
# from ScrolledText import ScrolledText
from tkinter.scrolledtext import ScrolledText


## functions -------------------------------------

def read_contents(fname):
    """ read contens of `fname' """
    # f = file(fname)
    f = open(fname, 'r')
    str = f.read()
    f.close()
    return str


def newlist(n):
    ls = []
    for i in range(n):
        ls.append(None)
    return ls


def i_range(val, min, max):
    if (min and val < min):
        return (min)
    elif (max and val > max):
        return (max)
    else:
        return (val)


def bottom_slide(str, dx):
    ls0 = str.split('+')
    ls1 = ls0[0].split('x')
    return ('+%d+%d' % (int(ls0[1]) + dx, int(ls1[1]) + int(ls0[2]) + 50))


def left_slide(str):
    ls0 = str.split('+')
    ls1 = ls0[0].split('x')
    return ('500x600+%d+%s' % (int(ls1[0]) + int(ls0[1]) + 50, ls0[2]))


def str_same_p(str0, str1):
    ls0 = string.split(str0)
    ls1 = string.split(str1)
    for s0, s1 in zip(ls0, ls1):
        if s0 != s1:
            return False
    else:
        return True


## classes ----------------------------------------



class ShowVars:
    """ a function class to show variables' value in a separated window """

    def __init__(self, demo_window, dx, *vars):
        self.demo_window = demo_window
        self.vars = vars
        self.toplevel = None
        self.dx = dx

    def __call__(self, *av):
        if self.toplevel:
            self.toplevel.focus_set()
        else:
            self.toplevel = tk.Toplevel(self.demo_window)
            self.toplevel.title('Variable values')
            self.toplevel.geometry(bottom_slide(self.demo_window.winfo_geometry(), self.dx))
            frame = tk.Frame(self.toplevel)
            frame.pack(fill=tk.BOTH, expand=1)
            l0 = tk.Label(frame, text='Variable values: ', font=('Helvetica', '14'))
            l0.pack(padx=10, pady=10)
            f = tk.Frame(frame)
            for i, (label, var) in enumerate(self.vars):
                l1 = tk.Label(f, text=label, justify=tk.LEFT, anchor=tk.W, width=15)
                l1.grid(row=i, column=0, sticky=tk.W)
                l2 = tk.Label(f, textvariable=var, justify=tk.LEFT, anchor=tk.W, width=20)
                l2.grid(row=i, column=1, sticky=tk.W)
            f.pack(fill=tk.BOTH, anchor=tk.W, padx=20, pady=20)
            b = tk.Button(frame, text='OK', command=self.destroy_window)
            b.pack(side=tk.BOTTOM, padx=10, pady=10)
            #            self.demo_window.focus_set()

    def destroy_window(self):
        if self.toplevel:
            self.toplevel.destroy()
            self.toplevel = None


class ButtonFrame(tk.Frame):
    """ This is a Frame of two common buttons; dismess and (see code or return demo) """

    def __init__(self, master, b0_text, b0_command, b1_text, b1_command):
        tk.Frame.__init__(self, master, height=35)
        b0 = tk.Button(self, text=b0_text, width=10, command=b0_command)
        b1 = tk.Button(self, text=b1_text, width=10, command=b1_command)
        b0.pack(side=tk.LEFT, padx=30, pady=5)
        b1.pack(side=tk.LEFT, padx=30, pady=5)


class Label(tk.Label):
    """ a label class for the demo """

    def __init__(self, master, **key):  # justify=tk.LEFT, font=("Helvetica", "12")
        key['justify'] = tk.LEFT
        key['font'] = ("Helvetica", "12")
        tk.Label.__init__(self, master, **key)
        self.pack(fill=tk.X, padx=5, pady=5)


class Demo:
    """  A class defining demo window and source code window. """

    demo_window = None
    demo_main_frame = None
    demo_label = None
    demo_frame = None
    code_window = None

    def __init__(self, cmain, fname):
        self.fname = fname.split('.').pop(0) + '.py'
        self.cmain = cmain
        if cmain:
            self.demo_main_frame = tk.Frame()
        else:
            self.demo_window = tk.Toplevel()
            self.demo_main_frame = tk.Frame(self.demo_window)

        self.ini_demo()

    def ini_demo(self):
        self.demo_frame = tk.Frame(self.demo_main_frame)
        self.demo_buttons = ButtonFrame(self.demo_frame, "Dismiss", self.demo_destroy, "Show Code", self.show_code)
        self.demo_main_frame.pack(fill=tk.BOTH, expand=1, padx=3, pady=3)
        self.demo_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=1)
        self.demo_buttons.pack(side=tk.BOTTOM, expand=0, pady=5)

    def ini_demo_called_0(self):
        self.demo_window = tk.Toplevel()
        self.demo_main_frame = tk.Frame(self.demo_window)
        self.ini_demo()

    def ini_demo_called(self):
        pass

    def show_code(self):
        if not self.code_window:
            self.code_window = tk.Toplevel()
            self.code_window.geometry(left_slide(self.demo_main_frame.master.winfo_geometry()))
            self.code_window.title(self.fname)
            self.code_frame = tk.Frame(self.code_window)
            self.code_frame.pack(fill=tk.BOTH, expand=1)
            self.scrolled_text = ScrolledText(self.code_frame, wrap=tk.WORD)
            self.scrolled_text.pack(fill=tk.BOTH, expand=1)
            self.content0 = read_contents(self.fname)
            self.scrolled_text.insert(tk.END, self.content0)
            self.code_buttons = ButtonFrame(self.code_frame, "Dismiss", self.code_destroy, "Return Demo",
                                            self.return_demo)
            self.code_buttons.pack()
        self.code_window.focus_set()

    def code_destroy(self):
        self.code_window.destroy()
        self.code_window = None

    def demo_destroy(self):
        if self.cmain:
            sys.exit()
        else:
            self.demo_window.destroy()
            self.demo_window = None

    def return_demo(self):
        if self.cmain:
            self.demo_main_frame.focus_set()
        else:
            content = self.scrolled_text.get('1.0', tk.END)
            if str_same_p(self.content0, content):
                if self.demo_window:
                    self.demo_window.focus_set()
                else:
                    self.ini_demo_called()
            else:
                if self.demo_window:
                    self.demo_window.destroy()
                f = file('temp.py', 'w')
                f.write(content)
                f.close()
                mod = __import__('temp')
                reload(mod)
                self.code_window.destroy()
                d = mod.Demo(False)
                d.demo_window.focus_set()
                d.demo_window.master.after(20, d.show_code)


##----------------------------------------------------
if __name__ == '__main__':
    class De(Demo):
        def __init__(self):
            Demo.__init__(self, True, __file__)
            Label(self.demo_frame, text="test test test")


    a = De()
    a.demo_main_frame.mainloop()
and this named whatever you wish
#! /usr/bin/env python3.4

"""
filebox.py

This demonstration script prompts the user to select a file.

June 17, 2005
"""

import tkinter as Tk
# import tkFileDialog as Fd
import tkinter.filedialog as Fd
import template as A


class File_Selector(Tk.Frame):
    def __init__(self, master, open_save):
        Tk.Frame.__init__(self, master)
        self.master = master
        label = Tk.Label(self, text='Select a file to %s: ' % open_save)
        label.pack(side=Tk.LEFT, padx=3)
        self.entry = Tk.Entry(self, width=40)
        self.entry.pack(side=Tk.LEFT, padx=3)
        button = Tk.Button(self, text='Browse...', command=(open_save == 'open' and self.open or self.save))
        button.pack(side=Tk.LEFT, padx=3)

    def open(self):
        self.open_or_save(Fd.askopenfilename)

    def save(self):
        self.open_or_save(Fd.asksaveasfilename)

    def open_or_save(self, fun):
        fname = fun(filetypes=[('Text files', ('*.txt', '*.doc')),
                               ('Python script', ('*.py')),
                               ('Image Files', ('*.gif', '*.jpeg', '*.jpg')),
                               ('All Files', ('*'))
                               ])
        if fname:
            self.entry.delete(0, Tk.END)
            self.entry.insert(Tk.END, fname)
            self.master.winfo_toplevel().focus_set()


class Demo(A.Demo):
    """
     a demo for simple labels
    """

    def __init__(self, cmain):  # cmain = __name== '__main__'
        A.Demo.__init__(self, cmain, __file__)
        self.ini_frame()

    def ini_demo_called(self):
        """ This method should be defined"""
        self.ini_demo_called_0()
        self.ini_frame()

    def ini_frame(self):
        self.demo_main_frame.master.title("File Selection Dialogs")
        self.demo_main_frame.master.geometry("+50+50")
        A.Label(self.demo_main_frame, text=
        "Enter a file name in the entry box or click on the \"Browse\" buttons to "
        "select a file name using the file selection dialog."
                , width=55, wraplength='12c')
        s_open = File_Selector(self.demo_frame, 'open')
        s_open.pack(pady=5, padx=10)
        s_save = File_Selector(self.demo_frame, 'save')
        s_save.pack(pady=5, padx=10)


##--------------------------------------------------------------------------
def demo(*av):
    """ function called by `index.py'"""
    d = Demo(False)
    d.demo_window.focus_set()


if __name__ == '__main__':
    d = Demo(True)
    d.demo_main_frame.mainloop()
I posted this entire demo on this sitenot sure where (it was over a year ago)
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020