Program latih sejauh ini berjalan dari atas ke bawah, mencetak hasil, lalu berhenti. Pengelola daftar tugas bekerja secara berbeda: program harus tetap hidup, menampilkan menu, menunggu perintah pengguna, dan mengulang proses tersebut sampai pengguna memilih keluar. Pada bagian ini kita membangun kerangka loop tersebut sekaligus menetapkan bentuk data tugas yang akan dipakai sampai akhir proyek.
Bentuk Data Tugas #
Satu tugas kita wakili dengan satu dictionary berisi tiga kunci:
| Kunci | Isi | Contoh |
|---|---|---|
id | nomor unik bertipe int | 1 |
judul | nama tugas bertipe str | "Belajar Python dasar" |
selesai | status pengerjaan bertipe bool | False |
Seluruh tugas disimpan dalam satu list yang menjadi state program — ingatan yang dibawa dari satu putaran menu ke putaran berikutnya. Perhatikan dua sifat penting dictionary di sini:
>>> daftar_tugas = []
>>> tugas_baru = {"id": 1, "judul": "Belajar Python dasar", "selesai": False}
>>> daftar_tugas.append(tugas_baru)
>>> daftar_tugas
[{'id': 1, 'judul': 'Belajar Python dasar', 'selesai': False}]
>>> tugas_baru["selesai"] = True
>>> daftar_tugas[0]["selesai"]
TruePertama, kunci yang bernama membuat kode terbaca sebagai kalimat: tugas["judul"] jelas maksudnya, berbeda dengan menghafal posisi indeks seperti pada tuple. Kedua, dictionary bersifat mutable: mengubah tugas_baru["selesai"] terlihat langsung dari dalam list karena keduanya menunjuk object yang sama — materi Memahami Object dan Reference menjelaskan mekanisme ini. Bentuk {id, judul, selesai} juga sengaja dipilih karena identik dengan struktur JSON yang akan kita tulis ke berkas pada Bagian 3.
Program Lengkap #
Berikut seluruh isi main.py untuk tahap ini. Dua perintah yang belum dibangun tetap tampil di menu agar kerangka lengkap sejak awal:
"""Pengelola Daftar Tugas — program manajemen tugas berbasis terminal."""
def tampilkan_menu():
print("=== Pengelola Daftar Tugas ===")
print("1. Tambah tugas")
print("2. Daftar tugas")
print("3. Tandai selesai")
print("4. Hapus tugas")
print("5. Keluar")
def tambah_tugas(daftar_tugas, judul):
id_baru = len(daftar_tugas) + 1
tugas_baru = {"id": id_baru, "judul": judul, "selesai": False}
daftar_tugas.append(tugas_baru)
print(f"Tugas \"{judul}\" tersimpan dengan id {id_baru}.")
def tampilkan_daftar(daftar_tugas):
for tugas in daftar_tugas:
print(f"{tugas['id']}. {tugas['judul']}")
def main():
daftar_tugas = []
while True:
tampilkan_menu()
pilihan = input("Pilihan: ").strip()
if pilihan == "1":
judul = input("Judul tugas: ").strip()
if judul:
tambah_tugas(daftar_tugas, judul)
else:
print("Judul tugas tidak boleh kosong.")
elif pilihan == "2":
tampilkan_daftar(daftar_tugas)
elif pilihan == "3":
print("Fitur tandai selesai dibangun pada Bagian 2.")
elif pilihan == "4":
print("Fitur hapus tugas dibangun pada Bagian 2.")
elif pilihan == "5":
print("Sampai jumpa!")
break
else:
print("Pilihan tidak dikenal.")
if __name__ == "__main__":
main()Mari kita bedah logika intinya satu per satu:
def tambah_tugas(daftar_tugas, judul):: fungsi menerima state program dan judul baru. Barisid_baru = len(daftar_tugas) + 1menghitung nomor berikutnya dari panjang list — cukup benar selama belum ada penghapusan, dan akan kita ganti pada Bagian 2 begitu perintah hapus hadir. Setelah dictionary baru dibuat,daftar_tugas.append(tugas_baru)menambahkannya ke state sehingga perubahan terlihat di putaran menu berikutnya.daftar_tugas = []: state dibuat tepat sebelum loop dimulai. Seluruh perintah di dalam loop bekerja pada list yang sama, bukan salinan baru.while True:: loop tanpa syarat berjalan selamanya sampai dihentikan. Satu-satunya jalan keluar adalah pernyataanbreakpada pilihan5— pola menu loop standar untuk program interaktif.pilihan = input("Pilihan: ").strip(): fungsiinput()menghentikan eksekusi sampai pengguna menekan Enter, lalu mengembalikan satu baris teks tanpa karakter baris baru. Method.strip()membuang spasi di kiri-kanan sehingga" 2 "tetap dikenali sebagai"2".- Rantai
if/elif/else: inilah dispatch — memilah satu tindakan berdasarkan pilihan. Urutan pengecekan bebas karena setiap cabang saling exclusive, dan cabangelsemenampung semua masukan di luar1–5agar program tidak pernah macet. if judul:: string kosong bernilaiFalsepada konteks boolean, jadi pemeriksaan ini menolak judul yang hanya berisi spasi tanpa harus menulisif judul != "".if __name__ == "__main__":: blokmain()hanya dijalankan ketika berkas dieksekusi langsung (python3 main.py). Ketika berkas ini diimpor sebagai module, nilai__name__bukan"__main__"sehingga loop menu tidak ikut berjalan — materi Main Module dan name membahas perilaku ini.
Menjalankan Program #
Karena program interaktif sulit dijelaskan lewat tangkapan layar, kita meniru ketikan pengguna lewat pipe. Setiap baris di dalam tanda kutip echo mewakili satu masukan yang diakhiri Enter:
echo "1
Belajar Python dasar
1
Beli susu
2
9
5" | python3 main.pyOutput yang Dihasilkan:
=== Pengelola Daftar Tugas ===
1. Tambah tugas
2. Daftar tugas
3. Tandai selesai
4. Hapus tugas
5. Keluar
Pilihan: Judul tugas: Tugas "Belajar Python dasar" tersimpan dengan id 1.
=== Pengelola Daftar Tugas ===
1. Tambah tugas
2. Daftar tugas
3. Tandai selesai
4. Hapus tugas
5. Keluar
Pilihan: Judul tugas: Tugas "Beli susu" tersimpan dengan id 2.
=== Pengelola Daftar Tugas ===
1. Tambah tugas
2. Daftar tugas
3. Tandai selesai
4. Hapus tugas
5. Keluar
Pilihan: 1. Belajar Python dasar
2. Beli susu
=== Pengelola Daftar Tugas ===
1. Tambah tugas
2. Daftar tugas
3. Tandai selesai
4. Hapus tugas
5. Keluar
Pilihan: Pilihan tidak dikenal.
=== Pengelola Daftar Tugas ===
1. Tambah tugas
2. Daftar tugas
3. Tandai selesai
4. Hapus tugas
5. Keluar
Pilihan: Sampai jumpa!Kerangka program kini berdiri: state tersimpan di daftar_tugas, menu tercetak tiap putaran, dan dispatch mengarahkan setiap pilihan ke tindakannya. Seluruh berkas tahap ini juga dapat diunduh pada bagian Berkas Sumber di bawah halaman. Bagian 2 melengkapi dua operasi yang masih berupa pesan placeholder: menandai selesai dan menghapus tugas.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
main.py
Unduh berkas"""Pengelola Daftar Tugas — program manajemen tugas berbasis terminal."""
def tampilkan_menu():
print("=== Pengelola Daftar Tugas ===")
print("1. Tambah tugas")
print("2. Daftar tugas")
print("3. Tandai selesai")
print("4. Hapus tugas")
print("5. Keluar")
def tambah_tugas(daftar_tugas, judul):
id_baru = len(daftar_tugas) + 1
tugas_baru = {"id": id_baru, "judul": judul, "selesai": False}
daftar_tugas.append(tugas_baru)
print(f"Tugas \"{judul}\" tersimpan dengan id {id_baru}.")
def tampilkan_daftar(daftar_tugas):
for tugas in daftar_tugas:
print(f"{tugas['id']}. {tugas['judul']}")
def main():
daftar_tugas = []
while True:
tampilkan_menu()
pilihan = input("Pilihan: ").strip()
if pilihan == "1":
judul = input("Judul tugas: ").strip()
if judul:
tambah_tugas(daftar_tugas, judul)
else:
print("Judul tugas tidak boleh kosong.")
elif pilihan == "2":
tampilkan_daftar(daftar_tugas)
elif pilihan == "3":
print("Fitur tandai selesai dibangun pada Bagian 2.")
elif pilihan == "4":
print("Fitur hapus tugas dibangun pada Bagian 2.")
elif pilihan == "5":
print("Sampai jumpa!")
break
else:
print("Pilihan tidak dikenal.")
if __name__ == "__main__":
main()