Langsung ke konten utama

Membuat Aplikasi Android dengan Python dan Kivy | Upload dan Ubah Foto di Halaman Profil

 Hai Sobat Ngoding gimana kabarnya? kalau kamu menemukan blog ini berarti tujuan kita sama yaitu Belajar Ngoding dengan Browsing. saya mo lanjutin yang kemarin ya sob yang baru mampir silahkan cek Membuat Aplikasi Android dengan Python dan Kivy | Halaman Profil Member untuk Update Data dan Membuat Aplikasi Android dengan Python dan Kivy | Tutorial Ganti Password .  Sekarang kita bahas lanjutannya yaitu Membuat Aplikasi Android dengan Python dan Kivy | Upload dan Ubah Foto di Halaman Profil dicatatan kali ini saya ga nambah file, cuma menambah fungsi di profil.py, daftar.py, profil.kv serta menambahkan kolom foto di tabel database SQLite. di file profil.py saya menambahkan fungsi untuk menampilkan foto profil, fungsi ubah dan upload foto ke folder yang sudah ditentukan, lalu merubah nama foto berdasarkan username. Berikut susuna kodenya profil.py from kivy.app import App from kivy.uix.label import Label from kivy.lang import Builder from kivymd.uix.dialog import MDDialog fro...

Membuat Aplikasi Android dengan Python dan Kivy | Upload dan Ubah Foto di Halaman Profil

 Hai Sobat Ngoding

gimana kabarnya? kalau kamu menemukan blog ini berarti tujuan kita sama yaitu Belajar Ngoding dengan Browsing.

saya mo lanjutin yang kemarin ya sob yang baru mampir silahkan cek Membuat Aplikasi Android dengan Python dan Kivy | Halaman Profil Member untuk Update Data dan Membuat Aplikasi Android dengan Python dan Kivy | Tutorial Ganti Password.

 Sekarang kita bahas lanjutannya yaitu

Membuat Aplikasi Android dengan Python dan Kivy | Upload dan Ubah Foto di Halaman Profil

dicatatan kali ini saya ga nambah file, cuma menambah fungsi di profil.py, daftar.py, profil.kv serta menambahkan kolom foto di tabel database SQLite.

di file profil.py saya menambahkan fungsi untuk menampilkan foto profil, fungsi ubah dan upload foto ke folder yang sudah ditentukan, lalu merubah nama foto berdasarkan username. Berikut susuna kodenya

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
from kivymd.uix.filemanager import MDFileManager
import shutil
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, foto FROM member WHERE username = ?", (username,))#baru ditambahkan fotoo
            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])
                foto = result[4] if result[4] else "default.png" #baru ditambahkan jika member belum ada foto profil maka menggunakan foto default.png
                self.ids.foto_profil.source = f"assets/user_photos/{foto}" #baru ditambahkan url foto profil
        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()
            
    def gantipassword(self):
        self.manager.current = 'gantipassword'
     
    #baru ditambahkan sd bawah
    def pilihfoto(self):
        self.file_manager = MDFileManager(
            select_path=self.simpan_foto,
            exit_manager=self.tutup_file_manager,
            preview=True
        )
        self.file_manager.show('/home')  # Ganti path awal sesuai OS kamu

    def tutup_file_manager(self, *args):
        self.file_manager.close()

    def simpan_foto(self, path):
        try:
            app = MDApp.get_running_app()
            username = app.logged_user
            if not username:
                return

            folder = os.path.join(BASE_DIR, '..', 'assets', 'user_photos')
            os.makedirs(folder, exist_ok=True)
            file_target = os.path.join(folder, f"{username}.png")
            shutil.copy(path, file_target)

            # Simpan ke database
            conn = sqlite3.connect(DB_PATH)
            c = conn.cursor()
            c.execute("UPDATE member SET foto=? WHERE username=?", (f"{username}.png", username))
            conn.commit()
            conn.close()
            
            from kivy.clock import Clock
            
            foto_path = os.path.abspath(f"assets/user_photos/{username}.png")
            
            def update_image(dt):
                self.ids.foto_profil.source = foto_path
                self.ids.foto_profil.reload()
                 
            Clock.schedule_once(update_image, 0.1)

            self.ids.foto_profil.source = f"/assets/user_photos/{username}.png"
            self.tutup_file_manager()
        except Exception as e:
            print("Gagal upload foto:", e)

lanjut ke daftar.py. di sini saya menambahkan di kode SQLite untuk CREATE TABLE foto dan INSERT. Berikut susunan kodenya

daftar.py


from kivymd.uix.screen import MDScreen
from kivy.lang import Builder
from kivymd.uix.dialog import MDDialog
import sqlite3
import bcrypt
import os

# Buat path database dinamis
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, '..', 'LapakNgoding.db')

class Daftar(MDScreen):
    def __init__(self, **kwargs):
        Builder.load_file("kv/daftar.kv")
        super().__init__(**kwargs)

    def submit(self):
        username = self.ids.username.text
        nama = self.ids.nama.text
        email = self.ids.email.text
        nohp = self.ids.nohp.text
        alamat = self.ids.alamat.text
        password = self.ids.password.text
        passconf = self.ids.passconf.text

        # Koneksi ke database
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()

        # Pastikan tabel 'member' sudah ada
        c.execute('''
            CREATE TABLE IF NOT EXISTS member (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                nama TEXT,
                email TEXT,
                nohp TEXT,
                alamat TEXT,
                password TEXT,
                username TEXT UNIQUE,
                foto TEXT #baru ditambahkan kolom foto
            )
        ''')

        c.execute("SELECT username FROM member")
        db = c.fetchall()
        daftar_user = [user[0] for user in db]

        if len(password) <= 7:
            self.dialog = MDDialog(
                text="Password terlalu pendek, minimal 8 karakter",
                radius=[20, 7, 20, 7],
            )
            self.dialog.open()
            return

        if username is None or len(username) < 3:
            self.dialog = MDDialog(
                text="Username minimal 3 karakter!",
                radius=[20, 7, 20, 7],
            )
            self.dialog.open()
            return

        if username in daftar_user:
            self.dialog = MDDialog(
                text="Username sudah terdaftar!",
                radius=[20, 7, 20, 7],
            )
            self.dialog.open()
            return

        if password != passconf:
            self.dialog = MDDialog(
                text="Password dan Konfirmasi tidak sama!",
                radius=[20, 7, 20, 7],
            )
            self.dialog.open()
            return

        # Enkripsi password dan simpan ke database
        hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
        c.execute('''
            INSERT INTO member (nama, email, nohp, alamat, password, username, foto) #baru ditambahkan foto
            VALUES (?, ?, ?, ?, ?, ?, ?)
        ''', (nama, email, nohp, alamat, hashed_password, username, "default.png"))

        conn.commit()
        conn.close()

        self.dialog = MDDialog(
            title="S E L A M A T",
            text="Kamu telah terdaftar, silakan login.",
            radius=[20, 7, 20, 7],
        )
        self.dialog.open()

dari daftar.py sekarang kita ke file profil.kv untuk menampilkan foto profil member. Berikut susunan kodenya

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_x": 0.6, "center_y": 0.75}
        
        #baru ditambahkan
        Image:
            id: foto_profil
            source: "kv/assets/user_photos/default.png"
            size_hint: 0.2, 0.2
            allow_stretch: True
            keep_ratio: True
            pos_hint: {"center_x": 0.13, "center_y": 0.68}
        
        #baru ditambahkan
        MDRaisedButton:
            text: "Ubah Foto"
            pos_hint: {"center_x": 0.13, "center_y": 0.60}
            on_release: root.pilihfoto()

        MDTextField:
            id: nama
            hint_text: "Nama Lengkap"
            mode: "rectangle"
            icon_left: "account"
            size_hint: 0.70, 0.09
            pos_hint: {"center_x": 0.6, "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.6, "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.6, "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.6, "center_y": 0.39}

        MDRaisedButton:
            text: "Simpan"
            font_size: "16sp"
            font_name: "Atma"
            size_hint: 0.30, 0.07
            pos_hint: {"center_x": 0.40, "center_y": 0.29}
            md_bg_color: ("#23a484")
            on_release: root.update_profil()
            
        MDRaisedButton:
            text: "Ganti Password"
            font_size: "16sp"
            font_name: "Atma"
            size_hint: 0.30, 0.07
            pos_hint: {"center_x": 0.75, "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"]]

terakhir dan harus, wajib, kudu dilakukan yaitu membuat kolom foto di database lapakngoding.db di tabel member. Karena jika tidak ditambahkan pasti error.

oke, sudah selesai. jalankan aplikasi dari main.py dan booom lihat hasilnya

Tampilan Foto Profil

terdapat foto profil di bagian kiri di bawa header sejajar dengan data lengkap member.

ingat jangan menilai orang dari tampilan luarnya. karena bungkus GUDANG GARAM isinya ROKOK bukan GARAM. fajar sad Boy

Jakarta, setelah hujan-hujanan naik motor Cileungsi - Jakarta 

Komentar

Postingan populer dari blog ini

Membuat Aplikasi Android dengan Python dan Kivy untuk Halaman Login Administrator

Melanjutkan dari Catatan yang kemrin yaitu Membuat Aplikasi Android SistemEnkripsi dan Deskripsi Password Bcrypt untuk Autentikasi Login denganPython dan Kivy . Buat yang baru mampir silahkan baca catatan sebelumnya agar dapat mengerti alurnya catatan kali ini. Sekarang saya ingin mencatat Membuat Aplikasi Android dengan Python dan Kivy untuk Halaman Login Administrator. langkah awal, di file main.py yang berada di folder Aplikasi Python - main.py tambahkan kode pada class LapakNgoding untuk memanggil atau menjalankan file hallogadmin.py baris kodenya ada di baris ke 19 perhatikan baris kode di bawah ini. lanjut kita buat file python dengan nama hallogadmin.py yang berada di folder Aplikasi Python - screens - hallogadmin.py berikut susunan kodenya. lalu untuk meload class Hallogadmin yang berada di dalam file hallogadmin.py kita perlu menambahkan kode di file screens.py yang berada di folder Aplikasi Python - screens - screens.py tambahakan dengan kode from screens . hallogadmin ...

Membuat Aplikasi Android Sistem Enkripsi dan Deskripsi Password Bcrypt untuk Autentikasi Login dengan Python dan Kivy

  Hai Koder, jangan lupa baca catatan sebelumnya ya untuk mengerti alur catatan Membuat Aplikasi Android Sistem Enkripsi dan Deskripsi Password Bcrypt untuk Autentikasi Login dengan Python dan Kivy. Silahkan koder baca disini . oke kita mulai Membuat Aplikasi Android Sistem Enkripsi dan Deskripsi Password Bcrypt untuk Autentikasi Login dengan Python dan Kivy Skema filenya sebagai berikut buka file hallog.kv yang berada di Aplikasi Python - kv - hallog.kv lalu pada bagian button login di tambahkan kode on_press : root.loginAcc pada bagian akhir MDRiseButton . berikut full kode hallog.kv. Jangan lupa id pada textfieldnya di bagian MDTextField id : username dan id : password . hallog.kv #:kivy 2.1 <Hallog>: MDFloatLayout: md_bg_color: ( "#d3ede6" ) Image: source: "kv/assets/foto/lapakngodingtr.png" size_hint: . 5 , . 5 pos_hint: { "center_x" : 0 . 5 , "center_y" : 0 . 70 } Image: source:...

Cara Membuat Aplikasi Android Form Pendaftaran dengan Python dan Kivy dengan Parameter Input if elif else

begini koder, kemarin kan saya sudah mencatat Cara Membuat Form pendaftaran dengan Python dan GUI dengan KivyMD lalu di input ke database sqlite. Nah sekarang ini kelanjutanya dengan menambahkan form input username dan parameter pada username dan penambahan form input konfirmasi password. buat yang baru baca catatan ini lebih baik ikuti dahulu di catatan sebelumnya. agar dapat memahami alur dan susunan foldernya di kategori Membuat Aplikasi Android . Jadi, logikanya sebagai berikut : 1. Jika password yang di input kurang dari delapan karakter maka akan di tolak, lalu muncul notif "Password terlalu pendek mimal 8 karakter". beikut tampilannya 2. Jika username kurang dari 3 karakter, maka akan ditolak dan muncul notif Usename Minimal 3 karakter. berikut tampilanya 3. Jika Username sudah terdaftar di database maka akan di tolak, dan muncul notif "Username sudah terdaftar". berikut tampilannya 4. Jika pendaftaran berhasil maka akan muncul notif "Selamat kamu telah ...