PyQt5 Test Programı

Merhabalar. datadan aldıgım verilerle test uygulaması yapmaya calısıyorum.
Uygulama çalısıyor , Ama 1 işlemden sonra kapanıyor.
Bunu bir döngüye nasıl koyabilirim?
Mesela butona bastığım zaman yenı soru ve cevaplar gelecek.

Artı olarak kod dızılımını karman çorman yaptıgımı dusunuyorum.Bu konuda ufak tavsıyeler verebılırmısınız.
Teşekkürler.

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

class Window(QDialog):


    def __init__(self):

        super().__init__()
        con = sqlite3.connect("database.db")
        cursor = con.cursor()
        cursor.execute("Create Table If not exists Kelimeler (ingilizce,Türkçe )")
        con.commit()
        con.close()

        con = sqlite3.connect("database.db")
        cursor = con.cursor()
        cursor.execute("Insert into Kelimeler Values('accept','kabuletmek')")
        cursor.execute("Insert into Kelimeler Values('act','davranmak')")
        cursor.execute("Insert into Kelimeler Values('add','ilave etmek')")
        cursor.execute("Insert into Kelimeler Values('affect','etkilemek')")
        cursor.execute("Insert into Kelimeler Values('afford','satın almaya parası yetmek')")
        cursor.execute("Insert into Kelimeler Values('agree','aynı fikirde olmak')")
        con.commit()
        con.close()

        con = sqlite3.connect("database.db")
        cursor = con.cursor()
        cursor.execute("Select ingilizce,Türkçe From Kelimeler")
        liste = cursor.fetchall()
        print(liste)
        a = dict(liste)
        print(a.keys())
        k = list(a.keys())
        self.b = random.choice(k)
        self.b2 = random.choice(k)
        self.b3 = random.choice(k)
        self.b4 = random.choice(k)

        self.b0 = a.get(self.b)
        self.b02 = a.get(self.b2)
        self.b03 = a.get(self.b3)
        self.b04 = a.get(self.b4)
        self.liste2 = list()
        self.liste2.append(self.b)
        self.liste2.append(self.b2)
        self.liste2.append(self.b3)
        self.liste2.append(self.b4)
        self.t = random.choice(self.liste2)
        self.z = a.get(self.t)
        self.setWindowTitle("Kelime  Testi")
        self.setGeometry(100, 100, 900, 650)
        self.initUI()

    def initUI(self):
        self.secim = QRadioButton(self)
        self.secim.setGeometry(70, 100, 141, 61)
        font = QFont()
        font.setPointSize(18)
        self.secim.setFont(font)
        self.secim.setObjectName("checkBox")
        self.secim2 = QRadioButton(self)
        self.secim2.setGeometry(70, 170, 141, 61)
        font = QFont()
        font.setPointSize(18)
        self.secim2.setFont(font)
        self.secim2.setObjectName("checkBox_2")
        self.secim3 = QRadioButton(self)
        self.secim3.setGeometry(70, 240, 141, 51)
        font = QFont()
        font.setPointSize(18)
        self.secim3.setFont(font)
        self.secim3.setObjectName("checkBox_3")
        self.secim4 = QRadioButton(self)
        self.secim4.setGeometry(70, 310, 141, 51)
        font = QFont()
        font.setPointSize(18)
        self.secim4.setFont(font)
        self.secim4.setObjectName("checkBox_4")

        self.pushButton = QPushButton(self)
        self.pushButton.setGeometry(70, 390, 121, 41)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("Yeni Soru")
        self.label = QLabel(self)
        self.label.setGeometry(30, 80, 201, 31)
        font = QFont()
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setObjectName("label")

        self.textBrowser = QTextBrowser(self)
        self.textBrowser.setGeometry(300, 90, 411, 421)
        font = QFont()
        font.setFamily("Nirmala UI Semilight")
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.textBrowser.setFont(font)
        self.textBrowser.setObjectName("textBrowser")

        self.label_2 =QLabel(self)
        self.label_2.setGeometry(20, 20, 421, 51)
        font = QFont()
        font.setPointSize(18)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 =QLabel(self)
        self.label_3.setGeometry(50, 525, 421, 51)
        font = QFont()
        font.setPointSize(14)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")

        self.pushButton_2 = QPushButton(self)
        self.pushButton_2.setGeometry(620, 522, 161, 41)
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QPushButton(self)
        self.pushButton_3.setGeometry(620, 570, 161, 31)
        self.pushButton_3.setObjectName("pushButton_3")


                                                        #self.pushButton_2.clicked.connect(button2tıklandı)
                                                       #self.pushButton_3.clicked.connect(button3tıklandı)
                                                      #self.pushButton.clicked.connect(button1tıklandı)
        
        self.secim.setText(self.b)

        self.secim2.setText(self.b2)

        self.secim3.setText(self.b3)

        self.secim4.setText(self.b4)       

        self.label_2.setText(self.z)

        self.secim.toggled.connect(self.toggleRadio)
        self.secim2.toggled.connect(self.toggleRadio)
        self.secim3.toggled.connect(self.toggleRadio)
        self.secim4.toggled.connect(self.toggleRadio)

        self.show()

    def toggleRadio(self,t):

        rdButon = self.sender()
        w1 = rdButon.text()
        print(self.t)
        if (w1 == self.t):
            print("Dogru Cevap")
            self.label_3.setText("Doğru Cevap Verdiniz: " + rdButon.text())
        else:
            print("yanlıs")
            self.label_3.setText("Yanlıs Cevap Verdiniz:{} \n Doğru Cevap:{}".format(rdButon.text(),self.t))

                        
    #def button1tıklandı():


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Merhaba.

Bu data bizde yok. Kodu çalıştıramıyoruz.

Değişken isimleri daha anlamlı yapılabilir. Zaten listeye ekleyeceğiniz şeyleri bir değişken haline getirmenize gerek yok:

Mesela şu kısım:

        self.b = random.choice(k)
        self.b2 = random.choice(k)
        self.b3 = random.choice(k)
        self.b4 = random.choice(k)
        ...
        self.liste2 = list()
        self.liste2.append(self.b)
        self.liste2.append(self.b2)
        self.liste2.append(self.b3)
        self.liste2.append(self.b4)

şu hale getirebilir:

        self.liste2 = [random.choice(k) for i in range(4)]

self.secimX değişkenleri de döngü ile oluşturulup bir liste içinde tutulmaya uygun.

1 Beğeni

Teşekkür Ederim .
Kodları küçük bir database oluşturacak şekilde düzenledim.
Yeni Soru butonuyla pencereye yeni bilgileri nasıl aktarabilirim?

1 Beğeni

Şu kodu inceleyin anlamadığınız bir yer olursa sorabilirsiniz:

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

class Window(QDialog):


    def __init__(self):

        super().__init__()

        self.setWindowTitle("Kelime  Testi")
        self.setGeometry(100, 100, 900, 650)
        
        con = sqlite3.connect("C:/Users/gg/Desktop/database.db")
        cursor = con.cursor()
        cursor.execute('Select "İngilizce","Türkçe" From Kelimeler')
        self.data = cursor.fetchall()
        cursor.close()
        self.sözlük = dict(self.data)
##        print(liste)
##        print(a.keys())

        self.setUI()
        self.nextQuestion()
        self.updateUI()
        
    def nextQuestion(self):
        keys = list(self.sözlük.keys())
        self.ingilizce_kelimeler = [random.choice(keys) for i in range(4)]
        self.türkçe_kelimeler = [self.sözlük[i] for i in self.ingilizce_kelimeler]
        
        self.ingilizce_kelime = random.choice(self.ingilizce_kelimeler)
        self.türkçe_karşılık = self.sözlük[self.ingilizce_kelime]
    
    def setUI(self):
        """Create UI elements."""
        self.seçim_butonları = []
        y = 100
        font = QFont()
        font.setPointSize(18)
        for i in range(4):
            b = QRadioButton(self)
            b.setGeometry(70, y, 141, 61)
            b.setFont(font)
            b.setObjectName("checkBox_" + str(i))
            b.toggled.connect(self.toggleRadio)
            self.seçim_butonları.append(b)
            y += 70

        self.pushButton = QPushButton(self)
        self.pushButton.setGeometry(70, 390, 121, 41)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("Yeni Soru")
        
        self.label = QLabel(self)
        self.label.setGeometry(30, 80, 201, 31)
        font = QFont()
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setObjectName("label")

        self.textBrowser = QTextBrowser(self)
        self.textBrowser.setGeometry(300, 90, 411, 421)
        font = QFont()
        font.setFamily("Nirmala UI Semilight")
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.textBrowser.setFont(font)
        self.textBrowser.setObjectName("textBrowser")

        self.label_2 = QLabel(self)
        self.label_2.setGeometry(20, 20, 421, 51)
        font = QFont()
        font.setPointSize(18)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        
        self.label_3 = QLabel(self)
        self.label_3.setGeometry(50, 525, 421, 51)
        font.setPointSize(14) # yukarıdaki font duruyor
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")

        self.pushButton_2 = QPushButton(self)
        self.pushButton_2.setGeometry(620, 522, 161, 41)
        self.pushButton_2.setObjectName("pushButton_2")
        
        self.pushButton_3 = QPushButton(self)
        self.pushButton_3.setGeometry(620, 570, 161, 31)
        self.pushButton_3.setObjectName("pushButton_3")


                                                        #self.pushButton_2.clicked.connect(button2tıklandı)
                                                       #self.pushButton_3.clicked.connect(button3tıklandı)
                                                      #self.pushButton.clicked.connect(button1tıklandı)
        
    def updateUI(self):
        """Update UI elements."""
        for i, j in zip(self.seçim_butonları, self.ingilizce_kelimeler):
            i.setText(j)

        self.label_2.setText(self.türkçe_karşılık)

    def toggleRadio(self, t):

        rdButon = self.sender()
        w1 = rdButon.text()
        print(self.ingilizce_kelime)
        if (w1 == self.ingilizce_kelime):
            print("Dogru Cevap")
            self.label_3.setText("Doğru Cevap Verdiniz: " + rdButon.text())
        else:
            print("yanlıs")
            self.label_3.setText("Yanlıs Cevap Verdiniz:{} \n Doğru Cevap:{}".format(rdButon.text(),self.ingilizce_kelime))

                        
    #def button1tıklandı():


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Yeni soru getirmek icin nextQuestion ve updateUI metodlarını çağırmanız yeterli olur sanırım.

1 Beğeni

Tekrardan teşekkur ederım. Yeniyim ben daha pythonda biraz zaman alacak incelemem.

1 Beğeni

Kodda ilk yapilmasi gereken sey kodun birbirinden farkli sorumluluklara sahip iki ayri katmana ayrilmasi. Database (bu arada database’e kisaca “data” demiyoruz cunku “data” kelimesinin kendi, farkli bir anlami var) ile kullanici arayuzunu ayirarak baslamamiz lazim.

Bunun icin gereken SoruVeritabani tasarimi asagi yukari soyle bir sey olsa gerek:

class SoruVeritabani:
    def __init__(self):
        # Baglantiyi kur

    def rastgele_soru_al(self):
        soru = ...
        cevaplar = ...
        dogru_cevap = ...
        return (soru, cevaplar, dogru_cevap)

Eger return’deki gibi tuple kullanimina asina degilsen (veya oyleysen bile) soru metnini, cevap siklarini ve dogru sikki iceren bir Soru sinifi yaratmak da isteyebilirsin; bu durumda rastgele_soru_al bir adet Soru dondurur.

Her halukarda Window sinifi database islemleriyle iki satirdan fazla ugrasmamis olur.

Kodu bu sekilde ikiye ayiramiyorsan da, ayirabilene kadar karman cormanligini dert edinmemeni tavsiye ederim.

Veya baska bir alternatif de giris ve cikis noktalari belli olan ve etrafindaki koddan nispeten bagimsiz bir sey yapan kisimlari bulup fonksiyona cevirmek. Mesela veritabanina_baglan_ve_birsey_listesi_dondur bir fonksiyon olabilir bu kodda. (Ne listesi oldugunu ben de bilmiyorum, degisken isimlendirilmemis.)

1 Beğeni