Mengapa menggunakan kelas saat memprogram gui tkinter dengan python

19

Saya memprogram terutama dalam python dan telah memprogram beberapa GUI dengan Tkinter, setiap tutorial yang pernah saya lihat merekomendasikan mendefinisikan dan menggunakan kelas untuk GUI, tetapi GUI saya berjalan dengan sempurna menggunakan hanya prosedur, tanpa kelas.

Mengapa menggunakan kelas? Tampaknya dari sudut pandang saya hanya menjadi lapisan kompleksitas tambahan dan kode yang tidak perlu.

Devon Muraoka
sumber

Jawaban:

19

Mengapa menggunakan kelas? Karena itu membuat pekerjaan lebih mudah, dengan asumsi Anda tahu bagaimana melakukan pemrograman berorientasi objek, dan dengan asumsi Anda sedang menulis GUI non-sepele. Menggunakan objek memungkinkan Anda untuk dengan mudah membagi kode Anda menjadi unit modular yang mandiri, dan memodulasi kode Anda secara umum dianggap sebagai praktik terbaik.

Pemrograman GUI dengan mudah cocok dengan gaya berorientasi objek, karena GUI seluruhnya terdiri dari objek - label, tombol, bilah gulir, area teks, dll. Karena Anda sudah menggunakan objek, mengatur kode Anda menjadi objek yang lebih besar masuk akal . Bilah alat adalah objek, bilah status adalah objek, panel navigasi adalah objek, area utama adalah objek, setiap tab buku catatan adalah objek, dan sebagainya.

Bahkan ketika kode Anda tidak terlalu kompleks, dari sudut pandang yang lebih praktis itu memungkinkan Anda menentukan binding dan callback lebih awal dalam file daripada definisi fungsi yang Anda panggil, yang menurut saya masuk akal.

Misalnya, perhatikan contoh sederhana (dengan asumsi bahwa tkinter telah diimpor seperti import tkinter as tk(python3) atau import Tkinter as tk(python2):

def quit(event=None):
    sys.exit()
root = tk.Tk()
label = tk.Label(root, text="Hello, world")
label.pack()
label.bind("<1>", quit)
root.mainloop()

Bagi saya, aliran kode itu semuanya salah. Saya harus mendefinisikan metode berhenti sebelum saya referensi, dan pembuatan jendela root dan panggilan ke mainloop dipisahkan oleh semua kode lainnya.

Namun, dengan menggunakan kelas, saya dapat menulis kode dengan urutan yang lebih alami:

class MyWindow(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Hello, world")
        label.pack()
        label.bind("<1>", self.quit)
    def quit(self, event=None):
        sys.exit()

root = tk.Tk()
MyWindow(root).pack()
root.mainloop()

Bagian utama GUI berada tepat di atas file, dan kode pendukung ada di bawahnya. Sekarang, tentu saja, Anda dapat menggunakan fungsi untuk mencapai banyak hal yang sama. Namun menurut saya, kelas membuat semuanya lebih mudah.

Keuntungan lain adalah sekarang saya dapat dengan mudah mengubah jendela yang berisi tanpa harus mengubah apa pun tentang jendela "utama" (dan sebaliknya). Yaitu, saya dapat menambahkan batas, atau bagian baru yang lengkap ke GUI utama, tetapi saya tidak harus menyentuh satu baris kode pun di dalam MyWindow. Bandingkan dengan kode prosedural di mana Anda mungkin harus mengubah label.pack()pernyataan, dan pernyataan paket (atau kisi) semua widget lainnya di UI.

Semua yang dikatakan, bagaimanapun, menggunakan pendekatan berorientasi objek tidak perlu untuk menulis kode yang baik, bersih, dapat dipelihara. Ini bisa menjadi, tetapi juga dapat menyebabkan kode miskin. Pada akhirnya, pendekatan berorientasi objek hanyalah alat. Apakah Anda menggunakannya atau tidak, dan apakah Anda menggunakannya dengan benar atau tidak tergantung pada banyak faktor. Jadi mungkin sangat baik untuk Anda, dan untuk kode yang Anda tulis, gaya fungsional dapat diterima. Saya pikir Anda akan menemukan bahwa ketika program Anda menjadi lebih kompleks, pendekatan berorientasi objek akan membuatnya lebih mudah untuk mengatur dan memelihara kode Anda.

Bryan Oakley
sumber
Mengapa Anda menggunakan Frame dalam contoh kedua? Tidak bisakah Anda menghindarinya seperti yang Anda lakukan pada contoh pertama? Apakah ada rahasia di balik penggunaan Frame dengan kelas?
multigoodverse
2
Frame hanya untuk kenyamanan. Tidak ada rahasia untuk mewarisi dari Frame. Saya bisa saja mewarisi dari objectatau kelas lain, tetapi saya biasanya akhirnya membuat bingkai. Jika saya meletakkan semuanya dalam bingkai, masuk akal untuk membuat kelas menjadi bingkai. .
Bryan Oakley
1
Masuk akal, terima kasih! Juga, saya telah melihat orang lain menggunakan sendiri sebelum variabel, tetapi saya melihat Anda menggunakan sesuatu seperti label=tk.Label()bukan self.tk.Label(). Apakah itu pilihan gaya? Berikut ini adalah contoh menggunakan self: python-textbok.readthedocs.org/en/1.0/…
multigoodverse
1
@BryanOakley, saya kira Anda bermaksud menggunakan induk alih-alih root pada baris MyWindow berikut .__ init__: "label = tk.Label (root, text =" Hello, world ")"
user3885927
1
@ user3885927: ya! Wow, butuh hampir tiga tahun bagi seseorang untuk menyadari hal itu. Padahal, tidak parentlebih dari itu self, karena kelas itu sendiri adalah Frame. Terima kasih!
Bryan Oakley