Problem ze zmiennymi w różnych klasach

0

Hejka, w poniedziałek zabrałem się za zadanie wykonania czytnika RDP w Pythonie. Jest to moja pierwsza aplikacja obiektowa i jak udawało mi się rozwiązywać pewne problemy wyszukując ich w internecie to teraz od kilku godzin nie jestem w stanie rozwiązać jednego z nich. Problemem jest to, że nie potrafię wykorzystać zmiennej self.row = self.cursor.fetchone() w klasie class Second_Window(QMainWindow). Klasa Second_Window jest najzwyklejszym drugim oknem, które otwiera się po naciśnięciu przycisku.

Cały kod bez stysheeta:

from PyQt5.Qt import *
import sys
import mysql.connector as mysql

class Czytnik(QMainWindow):
    def __init__(self, parent=None):
        super(Czytnik, self).__init__(parent)

        self.interfejs()

    def interfejs(self):
        etykieta1 = QLabel("Wprowadź numer pracownika (np. 202034201):", self)
        etykieta1.setGeometry(QRect(6,0, 700,21))

        self.numer = QLineEdit(self)
        self.numer.setValidator(QIntValidator(0, 100000000))
        self.numer.setStyleSheet("font-size: 27px; font-weight: bold;")
        self.numer.setGeometry(QRect(5, 25, 990, 60))

        self.wprowadz = QPushButton("&Wprowadz", self)
        self.wprowadz.setGeometry(QRect(4, 89, 992, 62))
        self.wprowadz.clicked.connect(self.dzialanie)
        self.dialogs = list()
        self.dialogss = list()

        etykieta2 = QLabel("SMART", self)
        etykieta2.setGeometry(QRect(390, 270, 700, 73))
        etykieta2.setStyleSheet("font-size: 65px; font-weight: normal;")
        etykieta3 = QLabel("WORKER", self)
        etykieta3.setGeometry(QRect(365, 340, 700, 73))
        etykieta3.setStyleSheet("font-size: 65px; font-weight: normal;")

        self.setGeometry(100, 100, 1000, 700)
        self.setWindowTitle("Czytnik RDP - ZAP RACHUNKOWOŚĆ")
        self.show()

    def dzialanie(self):
        wynik = self.numer.text()
        db = mysql.connect(host='localhost', user='root', password='', db='projekt_zap')
        self.cursor = db.cursor()

        self.cursor.execute("SELECT imie FROM pracownicy WHERE id_numer = '%s'" % wynik)
        self.row = self.cursor.fetchone()

        if str(wynik) == "":
            dialog1 = Third_Window(self)
            self.dialogss.append(dialog1)
            dialog1.show()
        else:
            dialog = Second_Window(self)
            self.dialogs.append(dialog)
            dialog.show()

        db.close()

class Second_Window(QMainWindow):
    def __init__(self, parent=None):
        super(Second_Window, self).__init__(parent)

        self.wyswietlanie()

    def wyswietlanie(self):
        etykieta = QLabel("Imie: ", self)
        etykieta.setGeometry(6, 0, 990, 21)

        koniecBtn = QPushButton("&Koniec", self)
        koniecBtn.setGeometry(QRect(4, 325, 982, 62))
        koniecBtn.clicked.connect(self.koniec)

        self.setGeometry(105, 218, 990, 390)
        self.setWindowTitle("Potwierdzenie kodu")

    def koniec(self):
        self.close()

class Third_Window(QMainWindow):
    def __init__(self, parent=None):
        super(Third_Window, self).__init__(parent)

        self.interfejs()

    def interfejs(self):
        informacja = QLabel("Błędne dane!", self)
        informacja.setGeometry(310,124,990,80)
        informacja.setStyleSheet("font-size: 65px; font-weight: normal;")

        okBtn = QPushButton("&Okej", self)
        okBtn.setGeometry(QRect(4, 325, 982, 62))
        okBtn.clicked.connect(self.koniec)

        self.setGeometry(105, 218, 990, 390)
        self.setWindowTitle("Potwierdzenie kodu")

    def koniec(self):
        self.close()

def main():
    app = QApplication(sys.argv)
    main = Czytnik()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
0

Second_Window jest tworzone zaraz za tym, więc najlepiej by było, żebyś te dane przekazał w konstruktorze.

0

@tsz: Próbowałem przekazywać na kilka sposobów za pomocą konstruktora, ale nie do końca mi to wychodziło. Jesteś w stanie mi pokazać jak to zrobić?

1

Pierwszy problem polega na tym że nie odróżniasz KLASY od OBIEKTU. Klasa określa TYP danych. Wyobraź sobie że zrobię:

    main1 = Czytnik()
    main1.show()
    main2 = Czytnik()
    main2.show()

I co teraz? Co w takiej sytuacji oznacza

Problemem jest to, że nie potrafię wykorzystać zmiennej self.row = self.cursor.fetchone() w klasie class Second_Window(QMainWindow)

Masz teraz dwa obiekty typu Czytnik a tym samym dwie zupełnie niezależne zmienne self.row w każdym z tych obiektów. Z którego ma niby korzystać twoje Second_Window? Skąd ma to wiedzieć?
Szczęśliwie dla ciebie, ukradłeś jakiś sensowny kod i twoja klasa Second_Window ma parametr parent, który to wskazuje na odpowiadający obiekt typu Czytnik. Tylko że nic z tym parametrem nie robisz. Jakbyś w konstruktorze gdzieś go sobie zapisał np. self.ugabuga = parent to następnie gdzieśtam dalej w kodzie mógłbyś zrobić self.ugabuga.row.

Niemniej to nie rozwiąże twoich problemów, bo np. z tego co widzę to tworzysz NOWE OKIENKO za każdym razem.


        if str(wynik) == "":
            dialog1 = Third_Window(self)
            self.dialogss.append(dialog1)
            dialog1.show()
        else:
            dialog = Second_Window(self)
            self.dialogs.append(dialog)
            dialog.show()

Tutaj za każdym razem kiedy wywołasz ten kod utworzy się NOWE okno...

1 użytkowników online, w tym zalogowanych: 0, gości: 1