Halo Sobat Ngoding!
Selamat datang kembali di blog Catatan Mantan IT. Semoga apa yang saya catat di blog ini dapat membantu kalian dalam mempelajari bahasa pemrograman Python dan UI Kivy.
Catatan sebelumnya saya sudah mencatat tentang Tutorial Membuat Halaman Profil Member untuk update data. Nah, sekarang kelanjutannya Tutorial Ganti Password.
Proses pembuatan Ganti Password di Python dan Kivy ada yang perlu ditambahkan di file main.py, screens.py, profil.py dan profil.kv. lalu buat 2 file, gantipassword.py dan gantipassword.kv
oke saya mulai dari main.py saya menambahkan baris kode python di window manager "Gantipassword(name='gantipassword')," dan " fungsi def gantipass(self): self.wm.current = "gantipassword" " berikut susunan kodenya
main.py
from kivymd.app import MDApp
from kivymd.uix.screenmanager import ScreenManager
from kivy.core.text import LabelBase
from kivy.core.window import Window
Window.size = (500, 650)
from screens.screens import *
class WindowManager(ScreenManager):
pass
class LapakNgoding(MDApp):
def build(self):
self.logged_user = None
self.wm = WindowManager()
screens =[
Hallog(name="hallog"),
Daftar(name="daftar"),
Hallogadmin(name="hallogadmin"),
Beranda(name='beranda'),
Profil(name='profil'),
Gantipassword(name='gantipassword'), #ini yang ditambahkan
]
for screen in screens:
self.wm.add_widget(screen)
return self.wm
def callback(self, instance):
self.root.current = 'beranda'
def logout(self):
self.wm.current = "hallog"
def profil(self):
self.wm.current = "profil"
#ini yang ditambahkan
def gantipassword(self):
self.wm.current = "gantipassword"
if __name__ == '__main__':
LabelBase.register(name="Atma", fn_regular="kv/assets/fonts/Atma-Bold.ttf")
LabelBase.register(name="Tagline", fn_regular="kv/assets/fonts/Ubuntu-LI.ttf")
LabelBase.register(name="Line", fn_regular="kv/assets/fonts/Ubuntu-M.ttf")
LapakNgoding().run()
setelah selesai main.py sekarang kita beralih ke screens.py di sini sama saya menambahkan kode python hanya sebaris saja "from screens.gantipassword import Gantipassword" berikut susunan kode python -nya
screens.py
from screens.hallog import Hallog
from screens.daftar import Daftar
from screens.daftaradm import DaftarAdm
from screens.beranda import Beranda
from screens.hallogadmin import Hallogadmin
from screens.profil import Profil
from screens.gantipassword import Gantipassword #ini yang di tambahkan
dari screens.py sekarang kita menuju profil.py perlakuannya pun sama, saya hanya menambahkan kode python sebagai fungsi perpindahan layar atau halaman dari profil ke ganti password " def gantipassword(self): self.manager.current = 'gantipassword' " berikut susunan kode python -nya
profil.py
from kivy.app import App
from kivy.uix.label import Label
from kivy.lang import Builder
from kivymd.uix.dialog import MDDialog
from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivymd.uix.label import MDLabel
import sqlite3
import bcrypt
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, '..', 'LapakNgoding.db')
from screens.screens import *
class Profil(MDScreen):
def __init__(self, **kwargs):
Builder.load_file("kv/profil.kv")
super().__init__(**kwargs)
def on_pre_enter(self):
app = MDApp.get_running_app()
username = app.logged_user or ""
self.ids.welcome_label.text = f"Hi {username}, mohon diperhatikan untuk perubahan data!"
try:
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("SELECT nama, email, nohp, alamat FROM member WHERE username = ?", (username,))
result = c.fetchone()
conn.close()
print("Data dari DB:", result)
if result:
self.ids.nama.text = str(result[0])
self.ids.email.text = str(result[1])
self.ids.nohp.text = str(result[2])
self.ids.alamat.text = str(result[3])
except Exception as e:
print("Error:", e)
def update_profil(self):
nama = self.ids.nama.text.strip()
email = self.ids.email.text.strip()
nohp = self.ids.nohp.text.strip()
alamat = self.ids.alamat.text.strip()
username = MDApp.get_running_app().logged_user
try:
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("""UPDATE member SET nama=?, email=?, nohp=?, alamat=? WHERE username=?""",
(nama, email, nohp, alamat, username))
conn.commit()
conn.close()
self.dialog = MDDialog(text="Data berhasil diperbarui!", radius=[20, 7, 20, 7])
self.dialog.open()
except Exception as e:
print("Error update:", e)
self.dialog = MDDialog(
text="Gagal memperbarui data!",
radius=[20, 7, 20, 7]
)
self.dialog.open()
#ini yang ditambahkan
def gantipassword(self):
self.manager.current = 'gantipassword'
terakhir yang perlu di tambahkan atau di edit profil.kv, ini adalah kode kivy sebagai desain UI -nya. ya.. kalau di HTML sama dengan CSS lah. di file ini saya menambahkan button yang jika di klik akan menuju ke screen atau halaman ganti password berikut susunan kode kivy -nya
profil.kv
#:kivy 2.1
<Profil>:
MDFloatLayout:
md_bg_color: ("#d3ede6")
Image:
source: "kv/assets/foto/lapakngodingtr.png"
size_hint: 0.5, 0.5
pos_hint: {"center_x": 0.70, "center_y": 0.87}
Image:
source: "kv/assets/foto/logoLapakngodin9.png"
size_hint: 0.2, 0.2
pos_hint: {"center_x": 0.13, "center_y": 0.90}
MDLabel:
text: "L a p a k N g o d i n g"
halign: "center"
font_size: "30sp"
font_name: "Atma"
pos_hint: {"center_x": 0.60, "center_y": 0.95}
MDLabel:
text: "Belajar Ngoding dengan Browsing"
halign: "center"
font_size: "16sp"
font_name: "Tagline"
pos_hint: {"center_x": 0.60, "center_y": 0.90}
color: ("#808080")
MDLabel:
id: welcome_label
text: ''
halign: "center"
font_size: "18sp"
font_name: "Tagline"
pos_hint: {"center_x": 0.50, "center_y": 0.80}
color: ("#808080")
MDLabel:
text: "Profil Saya"
font_style: "H5"
halign: "center"
pos_hint: {"center_y": 0.75}
MDTextField:
id: nama
hint_text: "Nama Lengkap"
mode: "rectangle"
icon_left: "account"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.69}
MDTextField:
id: email
hint_text: "Email aktif"
mode: "rectangle"
icon_left: "email-check-outline"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.59}
MDTextField:
id: nohp
hint_text: "No HP"
mode: "rectangle"
icon_left: "cellphone-basic"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.49}
MDTextField:
id: alamat
hint_text: "Alamat"
mode: "rectangle"
icon_left: "city-variant"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.39}
MDRaisedButton:
text: "Simpan"
font_size: "16sp"
font_name: "Atma"
size_hint: 0.30, 0.07
pos_hint: {"center_x": 0.32, "center_y": 0.29}
md_bg_color: ("#23a484")
on_release: root.update_profil()
#ini yang ditambahkan
MDRaisedButton:
text: "Ganti Password"
font_size: "16sp"
font_name: "Atma"
size_hint: 0.30, 0.07
pos_hint: {"center_x": 0.68, "center_y": 0.29}
md_bg_color: ("#23a484")
on_release: root.gantipassword()
MDTopAppBar:
md_bg_color: ("#23a484")
use_overflow: True
left_action_items:
[["home", lambda x: app.callback(x), "Home", "Home"]]
right_action_items:
[["logout", lambda x: app.logout(), "Logout", "Logout"]]
setelah menabahkan baris kode pada 4 file di atas. sekarang kita buat 2 file python dan kivy berikut susunan kode python dan kivy -nya
1. gantipassword.py (BelajarKivy-screens-gantipassword.py)
from kivymd.uix.screen import MDScreen
from kivymd.uix.dialog import MDDialog
from kivymd.app import MDApp
from kivy.lang import Builder
import sqlite3, bcrypt, os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, '..', 'LapakNgoding.db')
class Gantipassword(MDScreen):
show_password = False
def __init__(self, **kwargs):
Builder.load_file("kv/gantipassword.kv")
super().__init__(**kwargs)
def on_pre_enter(self):
app = MDApp.get_running_app()
username = app.logged_user or ""
self.ids.welcome_label.text = f"Hi {username}, mohon diperhatikan untuk perubahan Password!"
def toggle_password_visibility(self, state):
self.show_password = state
# Trigger update
self.ids.old_password.password = not self.show_password
self.ids.new_password.password = not self.show_password
self.ids.confirm_password.password = not self.show_password
def change_password(self):
username = MDApp.get_running_app().logged_user
old_pw = self.ids.old_password.text.strip()
new_pw = self.ids.new_password.text.strip()
confirm_pw = self.ids.confirm_password.text.strip()
if not old_pw or not new_pw or not confirm_pw:
self.show_dialog("Semua kolom harus diisi!")
return
if new_pw != confirm_pw:
self.show_dialog("Password baru tidak cocok!")
return
if len(new_pw) < 8:
self.show_dialog("Password baru minimal 8 karakter!")
return
try:
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("SELECT password FROM member WHERE username = ?", (username,))
result = c.fetchone()
if result and bcrypt.checkpw(old_pw.encode(), result[0]):
new_hashed = bcrypt.hashpw(new_pw.encode(), bcrypt.gensalt())
c.execute("UPDATE member SET password = ? WHERE username = ?", (new_hashed, username))
conn.commit()
self.show_dialog("Password berhasil diubah.")
else:
self.show_dialog("Password lama salah.")
except Exception as e:
print("Error:", e)
self.show_dialog("Terjadi kesalahan.")
finally:
conn.close()
def show_dialog(self, message):
dialog = MDDialog(text=message, radius=[20, 7, 20, 7])
dialog.open()
2. gantipassword.kv (BelajarKivy-kv-gantipassword.kv)
#:kivy 2.1
<Gantipassword>:
MDFloatLayout:
md_bg_color: ("#d3ede6")
Image:
source: "kv/assets/foto/lapakngodingtr.png"
size_hint: 0.5, 0.5
pos_hint: {"center_x": 0.70, "center_y": 0.87}
Image:
source: "kv/assets/foto/logoLapakngodin9.png"
size_hint: 0.2, 0.2
pos_hint: {"center_x": 0.13, "center_y": 0.90}
MDLabel:
text: "L a p a k N g o d i n g"
halign: "center"
font_size: "30sp"
font_name: "Atma"
pos_hint: {"center_x": 0.60, "center_y": 0.95}
MDLabel:
text: "Belajar Ngoding dengan Browsing"
halign: "center"
font_size: "16sp"
font_name: "Tagline"
pos_hint: {"center_x": 0.60, "center_y": 0.90}
color: ("#808080")
MDLabel:
id: welcome_label
text: ''
halign: "center"
font_size: "18sp"
font_name: "Tagline"
pos_hint: {"center_x": 0.50, "center_y": 0.80}
color: ("#808080")
MDLabel:
text: "Ganti Password"
font_style: "H5"
halign: "center"
pos_hint: {"center_y": 0.75}
MDTextField:
id: old_password
hint_text: "Password Lama"
password: not root.show_password
mode: "rectangle"
icon_left: "lock"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.69}
MDTextField:
id: new_password
hint_text: "Password Baru"
password: not root.show_password
mode: "rectangle"
icon_left: "lock"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.59}
MDTextField:
id: confirm_password
hint_text: "Konfirmasi Password Baru"
password: not root.show_password
mode: "rectangle"
icon_left: "lock-check"
size_hint: 0.70, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.49}
MDRaisedButton:
text: "Simpan"
font_size: "16sp"
font_name: "Atma"
size_hint: 0.30, 0.07
pos_hint: {"center_x": 0.32, "center_y": 0.19}
md_bg_color: ("#23a484")
on_release: root.change_password()
MDTopAppBar:
md_bg_color: ("#23a484")
use_overflow: True
left_action_items:
[["home", lambda x: app.callback(x), "Home", "Home"]]
right_action_items:
[["logout", lambda x: app.logout(), "Logout", "Logout"]]
selesai, semoga bermanfaat.
jangan berhenti mencoba. Setiap kesalahan atau kegagalan adalah anak tangga menuju sukses yang kita pijak.
Jakarta, selagi jaga anak, karena istri lagi hiling ke bandung. sampai ketemu lagi di tutorial berikutnya. dan jangan lupa kunjungi juga channelnya lapakngoding.
Komentar
Posting Komentar