Aplikasi pembuka foto dari Tkinter versi 6

BelajarPython - assalamualaikum wr. wb.

Jumpa lagi temen - temen.. Pada kesempatan kali ini, saya akan mengajak kalian untuk belajar membuat mini aplikasi dari tkinter.. Menggunakan library sederhana ini, saya akan mencoba untuk mengajak kalian berkereasi bersama hehe.. Walaupun fungsi nya tak akan mungkin sebagus aplikasi sejenis... Nah lalu aplikasi apa yang akan kita buat kali ini ? Langsung saja yuk kita simak sama - sama postingan kali ini...

Penjelasan umum Mini - Aplikasi yang akan di buat.

Pada postingan kali ini, saya akan mencoba untuk meng upgrade versi aplikasi pembuka foto yang telah saya posting sebelumnya... Yaitu versi ke lima.. Jika kalian belum atau ingin membacanya, kalian bisa KLIK DISINI.  Walaupun dengan tampilan seadanya dan kesederhanaan interface Tkinter, Saya tetap semangat untuk meningkatkan fitur mini aplikasi ini.. Semoga kalian juga demikian ya.. hehe

Pembuka foto versi kali ini merupakan versi yang ke enam.. Dimana pada versi kali ini, saya hanya akan mempermanis aplikasi ini saja... Karena, pada versi kali ini saya akan menambahkan sebuah ‘menu bar’ dan menu pilihan saat kita mengklik kanan pada kanvas... Jadi tidak ada fitur baru disini.. Melainkan hanya sebuah pemanis saja..

Dan perlu kalian ketahui, Aplikasi ini memiliki banyak versi yang tentu saja memiliki penambahan fitur di tiap versinya.. Dengan begitu, saya harap kalian dapat dengan mudah mempelajari code programnya.. Untuk membaca daftar isi atau rincian lengkap fitur dan pengembangan tiap versinya, KALIAN BISA KLIK DISINI YA temen - temen...

Rincian lengkap aplikasi Pembuka Foto Tkinter versi 6.0.

Selanjutnya saya akan memperkenalkan lebih dalam lagi mengenai aplikasi pembuka foto tkinter ini..  Oya perlu kalian ketahui, pada aplikasi kali ini, saya menggunakan library tambahan PILLOW atau PIL. Untuk menginstall library tersebut, kalian BISA KLIK DISINI.

Oke, Langsung saja yuk kita simak sama - sama rincian lengkap dari aplikasi pembuka foto tkinter yang akan saya bagi kan kali ini..


Nama: mn-Photoview 6.0
Versi: 6.0 | klik disini untuk membaca versi pertama.
Platform: Python 3.x
Modul: Tkinter dan PILLOW. Klik disini untuk menginstallnya.
Baris Code: kurang lebih 134 baris code program.
Terdiri dari: 1 class dan 21 metode.
Fitur: menubar dan menu klik kanan.
syarat menjalankan: install python 3.x dan PILLOW atau PIL, punya editor teks atau IDE.
Cara menjalankan: install python 3 dan PILLOW atau PIL, copy dan paste code program pada editor atau IDE, simpan dalam file python(ekstensi .py), lalu jalankan.


Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Code program untuk membuat aplikasi pembuka foto tkinter versi 6.0

Nah setelah kita mengenal aplikasi yang akan saya bagikan kali ini, maka selanjutnya kita akan langsung memasuki segmen yang paling penting pada postingan kali ini.. Yaitu membagikan code program dari mini aplikasi nya.. Langsung saja yuk kita simak sama - sama code programnya di bawah ini...

from tkinter import *
from PIL import Image
from PIL import ImageTk
from tkinter import filedialog
from tkinter import messagebox as mbox
from tkinter.messagebox import askokcancel
import webbrowser

class GUI(Frame):
    def __init__(self,root):
        Frame.__init__(self, root)
        self.frame = Frame(root,relief=SUNKEN)
        self.frameTombol=Frame(root, relief=SUNKEN)
        self.frameHapus=Frame(root, relief=SUNKEN)
        self.parent = root
        self.foto = StringVar()

        self.pertambahan = 0.03
        self.ukuran = DoubleVar()
        self.ukuran.set(1)
        self.isiKolom=StringVar()

        root.title('Phowo viewer - mn-belajarpython.blogspot.co.id')
        self.canvas = Canvas(self.frame, width=500, height=300, bg='white', xscrollcommand=self.xscrollbar.set,
                             yscrollcommand=self.yscrollbar.set)
        self.canvas.grid(row=0, column=0)

        self.buatCanvas()
        self.buatTombol()
        self.buatScrollBarr()
        self.buatMenuBar()
        self.buatMenuPopUp()

    def buatScrollBarr(self):
        self.xscrollbar = Scrollbar(self.frame, orient=HORIZONTAL)
        self.xscrollbar.grid(row=1, column=0, sticky=E+W)
        self.yscrollbar = Scrollbar(self.frame)
        self.yscrollbar.grid(row=0, column=1, sticky=N+S)

    def buatCanvas(self):
        try :
            pil_image = Image.open(self.foto.get())
            width_org, height_org = pil_image.size

            factor = self.ukuran.get()

            width = int(width_org * factor)
            height = int(height_org * factor)

            pil_image2 = pil_image.resize((width, height), Image.ANTIALIAS)
            self.img = ImageTk.PhotoImage(pil_image2)

            self.canvas.create_image(0,0,image=self.img)
        except:
            pass

        self.canvas.config(scrollregion=self.canvas.bbox(ALL))
        self.xscrollbar.config(command=self.canvas.xview)
        self.yscrollbar.config(command=self.canvas.yview)

        self.frame.pack()
        self._addMouseBindings()


    def gambarPasWindow(self, tinggi, lebar):

        try :
            pil_image = Image.open(self.foto.get())
            width_org, height_org = pil_image.size

            pil_image2 = pil_image.resize((lebar, tinggi), Image.ANTIALIAS)
            self.img = ImageTk.PhotoImage(pil_image2)

            self.canvas.create_image(0,0,image=self.img)
        except:
            pass

        self.canvas.config(scrollregion=self.canvas.bbox(ALL))
        self.xscrollbar.config(command=self.canvas.xview)
        self.yscrollbar.config(command=self.canvas.yview)

        self._addMouseBindings()

    def buatMenuBar(self):
        self.menubar = Menu(self.parent,bd=0)
        self.fileMenu = Menu(self.parent, tearoff=0)
        self.fileMenu.add_command(label="Open", command=self.perintahBuka)
        self.fileMenu.add_command(label="Exit", command=self.perintahKeluar)
        self.menubar.add_cascade(label="File", menu=self.fileMenu)

        self.menuEdit = Menu(self.parent, tearoff=0)
        self.menuEdit.add_command(label="zoom in", command=self.perintahPerbesar)
        self.menuEdit.add_command(label="zoom out", command=self.perintahPerkecil)
        self.menuEdit.add_separator()
        self.menuEdit.add_command(label="fit to window", command=self.perintahFitToWindow)
        self.menuEdit.add_command(label="normal", command=self.perintahNormal())
        self.menubar.add_cascade(label="Edit", menu=self.menuEdit)

        self.menuWeb = Menu(self.parent, tearoff=0)
        self.menuWeb.add_command(label="Go to Website", command=self.pergiKeWeb)
        self.menubar.add_cascade(label="Web", menu=self.menuWeb)

        self.menuAbout = Menu(self.parent, tearoff=0)
        self.menuAbout.add_command(label="Tentang aplikasi", command=self.about)
        self.menubar.add_cascade(label="About", menu=self.menuAbout)

        self.parent.config(menu=self.menubar)
        self.pack()



    def buatTombol(self):
        Button(self.frameTombol,relief='flat', text="open", command=self.perintahBuka).grid(row=0, column=0)
        Button(self.frameTombol,relief='flat', text="zoom in", command=self.perintahPerbesar).grid(row=0, column=1)
        Button(self.frameTombol,relief='flat', text="zoom out", command=self.perintahPerkecil).grid(row=0, column=2)
        Button(self.frameTombol,relief='flat', text="normal", command=self.perintahNormal).grid(row=0, column=3)
        Button(self.frameTombol,relief='flat', text="fit", command=self.perintahFitToWindow).grid(row=0, column=4)
        Entry(self.frameHapus, width=50, textvariable=self.isiKolom).grid(row=0, column=0)
        Button(self.frameHapus,relief='flat', text="hapus", command=self.perintahHapus).grid(row=0, column=1)
        self.frameHapus.pack()
        self.frameTombol.pack()

    def perintahBuka(self):
        tipeFile = (('image files', '*.jpg'), ('png files', '*.png'), ('all files', '*'))
        self.pembuka = filedialog.askopenfilename(filetypes=tipeFile)
        if self.pembuka :
            self.isiKolom.set(self.pembuka)
            self.foto.set(self.pembuka)
            self.buatCanvas()


    def perintahPerbesar(self):
        self.ukuran.set(self.ukuran.get() + self.pertambahan)
        self.buatCanvas()

    def perintahNormal(self):
        self.ukuran.set(1)
        self.buatCanvas()

    def perintahPerkecil(self):
        try :
            self.ukuran.set(self.ukuran.get() - self.pertambahan)
            self.buatCanvas()
        except :
            self.ukuran.set(0.01)
            self.buatCanvas()

    def perintahHapus(self):
        self.canvas.delete('all')
        self.foto.set('')
        self.isiKolom.set('')

    def perintahFitToWindow(self):
        lebar = self.canvas.winfo_width()
        tinggi = self.canvas.winfo_height()
        self.gambarPasWindow(tinggi, lebar)

    def pergiKeWeb(self):
        webbrowser.open_new(r"http://mn-belajarpython.blogspot.co.id")

    def about(self):
        mbox.showinfo("Tentang Aplikasi", "Aplikasi ini merupakan contoh aplikasi image viewer\n"
                                          "atau pembuka foto sederhana.\n"
                                          "namun, lebih dari itu, aplikasi sederhana ini bisa\n"
                                          "kalian gunakan untuk memperbesar gambar kalian hingga maksimal\n"
                                          "\ngimana ? menarikkan ?\n"
                                          "\nya semoga aplikasoi sederhana ini dapat bermanfaat bagi kalian.\n"
                                          "jangan lupa kunjungi blog saya untuk tutorial yang lain ya...\n"
                                          "\ndi mn-belajarpython.blogspot.co.id")
    def perintahKeluar(self):
        ans = askokcancel('Keluar', "anda yakin ingin keluar?")
        if ans: Frame.quit(self)

    def buatMenuPopUp(self):
        self.menu = Menu(self.parent, tearoff=0)
        self.menu.add_command(label="Zoom in", command=self.perintahPerbesar)
        self.menu.add_command(label="Zoom out", command=self.perintahPerkecil)
        self.menu.add_separator()
        self.menu.add_command(label="Fit to window", command=self.perintahFitToWindow)
        self.menu.add_command(label="Normal", command=self.perintahNormal)
        self.menu.add_command(label="Hapus", command=self.perintahHapus)
        self.menu.add_separator()
        self.menu.add_command(label="Go to Website", command=self.pergiKeWeb)

        self.parent.bind("", self.tampilkanMenu)
        self.pack()

    def tampilkanMenu(self, e):
        self.menu.post(e.x_root, e.y_root)


    def _addMouseBindings(self):
        # mouse wheel scroll
        self.canvas.bind('<4>', lambda event: self.canvas.yview('scroll', -1, 'units'))
        self.canvas.bind('<5>', lambda event: self.canvas.yview('scroll', 1, 'units'))


        # dragging canvas with mouse middle button
        self.canvas.bind("", self.__start_scroll)
        self.canvas.bind("", self.__update_scroll)
        self.canvas.bind("", self.__stop_scroll)

    def __start_scroll(self, event):
        # set the scrolling increment.
        # value of 0 is unlimited and very fast
        # set it to 1,2,3 or whatever to make it slower
        self.canvas.config(yscrollincrement=3)
        self.canvas.config(xscrollincrement=3)

        self._starting_drag_position = (event.x, event.y)

        self.canvas.config(cursor="fleur")

    def __update_scroll(self, event):
        deltaX = event.x - self._starting_drag_position[0]
        deltaY = event.y - self._starting_drag_position[1]

        self.canvas.xview('scroll', deltaX, 'units')
        self.canvas.yview('scroll', deltaY, 'units')

        self._starting_drag_position = (event.x, event.y)

    def __stop_scroll(self, event):
        # set scrolling speed back to 0, so that mouse scrolling
        # works as expected.
        self.canvas.config(xscrollincrement=0)
        self.canvas.config(yscrollincrement=0)

        self.canvas.config(cursor="")


root = Tk()
GUI(root)
root.mainloop()


Nah itu dia temen - temen code programnya.. Lalu seperti apa tampilannya ketika code program di atas saya Run atau di jalankan ? Biar tidak penasaran , Langsung saja yuk kita simak sama - sama contoh screenshoot dari aplikasi pembuka foto tkinter kali ini... Cek pada gambar di bawah ini ya temen - temen..




Nah itu dia temen - temen tampilan yang akan kita lihat pada versi yang ke enam kali ini... Dimana di atas kanvas sekarang sudah ada sebuah menubar yang ditunjuk oleh angka tersebut... Dan pada penunjuk no. 2, saat kita klik kanan pada mouse, maka akan tampil menu shortcut untuk menjalankan beberapa fungsi dari aplikasi kali ini...



Sekali lagi saya ingatkan ya... Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Penjelasan Code program untuk membuat Aplikasi Pembuka Foto Tkinter versi 6.0

Nah, setelah kita tau, code program dan tampilan aplikasi yang akan kita buat kali ini, maka  pada segmen ini saya akan menjelaskan baris demi baris dari code program diatas.. Hal ini saya lakukan dengan harapan dapat membantu proses pemahaman kalian nantinya.. Langsung saja yuk kita simak sama - sama penjelasannya di bawah ini...


from tkinter import *  //digunakan untu mengimport semua class yang ada di library tkinter
from PIL import Image  //digunakan untuk mengimport class “Image” dari Library “PIL”.
from PIL import ImageTk  //digunakan untuk mengimport class “ImageTk” dari librari PIL
from tkinter import filedialog  //digunakan untuk mengimport ‘filedialog’ dari library ‘tkinter’.
from tkinter import messagebox as mbox  //digunakan untuk mengimport ‘mssegebox’ dari librari tkinter dan di ubah namanya menjadi ‘mbox’ pada file python ini
from tkinter.messagebox import askokcancel   //digunakan untuk mengimport ‘askokcancel’ atau pertanyaan dari class ‘messegebo’ tkinter
import webbrowser  //digunakan untuk mengimport modul ‘webbrowser’ yang merupakan bawaan python


class GUI(Frame):  //digunakan untuk membuat class dengan nama ‘GUI’ yang akan digunakan untuk membuat pembuka foto nya.
    def __init__(self,root):  //digunakan untuk membuat sebuah konstruktor dari class ‘GUI’.
        Frame.__init__(self, root)
        self.frame = Frame(root,relief=SUNKEN)  //digunakan untuk membuat sebah frame utama yang akan digunakan untuk membuat frame utama. Dan disimpan ke dalam variabel ‘frame’.
        self.frameTombol=Frame(root, relief=SUNKEN)  //digunakan untuk membuat sebuah frame untuk tempat tombol. Dan disimpan ke dalam variabel ‘frameTombol’.
        self.frameHapus=Frame(root, relief=SUNKEN)  //digunakan untuk membuat sebuah frame untuk tempat tombol hapus dan penampil lokasi gambar. Dan disimpan ke dalam variabel ‘frameTombol’.
        self.foto = StringVar()  //digunakan untuk membuat variabel dengan nama ‘foto’ yang menampung class ‘StringVar’ dan akan digunakan untuk menampung path atau lokasi foto.

       self.pertambahan = 0.03  //mendefinisikan variabel dengan nama ‘pertambahan’ dengan nilai ‘0.03’ yang akan digunakan sebagai angka perbesaran dan perkecilan foto nantinya.
        self.ukuran = DoubleVar()  //digunakan untuk membuat variabel dengan nama ‘ukuran’ yang menampung class ‘DoubleVar’ dan akan digunakan untuk menampung nilai perbesaran foto.
        self.ukuran.set(1)  //digunakan untuk mengisi variabel ‘ukuran’ dengan nilai 1.
        self.isiKolom=StringVar()  //digunakan untuk membuat variabel dengan nama ‘isiKolom’ yang menampung class ‘StringVar’ dan akan digunakan untuk menampung lokasi gambar.

        root.title('Phowo viewer - mn-belajarpython.blogspot.co.id')  //digunakan untuk mengubah judul window.

            self.canvas = Canvas(self.frame, width=750, height=450, bg='white', xscrollcommand=self.xscrollbar.set, yscrollcommand=self.yscrollbar.set)  //digunakan untuk membuat sebuah kanvas. Dan disimpan ke dalam variabel ‘canvas’. Dengan parameter “frame” sebagai tempat penempatan di window. Lebar sebesar 750 dan tinggi 450. Dengan background(bg=white) adalah putih. Dan menghubungkan slide kanan dan kiri dengan scrollbar yang ada pada variabel ‘xscrollbar’. Dan perintah slide atas bawah dihubungkan dengan scrollbar yang ada di dalam variabel ‘yscrollbar’.
            self.canvas.grid(row=0, column=0)  //digunakan untuk memasukkan ‘canvas’ ke dalam window.

        self.buatScrollBarr()  //digunakan untuk memanggil atau menjalankan sebuah metode dengan nama ‘buatScrollBar’.
        self.buatCanvas()  //digunakan untuk memanggil atau menjalankan sebuah metode dengan nama ‘buatCanvas’.
        self.buatTombol()  //digunakan untuk memanggil atau menjalankan sebuah metode dengan nama ‘buatTombol’.
        self.buatMenuBar()  //digunakan untuk memanggil atau menjalankan sebuah metode dengan nama ‘buatMenuBar’.
        self.buatMenuPopUp()  //digunakan untuk memanggil atau menjalankan sebuah metode dengan nama ‘buatMenuPopUp’.

    def buatScrollBarr(self):  //digunakan untuk membuat metode dengan nama ‘buatScrollBar’ yang tentu saja untuk membuat scrollbar.
        self.xscrollbar = Scrollbar(self.frame, orient=HORIZONTAL)  //digunakan untuk membuat sebuah scrollbar  horizontal. Yang disimpan ke dalam variabel ‘xscrollbar’.
        self.xscrollbar.grid(row=1, column=0, sticky=E+W)  //digunakan untuk memasukkan scrollbar yang ada di dalam variabel ‘xscrollbar’ kedalam window.
        self.yscrollbar = Scrollbar(self.frame)  //digunakan untuk membuat sebuah scrollbar  vertical. Yang disimpan ke dalam variabel ‘yscrollbar’.
        self.yscrollbar.grid(row=0, column=1, sticky=N+S)  //digunakan untuk memasukkan scrollbar yang ada di dalam variabel ‘yscrollbar’ kedalam window.

    def buatCanvas(self):  //digunakan untuk membua metode dengan nama ‘buatCanvas’. Yang akan digunakan untuk membuat canvas dan menampilkan gambar.
        try :  //digunakan untuk mencoba menjalankan beberapa code program.
            pil_image = Image.open(self.foto.get())  //digunakan untuk membuka sebuah gambar yang lokasinya ada di dalam variabel ‘foto’. Dan disimpan ke dalam variabel ‘pil_image’.
            width_org, height_org = pil_image.size  //digunakan untuk mendapatkan ukuran gambar yang akan dibuka. Dengan nilai tinggi nya akan di tampung ke dalam variabel ‘height_org’ dan lebarnya akan di tampung ke dalam variabel ‘width_org’.

            factor = self.ukuran.get()  //digunakan untuk mendapatkan nilai yang ada di variabel ‘ukuran’. Dan disimpan ke dalam variabel ‘factor’.

            width = int(width_org * factor)  //digunakan untuk mengalikan ukuran lebar asli foto yang ada di variabel ‘width_org’ dengan nilai pembesaran atau perkecilan yang ada pada variabel ‘factor’ dan di konversi menjadi ‘int’. Dan disimpan ke dalam variabel ‘width’.
            height = int(height_org * factor)  //digunakan untuk mengalikan ukuran tinggi asli foto yang ada di variabel ‘height_org’ dengan nilai pembesaran atau perkecilan yang ada pada variabel ‘factor’ dan di konversi menjadi ‘int’. Dan disimpan ke dalam variabel ‘height’.

            pil_image2 = pil_image.resize((width, height), Image.ANTIALIAS)  //digunakanuntuk mengubah ukuran foto dengan nilai yang ada di variabel ‘width’ dan ‘height’ yang telah di definisikan sebelumnya. Dan disimpan ke dalam variabel ‘pil_image2’.
            self.img = ImageTk.PhotoImage(pil_image2)  //digunakan untuk memanggil metode dengan nama ‘PhotoImage’ yang ada di class ‘ImageTk’ dengan memasukkan variabel ‘pil_image’ sebagai parameter. Dan disimpan ke dalam variabel ‘img’.

            self.canvas.create_image(0,0,image=self.img)  //digunakan untuk memasukkan gambar yang telah dibuka ke dalam canvas.
        except:  //digunakan untuk menjalankan beberapa code program ketika pada block code ‘try’ terdapat eror.
            print("foto atau folder yang anda masukkan tidak benar. mohon koreksi ulang")  //digunakan untuk mencetak teks atau pesan error.

        self.canvas.config(scrollregion=self.canvas.bbox(ALL))  //digunakan untuk meng aktifkan scrollbar pada canvas.
        self.xscrollbar.config(command=self.canvas.xview)  //digunakan untuk menghubungkan slide kanan kiri dengan scrollbar yang ada di variabel ‘xscrollbar’
        self.yscrollbar.config(command=self.canvas.yview)  //digunakan untuk menghubungkan slide atas bawah dengan scrollbar yang ada di variabel ‘yscrollbar’

        self.frame.pack()  //digunakan untuk memasukkan frame utama kedalam window..

        self._addMouseBindings()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘_addMouseBindings’

    def gambarPasWindow(self, tinggi, lebar):  //digunakan untuk membuat metode dengan nama ‘gambarPasWindow’ yang akan digunakan untuk membuat gambar agar pas dengan lebar kanvas. Dengan membuatuhkan dua parameter tambahan. Yaitu ‘tinggi’ dan ‘lebar’ untuk mengetahui ukuran kanvas.

        try :  //digunakan untuk mencoba beberapa code program
            pil_image = Image.open(self.foto.get())  //digunakan untuk membuka foto ulang. Dengan mengambil lokasi fotonya di vaiabel ‘foto’. Lalu disimpan ke dalam variabel ‘pil_image’.
            width_org, height_org = pil_image.size  //digunakan untuk mendapatkan ukuran gambar. Nilai lebar nya di tampung ke dalam variabel ‘width_org’ dan tinggi nya di masukkan ke dalam variabel ‘height_org’.

            pil_image2 = pil_image.resize((lebar, tinggi), Image.ANTIALIAS)  //digunakan untuk mengubah ukuran gambar sesuai dengan parameter yang sudah dimasukkan melalui parameter variabel ‘lebar’ dan ‘tinggi’.
            self.img = ImageTk.PhotoImage(pil_image2)  //digunakan mengkonversi gambar agar bisa dimasukkan ke dalam kanvas. Lalu hasilnya ditampung ke dalam variabel ‘img’

            self.canvas.create_image(0,0,image=self.img)  //digunakan untuk memasukkan gambar yang sudah kita proses tadi ke dalam kanvas.
        except:  //digunakan untuk menjalankan code program ketika code program yang ada di block ‘try’ terdapat error.
            pass  //digunakan untuk tidak melakukan apa apa.

        self.canvas.config(scrollregion=self.canvas.bbox(ALL))  //digunakan untuk meng aktifkan scrollbar pada canvas.
        self.xscrollbar.config(command=self.canvas.xview)  //digunakan untuk menghubungkan slide kanan kiri dengan scrollbar yang ada di variabel ‘xscrollbar’
        self.yscrollbar.config(command=self.canvas.yview)  //digunakan untuk menghubungkan slide atas bawah dengan scrollbar yang ada di variabel ‘yscrollbar’
        self._addMouseBindings()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘_addMouseBindings’

    def buatMenuBar(self):  //digunakan untuk membuat metode dengan nama ‘buatMenuBar’ yang akan digunkan untuk membuat menu bar
        self.menubar = Menu(self.parent,bd=0)  //digunakan untuk membuat menu dengan tanpa border (bd=0) yang kemudian dimasukkan ke dalam variabel ‘menubar’.
        self.fileMenu = Menu(self.parent, tearoff=0)  //digunakan untuk membuat menu baru dan disimpan ke dalam variabel ‘fileMenu’. Parameter ‘tearoff=0’ digunakan agar sub menu tidak dapat dipindah. Silahkan hapus untuk melihat perbedaannya
        self.fileMenu.add_command(label="Open", command=self.perintahBuka)  //digunakan untuk membuat sub menu baru dengan nama ‘open’ dan akan menjalankan metode dengan nama ‘perintahBuka’ ketika di klik
        self.fileMenu.add_command(label="Exit", command=self.perintahKeluar)  //digunakan untuk membuat sub menu baru dengan nama ‘exit’ dan akan menjalankan metode dengan nama ‘perintahKeluar’ ketika di klik
        self.menubar.add_cascade(label="File", menu=self.fileMenu)  //digunakan untuk memasukkan menu yang telah di buat yaitu di dalam variabel ‘fileMenu’ ke dalam menubar. Dan diberi nama ‘File’.

        self.menuEdit = Menu(self.parent, tearoff=0)  //digunakan untuk membuat menu baru dan disimpan ke dalam variabel ‘menuEdit’. Parameter ‘tearoff=0’ digunakan agar sub menu tidak dapat dipindah. Silahkan hapus untuk melihat perbedaannya
        self.menuEdit.add_command(label="zoom in", command=self.perintahPerbesar)  //digunakan untuk membuat sub menu baru dengan nama ‘zoom in’ dan akan menjalankan metode dengan nama ‘perintahPerbesar’ ketika di klik
        self.menuEdit.add_command(label="zoom out", command=self.perintahPerkecil)  //digunakan untuk membuat sub menu baru dengan nama ‘zoom out’ dan akan menjalankan metode dengan nama ‘perintahPerkecil’ ketika di klik
        self.menuEdit.add_separator()  //digunakan untuk memberikan garis pembatas
        self.menuEdit.add_command(label="fit to window", command=self.perintahFitToWindow)  //digunakan untuk membuat sub menu baru dengan nama ‘fit to window’ dan akan menjalankan metode dengan nama ‘perintahFitToWindow’ ketika di klik
        self.menuEdit.add_command(label="normal", command=self.perintahNormal())  //digunakan untuk membuat sub menu baru dengan nama ‘normal’ dan akan menjalankan metode dengan nama ‘perintahNormal’ ketika di klik
        self.menubar.add_cascade(label="Edit", menu=self.menuEdit)  //digunakan untuk memasukkan menu yang telah di buat yaitu di dalam variabel ‘menuEdit’ ke dalam menubar. Dan diberi nama ‘Edit’.

        self.menuWeb = Menu(self.parent, tearoff=0)  //digunakan untuk membuat menu baru dan disimpan ke dalam variabel ‘menuWeb’. Parameter ‘tearoff=0’ digunakan agar sub menu tidak dapat dipindah. Silahkan hapus untuk melihat perbedaannya
        self.menuWeb.add_command(label="Go to Website", command=self.pergiKeWeb)  //digunakan untuk membuat sub menu baru dengan nama ‘go to website’ dan akan menjalankan metode dengan nama ‘pergiKeWeb’ ketika di klik
        self.menubar.add_cascade(label="Web", menu=self.menuWeb)  //digunakan untuk memasukkan menu yang telah di buat yaitu di dalam variabel ‘menuWeb’ ke dalam menubar. Dan diberi nama ‘Web’.


        self.menuAbout = Menu(self.parent, tearoff=0)  //digunakan untuk membuat menu baru dan disimpan ke dalam variabel ‘menuAbout’. Parameter ‘tearoff=0’ digunakan agar sub menu tidak dapat dipindah. Silahkan hapus untuk melihat perbedaannya
        self.menuAbout.add_command(label="Tentang aplikasi", command=self.about)  //digunakan untuk membuat sub menu baru dengan nama ‘Tentang aplikasi’ dan akan menjalankan metode dengan nama ‘about’ ketika di klik
        self.menubar.add_cascade(label="About", menu=self.menuAbout)  //digunakan untuk memasukkan menu yang telah di buat yaitu di dalam variabel ‘menuAbout’ ke dalam menubar. Dan diberi nama ‘About’.

        self.parent.config(menu=self.menubar)  //digunakan untuk memasukkan menu yang ada di dalam variabel ‘menubar’ kedalam window sebagai menubar
        self.pack()  //digunakan untuk memasukkan class ini yang menurunkan sifat (inheritence) class ‘frame’ ke dalam window

    def buatTombol(self):  //digunakan untuk membuat metode dengan nama ‘buatTombol’ yang akan digunakan untuk membuat tombol.
        Button(self.frameTombol,relief='flat', text="open", command=self.perintahBuka).grid(row=0, column=0)  //digunakan untuk membuat tombol dengan parameter ‘self.frameTombol’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameTombol’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=open” merupakan teks tombolnya. “Command=self.perintahBuka” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahBuka’ ketika tombol diklik.
        Button(self.frameTombol,relief='flat', text="zoom in", command=self.perintahPerbesar).grid(row=0, column=1)  //digunakan untuk membuat tombol dengan parameter ‘self.frameTombol’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameTombol’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=zoom in” merupakan teks tombolnya. “Command=self.perintahPerbesar” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahPerbesar’ ketika tombol diklik. Lalu di masukkan kedalam frame yang ada di variabel ‘frameTombol’ yang menggunakan grid layout. Dengan posisi baris 0 dan kolom 1.
        Button(self.frameTombol,relief='flat', text="zoom out", command=self.perintahPerkecil).grid(row=0, column=2)  //digunakan untuk membuat tombol dengan parameter ‘self.frameTombol’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameTombol’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=zoom out” merupakan teks tombolnya. “Command=self.perintahPerkecil” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahPerkecil’ ketika tombol diklik. Lalu di masukkan kedalam frame yang ada di variabel ‘frameTombol’ yang menggunakan grid layout. Dengan posisi baris 0 dan kolom 2.
        Button(self.frameTombol,relief='flat', text="normal", command=self.perintahNormal).grid(row=0, column=3)  //digunakan untuk membuat tombol dengan parameter ‘self.frameTombol’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameTombol’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=normal” merupakan teks tombolnya. “Command=self.perintahNormal” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahNormal’ ketika tombol diklik. Lalu di masukkan kedalam frame yang ada di variabel ‘frameTombol’ yang menggunakan grid layout. Dengan posisi baris 0 dan kolom 3.
        Button(self.frameTombol,relief='flat', text="fit", command=self.perintahFitToWindow).grid(row=0, column=4)  //digunakan untuk membuat tombol dengan parameter ‘self.frameTombol’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameTombol’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=fit” merupakan teks tombolnya. “Command=self.perintahFitToWindow” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahFitToWindow’ ketika tombol diklik. Lalu di masukkan kedalam frame yang ada di variabel ‘frameTombol’ yang menggunakan grid layout. Dengan posisi baris 0 dan kolom 4.
        Entry(self.frameHapus, width=50, textvariable=self.isiKolom).grid(row=0, column=0)  //digunakan untuk membuat kolom teks yang akan di tempatkan di frame yang ada di variabel ‘frameHapus’. Dengan lebar / panjang ‘50’. Dan isi teks yang ada di variabel ‘isiKolom. Dan dimasukkan ke dalam frame posisi baris 0 dan kolom 0.
        Button(self.frameHapus,relief='flat', text="hapus", command=self.perintahHapus).grid(row=0, column=1)  //digunakan untuk membuat tombol dengan parameter ‘self.frameHapus’ yang artinya tombol tersebut akan di tempatkan di frame yang ada di variabel ‘frameHapus’. “relief=flat” digunakan agar tombol tidak memiliki garis. Sehingga hanya akan tampil teks saja. “text=hapus” merupakan teks tombolnya. “Command=self.perintahHapus” merupakan perintah yang akan menjalankan metode dengan nama ‘perintahHapus’ ketika tombol diklik. Lalu di masukkan kedalam frame yang ada di variabel ‘frameTombol’ yang menggunakan grid layout. Dengan posisi baris 0 dan kolom 1.
        self.frameHapus.pack()  //digunakan untuk memasukkan frame yang di variabel ‘frameHapus’ ke dalam  window
        self.frameTombol.pack() //digunakan untuk memasukkan frame yang ada pada variabel ‘frameTombol’ ke dalam window.

    def perintahBuka(self):  //digunakan untuk membuat metode dengan nama ‘perintahBuka’ yang akan dijalankan ketika tombol ‘open’ di klik. Dan juga digunakan untuk mencari file foto yang akan di tampilkan.
        tipeFile = (('image files', '*.jpg'), ('png files', '*.png'), ('all files', '*'))  //digunakan untuk mendefinisikan tipe - tipe file apa saja yang akan di tampilkan saat mencari file. Dan disimpan kedalam variabel ‘tipeFile’.
        self.pembuka = filedialog.askopenfilename(filetypes=tipeFile)  //digunakan untuk menampilkan file dialog yang akan digunakan untuk mencari file foto. Dan ketika user memilih, maka path atau alamatnya akan disimpan ke dalam variabel ‘pembuka’. Dan memasukkan tipe file yang ada di variabel ‘tipeFile’.
        if self.pembuka :  //digunakan untuk mengecek apakah variabel ‘pembuka’ tidak kosong. Yang artinya mengecek apakah user memilih file.
            self.foto.set(self.pembuka)  //digunakan untuk mengubah nilai variabel ‘foto’ menjadi alamat / path foto atau gambar yang sudah di pilih oleh user yang disimpan kedalamvariabel ‘pembuka’.
            self.buatCanvas()  //digunakan untuk menjalankan metode dengan nama ‘buatCanvas’.

    def perintahPerbesar(self):  //digunakan untuk membuat metode dengan nama ‘perintahPerbesar’ yang tentu saja dijalankan untuk memperbesar foto atau gambar yang ditampilkan.
        self.ukuran.set(self.ukuran.get() + self.pertambahan)  //digunakan untuk menambah nilai yang ada di variabel ‘ukuran’ dengan nilai yang ada di variabel ‘pertambahan’ dan dimasukkan kembali kedalam variabel ‘ukuran’.
        self.buatCanvas()  //digunakan untuk menjalankan metode dengan nama ‘buatCanvas’.

    def perintahNormal(self):  //digunakan untuk membuat metode dengan nama ‘perintahNormal’ yang akan digunakan untuk menormalkan ukuran gambar.
        self.ukuran.set(1)  //digunakan untuk mengubah nilai variabel dengan nama ‘ukuran’ menjadi 1.
        self.buatCanvas()  //digunakan untuk menjalankan metode dengan nama ‘buatCanvas’

    def perintahPerkecil(self):  //digunakan untuk membuat metode dengan nama ‘perintahPerkecil’ yang akan dijalankan ketika akan memperkecil foto.
        try :  //digunakan untuk mencoba beberapa code program.
            self.ukuran.set(self.ukuran.get() - self.pertambahan)  //digunakan untuk mengutangi nilai yang ada di variabel ‘ukuran’ dengan nilai yang ada di variabel ‘pertambahan’ dan dimasukkan kembali kedalam variabel ‘ukuran’.
            self.buatCanvas() //digunakan untuk menjalankan metode dengan nama ‘buatCanvas’.
        except :  //digunakan untuk menjalankan beberapa code program ketika program di block ‘try’ ada eror.
            self.ukuran.set(0.01)  //digunakan untuk mengubah nilai variabel ukuran menjadi ‘0.01’.
            self.buatCanvas()    //digunakan untuk menjalankan metode dengan nama ‘buatCanvas’.

    def perintahHapus(self):  //digunakan untuk membuat metode dengan nama ‘perintahHapus’ yang akan didungakn untuk menghapus gambar di kanvas.
        self.canvas.delete('all')  //digunakanuntuk menghapus semua objek yang ada di kanvas. Termasuk gambar yang sedang di tampilkan disana.
        self.foto.set('')  //digunakan untuk mengubah nilai variabel ‘foto’ menjadi kosong. Yang artinya menghapus alamat gambar yang telah dibuka sebelumnya.
        self.isiKolom.set('')  //digunakan untuk mengosongkan isi kolom yang menampilkan lokasi gambar pada window.

    def perintahFitToWindow(self):  //digunakan untuk membuat metode dengan nama ‘perintaFitToWindow’ yang akan didungakn untuk mengepaskan gambar dengan ukuran kanvas.
        lebar = self.canvas.winfo_width()  //digunakan untuk mendapatkan lebar kanvas. Kemudian di tampung ke dalam variabel ‘lebar’
        tinggi = self.canvas.winfo_height()  //digunakan untuk mendapatkan tinggi kanvas. Kemudian di tampung ke dalam variabel ‘tinggi’
        self.gambarPasWindow(tinggi, lebar)   //digunakan untuk memanggil metode dengan nama ‘gambarPasWindow’ dengan memasukkan nilai variabel ‘tinggi’ dan ‘lebar’ sebagai parameter.

    def pergiKeWeb(self):  //digunakan untuk membuat metode dengan nama ‘pergiKeWeb’.
        webbrowser.open_new(r"http://mn-belajarpython.blogspot.co.id")  //digunakan untuk pergi ke web dengan membuka browser default dan pergi ke blog ini.. hehe

    def about(self):  //digunakan untuk membuat metode dengan nama ‘about’ yang akan menampilkan pesan informasi tentang aplikasi ini.
        mbox.showinfo("Tentang Aplikasi", "Aplikasi ini merupakan contoh aplikasi image viewer\n"
                                          "atau pembuka foto sederhana.\n"
                                          "namun, lebih dari itu, aplikasi sederhana ini bisa\n"
                                          "kalian gunakan untuk memperbesar gambar kalian hingga maksimal\n"
                                          "\ngimana ? menarikkan ?\n"
                                          "\nya semoga aplikasoi sederhana ini dapat bermanfaat bagi kalian.\n"
                                          "jangan lupa kunjungi blog saya untuk tutorial yang lain ya...\n"
                                          "\ndi mn-belajarpython.blogspot.co.id")

  //kumpulan code diatas digunakan untuk menampilkan pesan - pesan untuk menyampaikan tentang aplikasi ini

    def perintahKeluar(self):  //digunakan untuk membuat metode ‘perintahKeluar’ untuk menanyakan keluar atau batal
        ans = askokcancel('Keluar', "anda yakin ingin keluar?")  //digunakan untuk menanyakan kotak konfirmasi yang menanyakan apakah ingin keluar atau batal. Kemudian jawaban nya ditampung kedalam variabel ‘ans’.  Dan nilainya hanya dua yaitu ‘True’ jika di klik ‘ok’ dan ‘False’ jika ‘cancel’ di klik.
        if ans: Frame.quit(self)  //digunakan untuk mengecek apakah nilai variabel ‘ans’ apakah bernilai ‘True’. Dan menutup aplikasi jika itu benar.

    def buatMenuPopUp(self):  //digunakan untuk membuat metode dengan nama ‘buatMenuPopUp’. Yang akan digunakan untuk menampilkan menu klik kanan
        self.menu = Menu(self.parent, tearoff=0)  //digunakan untuk membuat menu baru yang disimpan ke dalam variabel ‘menu’ dengan parameter ‘tearoff=0’ agar tidak dapat dipindah pindah menunya. 
        self.menu.add_command(label="Zoom in", command=self.perintahPerbesar)  //digunakan untuk membuat sub menu baru dengan nama ‘Zoom In’ dan akan menjalankan metode dengan nama ‘perintahPerbesar’ ketika di klik
        self.menu.add_command(label="Zoom out", command=self.perintahPerkecil)  //digunakan untuk membuat sub menu baru dengan nama ‘Zoom out’ dan akan menjalankan metode dengan nama ‘perintahPerkecil’ ketika di klik
        self.menu.add_separator()  //digunakan untuk membuat garis pembatas
        self.menu.add_command(label="Fit to window", command=self.perintahFitToWindow)  //digunakan untuk membuat sub menu baru dengan nama ‘Fit to window’ dan akan menjalankan metode dengan nama ‘PerintahFitToWindow’ ketika di klik
        self.menu.add_command(label="Normal", command=self.perintahNormal)  //digunakan untuk membuat sub menu baru dengan nama ‘Normal’ dan akan menjalankan metode dengan nama ‘perintahNormal’ ketika di klik
        self.menu.add_command(label="Hapus", command=self.perintahHapus)  //digunakan untuk membuat sub menu baru dengan nama ‘Hapus’ dan akan menjalankan metode dengan nama ‘perintahHapus’ ketika di klik
        self.menu.add_separator()  //digunakan untuk membuat garis pembatas
        self.menu.add_command(label="Go to Website", command=self.pergiKeWeb)  //digunakan untuk membuat sub menu baru dengan nama ‘Go to Website’ dan akan menjalankan metode dengan nama ‘pergiKeWeb’ ketika di klik

        self.parent.bind("<Button-3>", self.tampilkanMenu)  //digunakan untuk membuat canvas menjalankan metode dengan nama ‘tampilkanMenu’ ketika di klik kanan.
        self.pack()  //digunakan untuk memasukkan class ini yang menurunkan sifat (inheritence) class ‘frame’ ke dalam window

    def tampilkanMenu(self, e):  //digunakan untuk membuat metode dengan nama ‘tampilkanMenu’ yang akan digunakan untuk menampilkan menu ketika di klik kanan pada kanvas. Dengan variabel parameter ‘e’ untuk mengetahui detail kursor
        self.menu.post(e.x_root, e.y_root)  //digunakan untuk  menampilkan menu klik kanan yang ditampung kedalam variabel ‘menu’ sebelumnya. Dan ditampilkan pada koordinat kursor terkini dengan mendapatkan nilainya melalui ‘e.x_root’ dan ‘e.y_root’.

    def _addMouseBindings(self):  //digunakan untuk membuat metode dengan nama ‘_addMouseBindings’ untuk mengaktifkan fungsi scroll
        # mouse wheel scroll  //komentar
        self.canvas.bind('<4>', lambda event: self.canvas.yview('scroll', -1, 'units'))  //digunakan untuk membuat canvas untuk menerima fungsi scroll. Dengan memberikan event.
        self.canvas.bind('<5>', lambda event: self.canvas.yview('scroll', 1, 'units'))  //digunakan untuk membuat canvas untuk menerima fungsi scroll. Dengan memberikan event.


        # dragging canvas with mouse middle button  //komentar
        self.canvas.bind("<Button-2>", self.__start_scroll)  //digunakan untuk menjalankan metode dengan nama ‘_start_scroll’ ketika scroll pada mous di drag
        self.canvas.bind("<B2-Motion>", self.__update_scroll)  //digunakan untuk menjalankan metode dengan nama ‘_update_scroll’ ketika scroll mouse di jalankan
        self.canvas.bind("<ButtonRelease-2>", self.__stop_scroll)  //digunakan untuk menjalankan metode dengan nama ‘_stop_scroll’ ketika scroll pada mouse berhenti ditekan atau di putar.

    def __start_scroll(self, event):  //digunakan untuk membuat metode dengan nama ’_start_scroll’ untuk memulai scroll
        # set the scrolling increment.  //komentar
        # value of 0 is unlimited and very fast  //komentar
        # set it to 1,2,3 or whatever to make it slower  //komentar
        self.canvas.config(yscrollincrement=3)  //digunakan untuk memasukkan nilai 3 ke parameter dengan variabel ‘yscrollincrement’
        self.canvas.config(xscrollincrement=3)  //digunakan untuk memasukkan nilai 3 ke parameter dengan variabel ‘xscrollincrement’

        self._starting_drag_position = (event.x, event.y)  //digunakan untuk membuat variabel tuple dengan nama ‘_starting_drag_position’ dengan memasukkan lokasi kursor. Yaitu ‘event.x’ dan ‘event.y’ sebagai isi atau nilai.

        self.canvas.config(cursor="fleur")  //digunakan untuk mengubah nilai parameter dengan variabel ‘cursor menjadi ‘fleur’.

    def __update_scroll(self, event):  //diguanakn untuk membuat metode dengan nama  ‘_update_scroll’ yang akan di jalankan untuk men scroll kanvas
        deltaX = event.x - self._starting_drag_position[0]  //digunakan uuntuk mengambil nilai pertama pada variabel ‘starting_drag_position’ dan ditampung kedalam variabel ‘deltaX’ 
        deltaY = event.y - self._starting_drag_position[1]  //digunakan uuntuk mengambil nilai kedua pada variabel ‘starting_drag_position’ dan ditampung kedalam variabel ‘deltaY’

        self.canvas.xview('scroll', deltaX, 'units')  //digunakan untuk menscroll kanvas dengan memasukkan nilai dalam variabel ‘deltaX’ sebagai parameter.
        self.canvas.yview('scroll', deltaY, 'units')  //digunakan untuk menscroll kanvas dengan memasukkan nilai dalam variabel ‘deltaY’ sebagai parameter.

        self._starting_drag_position = (event.x, event.y)  //digunakan untuk membuat variabel tuple dengan nama ‘_starting_drag_position’ dengan memasukkan lokasi kursor. Yaitu ‘event.x’ dan ‘event.y’ sebagai isi atau nilai.

    def __stop_scroll(self, event):  //digunaka untuk membuat metode dengan nama ‘_stop_scroll’ yang akan dijalankan ketika scroll berakhir.
        # set scrolling speed back to 0, so that mouse scrolling  //komentar
        # works as expected.  //komentar
        self.canvas.config(xscrollincrement=0)  //digunakan untuk mengosongkan nilai perpindahan scroll kanvas. Atau menghentikan proses scroll
        self.canvas.config(yscrollincrement=0)    //digunakan untuk mengosongkan nilai perpindahan scroll kanvas. Atau menghentikan proses scroll

        self.canvas.config(cursor="")  //digunakan untuk mengubah nilai parameter dengan variabel ‘cursor menjadi “” atau string kosong.

root = Tk()  //dkgunakan untuk memanggil window tkinter. Dan disimpan kedalam variabel ‘root’.
a = GUI(root)  //digunakan untuk memanggil class dengan nama ‘GUI’. Dengan memasukkan ‘root’ sebagai parameter. Dan disimpan ke dalam variabel ‘a’.
a.buatCanvas()  //digunakan untuk memanggil metode dengan nama ‘buatCanvas’. Yang ada di dalam class ‘GUI’.

root.mainloop()  //digunakan untuk membuat window tidak langsung close otomatis saat di jalankan.


Nah itu dia temen - temen penjelasan saya mengenai code program diatas... Saya harap dapat membantu kalian untuk memahami code program yang sudah saya bagikan di atas ya... Namun bila ada yang kurang jelas dari penjelasan di atas, kalian bisa menanyakannya langsung lewat komentar atau laman hubungi kami ya....

Terakhir kalinya saya ingatkan ya... Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...



Oke sekian dulu postingan saya kali ini... Terimakasih sudah membaca postingan ini dan Sampai jumpa di postingan saya yang lainnya.. mohon maaf atas kesalahan penulisan disana sini serta kesalahan penulisan yang ada... Mohon dimaklumi saja yaa... Karena saya juga manusia.. Oke terimakasih..

Wassalamualaikum wr. wb.
Previous
Next Post »
Thanks for your comment