Çözüldü Python PyQt5 variable sorunu

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

SkyRose

Megapat
Katılım
26 Haziran 2019
Mesajlar
6.069
Makaleler
5
Çözümler
59
Merhaba. İlk önce kodları paylaşayım.

Python:
import sys
import random
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QLabel
from PyQt5.QtGui import *
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QIcon

class Verbs():
    def __init__(self, name, type, point):
        self.type = type
        self.name = name
        self.point = point

like = Verbs("Like", "both", 10)
admit = Verbs("Admit", "gerund", 10)
advise = Verbs("Advise", "both", 10)
appreciate = Verbs("Appreciate", "gerund", 10)
avoid = Verbs("Avoid", "gerund", 10)
consider = Verbs("Consider", "both", 10)
delay = Verbs("Delay", "gerund", 10)
forgive = Verbs("Forgive", "gerund", 10)
prevent = Verbs("Prevent", "gerund", 20)
recommend = Verbs("Recommend", "both", 10)
report = Verbs("Report", "gerund", 10)
appear = Verbs("Appear", "infinitive", 10)
agree = Verbs("Agree", "infinitive", 20)
arrange = Verbs("Arrange", "infinitive", 10)
hope = Verbs("Hope", "infinitive", 10)
mean = Verbs("Mean", "both", 10)
offer = Verbs("Offer", "infinitive", 10)
expect = Verbs("Expect", "infinitive", 10)
command = Verbs("Command", "infinitive", 20)
bring = Verbs("Bring", "infinitive", 20)
remember = Verbs("Remember", "both", 10)
stop = Verbs("Stop", "both", 10)
tryf = Verbs("Try", "both", 10)
forget = Verbs("Forget", "both", 10)
regret = Verbs("Regret", "both", 10)
refuse = Verbs("Refuse", "infinitive", 10)
accuse = Verbs("Accuse", "gerund", 10)
adj = Verbs("*Adjective'lerden sonra gelen", "infinitive", 10)
prep = Verbs("*Preposition'lardan sonra gelen", "gerund", 10)
deny = Verbs("Deny", "gerund", 10)
learn = Verbs("Learn", "infinitive", 10)
help1 = Verbs("Help", "both", 10)
mind = Verbs("Mind", "gerund", 10)
promise = Verbs("Promise", "infinitive", 20)
chose = Verbs("Choose", "infinitive", 10)
wait = Verbs("Wait", "infinitive", 10)
prepare = Verbs("Prepare", "infinitive", 10)
afford = Verbs("Afford", "gerund", 10)
risk = Verbs("Risk", "gerund", 30)

verblist = [like, admit, advise, appreciate, avoid, consider, delay, forgive, prevent, recommend, report, appear, agree, arrange, hope,
            mean, offer, expect, command, bring, remember, tryf, forget, regret, refuse, accuse, adj, prep, deny,
            learn, help1, mind, promise, chose, wait, prepare, afford, risk]

random.shuffle(verblist)


class MyWindow(QMainWindow):

    def __init__(self):
        super(MyWindow, self).__init__()

        self.setWindowTitle("Quiz")
        self.setGeometry(300, 300, 330, 250)
        self.initUI()
        self.setStyleSheet("background-color: paleturquoise;")
        self.setWindowIcon(QIcon(r"C:\Users\-kullanıcı adım-\Desktop\efektler\b.png"))

    def initUI(self):
        self.lbl_name = QtWidgets.QLabel(self)
        self.lbl_name.setText("WELCOME!")
        self.lbl_name.move(130, 10)

        self.lbl_name2 = QtWidgets.QLabel(self)
        self.lbl_name2.setText("SCORE:")
        self.lbl_name2.move(15, 180)
        self.lbl_name2.setFont(QFont('Times', 12))

        self.score = QtWidgets.QLabel(self)
        self.score.setText(f"{0}")
        self.score.move(100, 180)
        self.score.resize(50, 30)
        self.score.setFont(QFont('Arial', 20))
        self.score.setStyleSheet("background-color: royalblue;")

        self.txt_name = QtWidgets.QLineEdit(self)
        self.txt_name.move(10, 130)
        self.txt_name.resize(100, 32)

        self.btn_save = QtWidgets.QPushButton(self)
        self.btn_save.setText("Check")
        self.btn_save.move(10, 50)
        self.btn_save.resize(100, 70)
        self.btn_save.clicked.connect(self.on_click)
        self.btn_save.setStyleSheet("background-color : white")

        self.btn2_save = QtWidgets.QPushButton(self)
        self.btn2_save.setText("Start")
        self.btn2_save.move(220, 100)
        self.btn2_save.clicked.connect(self.on_click2)
        self.btn2_save.setStyleSheet("background-color : white")

    @pyqtSlot()
    def on_click(self):
        if len(verblist) == 38:
            scor = 0

        if self.txt_name.text() == verblist[0].type:
            control1 = "Correct"
            control2 = "Correct"
            if scor == 0:
                scor = verblist[0].score
            else:
                scor += verblist[0].score
            print(f"""
User gained {10} points.
Now user has got {scor} points.
""")
            self.score.setText(f"{scor}")

        if self.txt_name.text() != verblist[0].type:
            control2 = (f"Incorrect! Answer of {verblist[0].name} was: {verblist[0].type}")
            control1 = "Wrong!"
        verblist.remove(verblist[0])

        self.reply = QMessageBox.question(self, control1, control2, QMessageBox.Yes | QMessageBox.No,
                                          QMessageBox.No)
        if self.reply == QMessageBox.Yes:
            print('Yes clicked.')
        else:
            self.reply2 = QMessageBox.question(self, "Bruh", "You cannot know better than me, what do you mean?", QMessageBox.No | QMessageBox.No,
                                 QMessageBox.No)
            if self.reply2 == QMessageBox.No:
                print("User punished for being fresh to ADMIN")
                scor = -99
                self.score.setText(f"{scor}")
            else:
                exit()



    def on_click2(self):
        while True:
            self.reply = QMessageBox.question(self, "Approve", f" Fiil: {verblist[0].name}",
                                              QMessageBox.Yes | QMessageBox.No,
                                              QMessageBox.No)

            if self.reply == QMessageBox.Yes:
                print(f"User choosed '{verblist[0].name}'")
                self.lbl_name.setText(f"{verblist[0].name}")
                break
            elif self.reply == QMessageBox.No:
                print(f"User refused {verblist[0].name}")
                verblist.remove(verblist[0])
                continue
            else:
                pass
            exit()

def window():
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

window()

Kodlar bu şekilde. Eğer kafa karıştırıcı olduysa sadece hataya sebep olan kısmı da ayrıca bir daha koyayım;

Python:
@pyqtSlot()
    def on_click(self):
        if len(verblist) == 38:
            scor = 0

        if self.txt_name.text() == verblist[0].type:
            control1 = "Correct"
            control2 = "Correct"
            if scor == 0:
                scor = verblist[0].score
            else:
                scor += verblist[0].score
            print(f"""
User gained {10} points.
Now user has got {scor} points.
""")
            self.score.setText(f"{scor}")

        if self.txt_name.text() != verblist[0].type:
            control2 = (f"Incorrect! Answer of {verblist[0].name} was: {verblist[0].type}")
            control1 = "Wrong!"
        verblist.remove(verblist[0])

        self.reply = QMessageBox.question(self, control1, control2, QMessageBox.Yes | QMessageBox.No,
                                          QMessageBox.No)
        if self.reply == QMessageBox.Yes:
            print('Yes clicked.')
        else:
            self.reply2 = QMessageBox.question(self, "Bruh", "You cannot know better than me, what do you mean?", QMessageBox.No | QMessageBox.No,
                                 QMessageBox.No)
            if self.reply2 == QMessageBox.No:
                print("User punished for being fresh to ADMIN")
                scor = -99
                self.score.setText(f"{scor}")
            else:
                exit()

PyQt5 ile arayüze sahip basit mi basit bir quiz uygulamasının scoreboard bölümünü yapıyordum. Her soru doğru bilindiğinde kullanıcıya 10 puan eklenecek ve kullanıcının yeni puanı da ekranda gösterilecekti.

Score'un hiçbir soru çözülmeden önce default bir değere sahip olması gerekiyordu (Variable referenced before assignment hatası almamak için), ben de fonksiyonun en başına "scor = 0" diye girdim. Fakat böyle olunca da her başa döndüğünde kullanıcının puanı 0'a resetleniyordu ve puan da artamıyordu. Bunu önlemek için "score = 0"'ı kaldırınca da hata alıyorum.

Score'u fonksiyonun daha üstünden tanımlayıp başlangıç harici bir daha kullanmamayı denedim ama yine "Local variable referenced before assignment" hatası aldım.

scor = 0 tanımlamasını if bloğu ile uygun belli başlı koşulların altına koyduğumda da (Böylece scor = 0'ı istediğim zaman kullanıp istediğim zaman devre dışı bırakabilecektim) yine hata aldım. Bunu nasıl çözebilirim?

Demin kodun okunabilirlik olarak biraz zayıf olduğunu fark ettim. Çok tecrübeli olmadığımdan elimden bu kadar geldi, eğer anlaşılmadıysa yeniden açıklayabilirim.
 
Son düzenleme:
Çözüm
Scor değişkenini herhangi bir fonksiyonun içinde local olarak değil de global olarak tanımlasan, ve orada bir başlangıç değeri atasan çalışması gerekir. Bunu denemiş miydin?
Scor değişkenini herhangi bir fonksiyonun içinde local olarak değil de global olarak tanımlasan, ve orada bir başlangıç değeri atasan çalışması gerekir. Bunu denemiş miydin?
 
Çözüm
Scor değişkenini herhangi bir fonksiyonun içinde local olarak değil de global olarak tanımlasan, ve orada bir başlangıç değeri atasan çalışması gerekir. Bunu denemiş miydin?
Hem başka bir fonksiyonun içinde, hem aynı fonksiyonun içinde, hem de herhangi bir fonksiyonun içinde olmadan denedim. Yine de tanımlanmamış sayıyor.

Yukarıya yazdığım;


Sorun olan kısım:

Edit: tanımlamayı fonksiyon dışından yapıp global'i de fonksiyon içinden yapınca oldu.
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…