Selamlar herkese,
Bir panel tasarımı yaptım. Programlarımızın ilk açılışta ihtiyaç duyabilecekleri bir giriş ve kayıt paneli. Asgari olarak gerekli koşul durumlarını da oluşturdum. Öncelikle kodları paylaşayım sizinle;
from tkinter import *
from tkinter import messagebox
import sqlite3
from datetime import datetime
class Application(object):
def __init__(self):
self.con = None # sqlite3 file variable
self.cursor = None # sqlite3 for need cursor
self.registered_user = None # database registered user list
self.max_user = 10 # database have maximum register user
self.root_1 = None # main window
self.root_1_title = "LOGIN AND REGISTER" # main window title
self.root_1_geo = "325x350+100+100" # main window width and height and location
self.login_button = None # we need open login screen
self.register_button = None # we need open register screen
self.exit_button = None # we need exit program
self.state_1 = False # screen state open or close
self.login_frame = None # login screen for frame
self.register_frame = None # register screen for frame
self.username_label = None # login and register for username title zone
self.pass_label = None # login and register for password title zone
self.username_entry = None # login and register for username entry zone
self.pass_entry = None # login and register for password entry zone
self.clear_frame = None # we need entry clear for frame
self.exit_frame = None # we need exit for frame
self.confirm_frame = None # we need to confirm
self.login_info = None # login info
self.register_info = None # register info
self.database()
self.main() # main function
def database(self):
self.con = sqlite3.connect("database/db.db")
self.cursor = self.con.cursor()
self.cursor.execute("CREATE TABLE IF NOT EXISTS USER_DATA (USERNAME_1 TEXT, PASSWORD_1 TEXT,"
"REGISTER_DATE TEXT, LAST_LOGIN TEXT)")
self.con.commit()
self.con.close()
def main(self):
self.root_1 = Tk()
self.root_1.geometry(self.root_1_geo)
self.root_1.title(self.root_1_title)
self.root_1.resizable(FALSE, FALSE)
self.login_button = Button(self.root_1, text="LOGIN", width=10, command=self.login_screen)
self.login_button.pack(side=TOP, pady=25)
self.register_button = Button(self.root_1, text="REGISTER", width=10, command=self.register_screen)
self.register_button.pack(side=TOP)
self.exit_button = Button(self.root_1, text="EXIT", width=10, command=self.exit_program)
self.exit_button.pack(side=TOP, pady=25)
self.state_1 = False
mainloop()
def login_screen(self):
if not self.state_1:
self.login_frame = Frame(self.root_1, bd=5, relief=RAISED)
self.login_frame.pack(pady=10)
self.login_info = Label(self.login_frame, text="LOGIN SCREEN", width=42)
self.login_info.grid(row=1, column=1, columnspan=2)
self.username_label = Label(self.login_frame, text="USERNAME >>", width=20)
self.username_label.grid(row=2, column=1)
self.pass_label = Label(self.login_frame, text="PASSWORD >>", width=20)
self.pass_label.grid(row=3, column=1)
self.username_entry = Entry(self.login_frame, width=20)
self.username_entry.grid(row=2, column=2)
self.pass_entry = Entry(self.login_frame, width=20, show="*")
self.pass_entry.grid(row=3, column=2)
self.confirm_frame = Button(self.login_frame, text="CONFIRM", width=20, bd=2, relief=RAISED,
command=self.confirm_login)
self.confirm_frame.grid(row=4, column=1, pady=10)
self.clear_frame = Button(self.login_frame, text="CLEAR", width=20, bd=2, relief=RAISED,
command=self.clear_frame_1)
self.clear_frame.grid(row=4, column=2)
self.exit_frame = Button(self.login_frame, text="EXIT", width=42, bd=2, relief=RAISED,
command=self.exit_frame_1)
self.exit_frame.grid(row=5, column=1, columnspan=2, pady=10)
self.state_1 = True
def register_screen(self):
if not self.state_1:
self.register_frame = Frame(self.root_1, bd=5, relief=RAISED)
self.register_frame.pack(pady=10)
self.register_info = Label(self.register_frame, text="REGISTER SCREEN", width=42)
self.register_info.grid(row=1, column=1, columnspan=2)
self.username_label = Label(self.register_frame, text="USERNAME >>", width=20)
self.username_label.grid(row=2, column=1)
self.pass_label = Label(self.register_frame, text="PASSWORD >>", width=20)
self.pass_label.grid(row=3, column=1)
self.username_entry = Entry(self.register_frame, width=20)
self.username_entry.grid(row=2, column=2)
self.pass_entry = Entry(self.register_frame, width=20, show="*")
self.pass_entry.grid(row=3, column=2)
self.confirm_frame = Button(self.register_frame, text="CONFIRM", width=20, bd=2, relief=RAISED,
command=self.confirm_register)
self.confirm_frame.grid(row=4, column=1, pady=10)
self.clear_frame = Button(self.register_frame, text="CLEAR", width=20, bd=2, relief=RAISED,
command=self.clear_frame_1)
self.clear_frame.grid(row=4, column=2)
self.exit_frame = Button(self.register_frame, text="EXIT", width=42, bd=2, relief=RAISED,
command=self.exit_frame_2)
self.exit_frame.grid(row=5, column=1, columnspan=2, pady=10)
self.state_1 = True
def exit_program(self):
if not self.state_1:
self.root_1.quit()
self.state_1 = False
def exit_frame_1(self):
if self.state_1:
self.login_frame.destroy()
self.state_1 = False
def exit_frame_2(self):
if self.state_1:
self.register_frame.destroy()
self.state_1 = False
def clear_frame_1(self):
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
def confirm_login(self):
if 4 < len(self.username_entry.get()) < 16 and 6 < len(self.pass_entry.get()) < 16:
self.con = sqlite3.connect("database/db.db")
self.cursor = self.con.cursor()
self.cursor.execute("SELECT * FROM USER_DATA WHERE USERNAME_1 = ? AND PASSWORD_1 = ?",
(self.username_entry.get(), self.pass_entry.get()))
self.registered_user = self.cursor.fetchall()
if len(self.registered_user) == 0:
messagebox.showerror("THERE IS NO SUCH USER", "INVALID USERNAME AND PASSWORD")
else:
messagebox.showinfo("SUCCESSFUL", "USERNAME AND PASSWORD IS CORRECT")
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
self.exit_frame_1()
self.login_info = Label(self.root_1, text="SATEM SOFT GURURLA SUNAR")
self.login_info.pack()
else:
messagebox.showerror("INVALID DATA", "YOUR USERNAME AND PASSWORD MUST BE AT LEAST 5, MAXIMUM 15 DIGITS")
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
def confirm_register(self):
if 4 < len(self.username_entry.get()) < 16 and 6 < len(self.pass_entry.get()) < 16:
self.con = sqlite3.connect("database/db.db")
self.cursor = self.con.cursor()
self.cursor.execute("SELECT USERNAME_1,PASSWORD_1 FROM USER_DATA")
self.registered_user = self.cursor.fetchall()
if len(self.registered_user) == self.max_user:
messagebox.showerror("NO TRANSACTION", "HAVE A REGISTERED USER! PLEASE LOGIN!")
self.con.close()
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
else:
self.cursor.execute("SELECT * FROM USER_DATA WHERE USERNAME_1 = ? AND PASSWORD_1 = ?",
(self.username_entry.get(), self.pass_entry.get()))
self.registered_user = self.cursor.fetchall()
if len(self.registered_user) == 0:
self.cursor.execute("INSERT INTO USER_DATA VALUES (?,?,?,?)", (self.username_entry.get(),
self.pass_entry.get(),
datetime.now(), datetime.now()))
self.con.commit()
self.con.close()
messagebox.showinfo("REGISTER SUCCESSFUL", "YOUR REGISTRATION IS COMPLETE")
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
self.register_frame.destroy()
self.state_1 = False
else:
messagebox.showerror("NO TRANSACTION", "HAVE A REGISTERED USER! PLEASE LOGIN!")
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
else:
messagebox.showerror("INVALID DATA", "YOUR USERNAME AND PASSWORD MUST BE AT LEAST 5, MAXIMUM 15 DIGITS")
self.username_entry.delete(0, END)
self.pass_entry.delete(0, END)
app = Application()
Kodlarda türkçe kelime kullanmadım. Bunun sebebi, kendimi ingilizce ye maruz bırakmak. En çok vakit geçirdiğim alanda ingilizceyi geliştirmek için pratik yapmak konusunda böyle bir karar aldım. Tavsiye ederim. Faydalı oluyor.
Kodları çalıştırınca ortaya çıkan ekran bu şekilde. Altta açık olan LOGIN SCREEN frame’i açılışta gelmiyor. Üstteki butonlar ile açılıyor. Şimdi çirkin bir görüntüsü var. Tasarım anlamında pek yetenekli olmadığımı fark ettim.
Gayet güzel çalışıyor. Feyz almak isteyenlere bir fikir olur. Kullanmak isteyenlerin işini görür diye paylaşmak istedim. Kime, ne zaman, nerede, nasıl fayda sağlayacağını bilemeyiz.
Fakat görsel anlamda çok eksiği olduğunu düşünüyorum. Görsel anlamda bu programa katkı sağlamak isteyen olursa kodların tamamını paylaştım. Katkısının sonucunu yanıt olarak buradan paylaşabilir.
LOGIN ve REGISTER butonlarına tıklandığı zaman kendi alanlarına ait altta bir Frame oluşuyor ve oluştuktan sonra LOGIN, REGISTER ve EXIT butonları çalışmıyor.
LOGIN SCREEN de kullanıcının girdiği verileri kontrol eden koşul durumları var. Bu koşul durumları sağlanmadığı takdirde kullanıcıya uyarı mesajları veriliyor. Giriş sorgularında eşleşmeyi sqlite3 de kayıtlı olan veriler arasında yapıyor.
REGISTER SCREEN de kullanıcının girdiği verileri kontrol eden koşul durumları var. Bu koşul durumları sağlanmadığı takdirde kullanıcıya uyarı mesajları veriliyor. Sistemde aynı kullanıcı adı ile oluşturulmuş bir kayıt varsa bunun da hatası belirtiliyor ve mükerrer kullanıcı adı kullanımının önüne geçiyor.
SCREEN’lerdeki EXIT butonları açık olan Frame leri kapatmak için çalışıyor sadece.
Tasarım olarak geliştirilebileceği gibi kodları da geliştirilebilir. Katkı sağlayabilirsiniz. Daha iyi hale getirebiliriz.
İngilizce istemem ben diyenler için türkçe mealini de bırakıyorum buraya
from tkinter import *
from tkinter import messagebox
import sqlite3
from datetime import datetime
class Uygulama(object):
def __init__(self):
self.baglanti = None # sqlite3 dosya değişkeni
self.imlec = None # sqlite3 için imleç
self.kayitli_kullanici = None # database için kayıtlı kullanıcı listesi
self.maksimum_kullanici = 10 # database maksimum kayıt olacak kişi sayısı
self.ekran_1 = None # ana pencere
self.ekran_1_etiket = "GİRİŞ VE KAYIT OL PANELİ" # ana pencere etikeit
self.ekran_1_boyutlari = "325x400+100+100" # ana encere boyut ve konumu
self.giris_butonu = None # giriş ekranı açmamız için gereken button değişkeni
self.kayit_butonu = None # kayıt ekranı açmamız için gereken button değişkeni
self.cikis_butonu = None # çıkış yapabilmemiz için gereken button değişkeni
self.durum_1 = False # ekran durumu açık mı kapalı mı
self.giris_cercevesi = None # giriş ekranı çerçevesi
self.kayit_cercevesi = None # kayıt ekranı çerçevesi
self.kullanici_yazisi = None # giriş ve kayıt ekranı için kullanıcı adı etiket alanı değişkeni
self.sifre_yazisi = None # giriş ve kayıt ekranı için şifre etiket alanı değişkeni
self.kullanici_girdi = None # giriş ve kayıt ekranı için kullanıcı adı yazzma alanı değişkeni
self.sifre_girdi = None # giriş ve kayıt ekranı için şifre yazma alanı değişkeni
self.cerceve_temizleme = None # çerçevelerimizi temizlemeye ihtiyacımız olan buton değişkeni
self.cerceve_cikis = None # çerçevelerimizden çıkış yapmaya ihtiyacımız olan buton değişkeni
self.cerceve_onay = None # çerçevelerimizdeki ilemleri onaylamamıza ihtiyacımız olan buton değişkeni
self.giris_bilgisi = None # giriş bilgisi
self.kayit_bilgisi = None # kayit bilgisi
self.database()
self.main() # ana fonksiyon
def database(self):
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("CREATE TABLE IF NOT EXISTS KULLANICI_BILGILERI (KULLANICI_ADI TEXT, SIFRE TEXT,"
"KAYIT_TARIHI TEXT, SON_GIRIS TEXT)")
self.baglanti.commit()
self.baglanti.close()
def main(self):
self.ekran_1 = Tk()
self.ekran_1.geometry(self.ekran_1_boyutlari)
self.ekran_1.title(self.ekran_1_etiket)
self.ekran_1.resizable(FALSE, FALSE)
self.giris_butonu = Button(self.ekran_1, text="GİRİŞ", width=10, command=self.giris_ekrani)
self.giris_butonu.pack(side=TOP, pady=25)
self.kayit_butonu = Button(self.ekran_1, text="KAYIT", width=10, command=self.kayit_ekrani)
self.kayit_butonu.pack(side=TOP)
self.cikis_butonu = Button(self.ekran_1, text="ÇIKIŞ", width=10, command=self.cikis_program)
self.cikis_butonu.pack(side=TOP, pady=25)
self.durum_1 = False
mainloop()
def giris_ekrani(self):
if not self.durum_1:
self.giris_cercevesi = Frame(self.ekran_1, bd=5, relief=RAISED)
self.giris_cercevesi.pack(pady=10)
self.giris_bilgisi = Label(self.giris_cercevesi, text="GİRİŞ EKRANI", width=42)
self.giris_bilgisi.grid(row=1, column=1, columnspan=2)
self.kullanici_yazisi = Label(self.giris_cercevesi, text="KULLANICI ADI >>", width=20)
self.kullanici_yazisi.grid(row=2, column=1)
self.sifre_yazisi = Label(self.giris_cercevesi, text="ŞİFRE >>", width=20)
self.sifre_yazisi.grid(row=3, column=1)
self.kullanici_girdi = Entry(self.giris_cercevesi, width=20)
self.kullanici_girdi.grid(row=2, column=2)
self.sifre_girdi = Entry(self.giris_cercevesi, width=20, show="*")
self.sifre_girdi.grid(row=3, column=2)
self.cerceve_onay = Button(self.giris_cercevesi, text="ONAY", width=20, bd=2, relief=RAISED,
command=self.giris_onay)
self.cerceve_onay.grid(row=4, column=1, pady=10)
self.cerceve_temizleme = Button(self.giris_cercevesi, text="TEMİZLE", width=20, bd=2, relief=RAISED,
command=self.cerceve_temizlemex)
self.cerceve_temizleme.grid(row=4, column=2)
self.cerceve_cikis = Button(self.giris_cercevesi, text="ÇIKIŞ", width=42, bd=2, relief=RAISED,
command=self.cikis_cerceve_1)
self.cerceve_cikis.grid(row=5, column=1, columnspan=2, pady=10)
self.durum_1 = True
def kayit_ekrani(self):
if not self.durum_1:
self.kayit_cercevesi = Frame(self.ekran_1, bd=5, relief=RAISED)
self.kayit_cercevesi.pack(pady=10)
self.kayit_bilgisi = Label(self.kayit_cercevesi, text="KAYIT EKRANI", width=42)
self.kayit_bilgisi.grid(row=1, column=1, columnspan=2)
self.kullanici_yazisi = Label(self.kayit_cercevesi, text="KULLANICI ADI >>", width=20)
self.kullanici_yazisi.grid(row=2, column=1)
self.sifre_yazisi = Label(self.kayit_cercevesi, text="ŞİFRE >>", width=20)
self.sifre_yazisi.grid(row=3, column=1)
self.kullanici_girdi = Entry(self.kayit_cercevesi, width=20)
self.kullanici_girdi.grid(row=2, column=2)
self.sifre_girdi = Entry(self.kayit_cercevesi, width=20, show="*")
self.sifre_girdi.grid(row=3, column=2)
self.cerceve_onay = Button(self.kayit_cercevesi, text="ONAY", width=20, bd=2, relief=RAISED,
command=self.kayit_onay)
self.cerceve_onay.grid(row=4, column=1, pady=10)
self.cerceve_temizleme = Button(self.kayit_cercevesi, text="TEMİZLE", width=20, bd=2, relief=RAISED,
command=self.cerceve_temizlemex)
self.cerceve_temizleme.grid(row=4, column=2)
self.cerceve_cikis = Button(self.kayit_cercevesi, text="ÇIKIŞ", width=42, bd=2, relief=RAISED,
command=self.cikis_cerceve_2)
self.cerceve_cikis.grid(row=5, column=1, columnspan=2, pady=10)
self.durum_1 = True
def cikis_program(self):
if not self.durum_1:
self.ekran_1.quit()
self.durum_1 = False
def cikis_cerceve_1(self):
if self.durum_1:
self.giris_cercevesi.destroy()
self.durum_1 = False
def cikis_cerceve_2(self):
if self.durum_1:
self.kayit_cercevesi.destroy()
self.durum_1 = False
def cerceve_temizlemex(self):
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
def giris_onay(self):
if 4 < len(self.kullanici_girdi.get()) < 16 and 6 < len(self.sifre_girdi.get()) < 16:
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("SELECT * FROM KULLANICI_BILGILERI WHERE KULLANICI_ADI = ? AND SIFRE = ?",
(self.kullanici_girdi.get(), self.sifre_girdi.get()))
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == 0:
messagebox.showerror("GEÇERSİZ VERİ", "BÖYLE BİR KULLANICI YOK")
else:
self.baglanti.close()
messagebox.showinfo("BAŞARILI", "KULLANICI ADI VE ŞİFRESİ DOĞRU")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
self.cikis_cerceve_1()
self.giris_bilgisi = Label(self.ekran_1, text="SATEM SOFT GURURLA SUNAR")
self.giris_bilgisi.pack()
else:
messagebox.showerror("GEÇERSİZ VERİ", "KULLANICI ADINIZ VE ŞİFRENİZ EN AZ 5 EN ÇOK 15 KARAKTERDEN OLUŞMALIDIR.")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
def kayit_onay(self):
if 4 < len(self.kullanici_girdi.get()) < 16 and 6 < len(self.sifre_girdi.get()) < 16:
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("SELECT KULLANICI_ADI,SIFRE FROM KULLANICI_BILGILERI")
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == self.maksimum_kullanici:
messagebox.showerror("GEÇERSİZ VERİ", "MEVCUT KULLANICI! LÜTFEN GİRİŞ YAPINIZ!")
self.baglanti.close()
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
else:
self.imlec.execute("SELECT * FROM KULLANICI_BILGILERI WHERE KULLANICI_ADI = ? AND SIFRE = ?",
(self.kullanici_girdi.get(), self.sifre_girdi.get()))
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == 0:
self.imlec.execute("INSERT INTO KULLANICI_BILGILERI VALUES (?,?,?,?)", (self.kullanici_girdi.get(),
self.sifre_girdi.get(),
datetime.now(), datetime.now()))
self.baglanti.commit()
self.baglanti.close()
messagebox.showinfo("KAYIT BASARILI", "KAYIT BAŞARIYLA TAMAMLANDI")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
self.kayit_cercevesi.destroy()
self.durum_1 = False
else:
messagebox.showerror("GEÇERSİZ VERİ", "MEVCUT KULLANICI ADI!")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
else:
messagebox.showerror("GEÇERSİZ VERİ", "KULLANICI ADINIZ VE ŞİFRENİZ EN AZ 5 EN ÇOK 15 KARAKTERDEN OLUŞMALIDIR.")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
app = Uygulama()