PyQt5 Kullanici Giris Ekrani Sorunu

Arkadaslar PyQt5’te kullanici giris ekrani hazirliyorum. saatlerdir arastiriyorum işin içinden cikamadim. Yapmak istedigim islem, veritabanindaki bilgilerle eşleştirme yapildiginda, kullanici adı ve sifre dogruysa, giriş başarılı yazsın. Kullanıcı adı veya paroladan her hangi birisi yanlis oldugunda, Kullanıcı bulunamadı veya parola hatalı yazsın istiyorum.
Elimde 2 kod var. birisi kendi yazdigim, diğeri baska bir kaynak. Kendi yazdıgım kod’ta her hangi bir işlem yapmıyor. Fakat diğer kaynaktaki kod işlem başarılı bir sekilde gercekleştiriliyor. Kaynaktaki kod’ta, veritabanına insert işlemini db browser programından yapiyor. Aynı kodları yazdım lakin, Ben kodların içinde insert yapmayı istiyorum. Yardimci olursaniz sevinirim. Aşağidaki kod kendi yazdıgım;

import sys
import sqlite3
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *



class Pencere(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100,200,300,200)
        self.setWindowTitle("GİRİŞ EKRANI")
        self.baglantiOlustur()
        self.elemanlar()
        self.giris()




        self.show()


    def baglantiOlustur(self):
        self.baglanti = sqlite3.connect("login2.db")
        self.cur = self.baglanti.cursor()

        self.cur.execute("""CREATE TABLE IF NOT EXISTS login2(kullaniciAdi TEXT, sifre INT)""")
        self.baglanti.commit()


    def elemanlar(self):

        self.labelYaziEkrani = QLabel("")


        self.lineKullaniciAdi = QLineEdit(self)
        self.lineKullaniciAdi.setPlaceholderText("Kullanıcı adınızı giriniz.")
        self.lineKullaniciAdi.setFont(QFont("Arial", 10, QFont.Bold))
        self.lineKullaniciAdi.move(10, 20)
        self.lineKullaniciAdi.resize(180, 20)

        self.lineParola = QLineEdit(self)
        self.lineParola.setPlaceholderText("Parolanızı giriniz.")
        self.lineParola.setEchoMode(QLineEdit.Password)
        self.lineParola.setFont(QFont("Arial", 10, QFont.Bold))
        self.lineParola.move(10, 60)
        self.lineParola.resize(180, 20)

        self.butonGiris = QPushButton(self)
        self.butonGiris.setText("Giriş yap")
        self.butonGiris.move(10, 100)
        self.butonGiris.setFont(QFont("Arial", 10, QFont.Bold))



        self.butonGiris.clicked.connect(self.giris)

    def giris(self):
        adi = self.lineKullaniciAdi.text()
        parola = self.lineParola.text()

        self.cur.execute("SELECT * FROM login2 WHERE kullaniciAdi = ? and sifre = ?",(adi,parola))
        liste = self.cur.fetchall()

        if len(liste) == 0:
            self.labelYaziEkrani.setText("Kullanıcı bulunamadı")

        else:
            self.labelYaziEkrani.setText("Hosgeldiniz" + adi)
















def pencere():
    uygulama = QApplication(sys.argv)
    pen = Pencere()
    sys.exit(uygulama.exec_())

pencere()

bu Koduda baska bir yerden buldum;


import  sys
import sqlite3
from PyQt5 import QtWidgets


class Pencere(QtWidgets.QWidget):

    def __init__(self):

        super().__init__()

        self.baglanti_olustur()

        self.init_ui()
    def baglanti_olustur(self):
        baglanti = sqlite3.connect("database.db")

        self.cursor = baglanti.cursor()

        self.cursor.execute("Create Table If not exists üyeler (kullanıcı_adı TEXT,parola TEXT)")


        baglanti.commit()

    def init_ui(self):

        self.kullanici_adi =  QtWidgets.QLineEdit()
        self.parola = QtWidgets.QLineEdit()
        self.parola.setEchoMode(QtWidgets.QLineEdit.Password)
        self.giris = QtWidgets.QPushButton("Giriş Yap")
        self.yazi_alani = QtWidgets.QLabel("")


        v_box = QtWidgets.QVBoxLayout()

        v_box.addWidget(self.kullanici_adi)
        v_box.addWidget(self.parola)
        v_box.addWidget(self.yazi_alani)
        v_box.addStretch()
        v_box.addWidget(self.giris)


        h_box = QtWidgets.QHBoxLayout()

        h_box.addStretch()
        h_box.addLayout(v_box)
        h_box.addStretch()


        self.setLayout(h_box)

        self.setWindowTitle("Kullanıcı Girişi")
        self.giris.clicked.connect(self.login)

        self.show()
    def login(self):

        adi = self.kullanici_adi.text()
        par = self.parola.text()

        self.cursor.execute("Select * From üyeler where kullanıcı_adı = ? and parola = ?",(adi,par))

        data = self.cursor.fetchall()

        if len(data) == 0:
            self.yazi_alani.setText("Böyle bir kullanıcı yok\nLütfen tekrar deneyin.")
        else:
            self.yazi_alani.setText("Hoşgeldiniz " + adi)






app = QtWidgets.QApplication(sys.argv)

pencere = Pencere()

sys.exit(app.exec_())

Kayıt ol kısmı mı eklemek istiyorsunuz yani

Kayıt ol’da olabilir hem daha iyi olur. Kayıt ol dedikten sonra, giriş yapmayı deneyebilir, kullanıcı adı ve sifre hatalıysa, hata mesajını kullanıcıya gösterebilir.

Kodun çalışmama sebebi labelYaziEkrani nin pencereye atanmamış olmasıdır. Eve geleyim kayıt ol yapmanıza yardımcı olurum.

ooo tkinter i bırakmışsın. qt hayırlı olsun. istediğn kodun yazdım ama buraya atmaktan vazgeçtim. sebebi internetten bulduğun kodu buraya atıp neden olmuyo dediğin için. kod ile senin istediğin o kadar alakasız ki. git sql öğren. veritabanına nasıl veri kaydedilir. veritabanından nasıl veri çekilir. bu kodu kim yazdıysa bida yazmasın.

Tkinter’i uzun zamandir kullanmiyorum. Hatta Python’la bile yaklasık 1 yıldır kodlama çalışmıyorum. Kotlin Android’e yonelmiştim. Android studioda surekli sorunlarla karsılasınca, Python’a geri döndüm. zaman uzun olunca bazı seyleri unuttum. Veritabanina veriyi ekliyorum zaten. orada sıkıntı yasamiyorum. verileri eşleştiremiyorum. Ayrıca teşekkür ederim. Yardım edip etmemek size kalmış. zaten yeni öğrenmeye başlayanlar olarak örnek kaynaklarida paylasiyoruz. yazılı veya görsel farketmez. yapamadigimiz yerlerde sağolsun bilen arkadaslar yardımcı oluyorlar.

    def giris(self):
        adi = self.lineKullaniciAdi.text()
        parola = self.lineParola.text()

        ekle = """INSERT INTO Login(kullaniciAdi,sifre)VALUES(?,?)"""
        deger = ("kenan","123456")


        self.cur.execute(ekle,deger)
        self.baglanti.commit()

bu sekilde veriyi veritabanına işliyorum.
ben sadece bu işlemi db browserden yaptim. kodların içine dökmedim. bu sekilde yapsam bile veriyi ekleyebiliyorum lakin, eşleştirmeyi yapamiyorum.

Teşekkür ederim, kodunuzu bekliyorum.

seni başkasıyla karıştırmışım ya pardon :stuck_out_tongue: seni o olduğunu düşünerek öle yazdım :smiley: kusura bakma soyadı benzerliği diyelim.

soy adda benzemiyoki la o skyfall ppyi benzetmişsindir

Kodu direk yazıp arayımmı yoksa açıklamasıylamı atayım

Eşleştirmeyi yapabiliyorsunuz lakin ama çıktıyı verdiğiniz label pencereye eklenmemiş.

valla o sandım :D:D:D:D

Açıklamasıyla yazıp buraya atarsan sevinirim. diğer öğrenmek isteyen arkadaslarada kaynak olmus olur.

from sys import exit, argv
import sqlite3
from PyQt5.QtWidgets import QMainWindow, QLabel, QLineEdit, QPushButton, QApplication
from PyQt5.QtGui import QFont

import kısmını böyle yaptım böyle alıştığım için performansı etkilemiyor diye biliyorum.Sonra initin içinde self.giris() vardı adam daha parolayı ve kullanıcı adını girmediği için fonksiyonun devreye girmesine gerek yok. Kodunuzun neden çalışmadığına gelirsek self.labelYaziEkrani = QLabel("") yukarıda böyle tanımlamışsınız herhangi bir pencereye atamamışsınız labeli

    self.labelYaziEkrani = QLabel("",self)

böyle yapıp pencereye atarsanız kullanıcı bulunamadı diyecektir ama bu pek göze hoş gelmiyor bunun yerine hata ekranı yapmayı tercih ederim ben onun içinde QMessageBox kullanabiliriz bunun için önce Bunu QtWidgets dan import ediyoruz.

from PyQt5.QtWidgets import QMainWindow, QLabel, QLineEdit, QPushButton, QApplication, QMessageBox

Daha sonra bir tane fonksiyon oluşturuyoruz. (burada gerek olmayabilir ama pek çok yerde hata vermesini istediğimiz projelerde bize kolaylık sağlayacaktır)

    @staticmethod
    def hataver(sebep):
        # Bir sebep al bu sebeple hata oluşturma fonksiyonumuz gerektiğinde çağıracağız
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setText(sebep)
        msg.setWindowTitle("Hata")
        msg.exec_()

Message boxu oluşturuyoruz sonra iconunu hata iconu yapıyor hata mesajını ayarlıyoruz başlık atıyoruz ve döngüyü başlatıyoruz. self.labelYaziEkrani.setText("Kullanıcı bulunamadı") olan kısamada self.hataver("Kullanıcı bulunamadı") yazıyoruz.else yi siz ayarlarsınız orasıda giriş yaptıktan sonraki yer şimdi kayıt ol ayarlayacağız. Öncelikle bir buton atıyoruz.

        self.butonKayıt = QPushButton(self)
        self.butonKayıt.setText("Kayıt ol")
        self.butonKayıt.move(10, 140)
        self.butonKayıt.setFont(QFont("Arial", 10, QFont.Bold))
        self.butonKayıt.clicked.connect(self.kayit_ol)

Şimdi kayıt ol fonksiyonunun içini dolduralım. Ben bilgilerin girilmesi için bir QDialog oluşturmayı düşünüyorum siz ana pencerenizde de yapabilirsiniz.

    def kayit_ol(self):
        kayıt_ol_ekran=QDialog()
        kayıt_ol_ekran.resize(300,300)
        label = QLabel("Kullanıcı adı",kayıt_ol_ekran)
        label.move(110,30)
        label = QLabel("Şifre",kayıt_ol_ekran)
        label.move(110,130)

        kullanici_adi = QLineEdit(kayıt_ol_ekran)
        kullanici_adi.move(80,50)

        sifre = QLineEdit(kayıt_ol_ekran)
        sifre.move(80,150)


        buton=QPushButton("Gönder",kayıt_ol_ekran)
        buton.move(90,180)

        def kayit_kontrol():
            self.cur.execute("SELECT * FROM login2 WHERE kullaniciAdi = ?", (kullanici_adi.text(),))
            liste = self.cur.fetchall()
            if len(liste) != 0:
                self.hataver("Kullanıcı mevcut")
            else:
                self.cur.execute("INSERT INTO login2 VALUES(?,?)",(kullanici_adi.text(),sifre.text()))
                self.baglanti.commit()

                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setText("Başarıyla kayıt oldunuz")
                msg.setWindowTitle("Bilgilendirme")
                msg.exec_()


                kayıt_ol_ekran.close()
        buton.clicked.connect(kayit_kontrol)

        kayıt_ol_ekran.exec_()

Bir QDialog oluşturduk bunun boyutunu atadık yazıları , lineeditleri ve butonumuzu atadık.Butona tıklandığında kayıt kontrol fonksiyonu çalışsın dedik.Kullanıcı bizim girdiğimiz kullanıcı adı olanları seç db den ve onu listeye ata listenin uzunluğu 0 değilse yani bu ad alındıysa Kullanıcı mevcut diye hata versin eğer listenin uzunluğu 0 ise yani böyle bir ad yoksa veritabanına ekle sonra bir bilgilendirme mesajı çıkar ve bilgilendirme mesajını adam kapanırsa kayıt ol ekranınıda kapat.Anlamadığınız yer olursa sorabilirsiniz.
Not:Dün unutmuşum şimdi aceleyle yazdım kayıt ol kısmı boş bırakılırsa hata ver falan onları eklemedim yada layout kullanmadım.

Tesekkur ederim reis, eve gectigimde kodlar uzerinde calisacagim.