应用程序结构应该如何?

时间:2019-08-08 17:18:27

标签: python class theory

我正在尝试创建一个小型数据库应用程序,以将所有客户端保留在其中。我想使用PyQt5编写GUI。我在了解应用程序结构应如何时遇到问题。 我想有一个主类来启动应用程序,我想将GUI,DB和Main类分别放在不同的文件中。

您可以在下面看到我的代码段。这是行不通的,因为某些变量无法识别,而且我不明白为什么。

我的想法: 1.在窗口中,将在主类 init 函数中创建tab1对象 2.创建window时,创建tab1实例,其 init 中的方法将被调用 3.我有window,tab1对象,并且变量本身可用

没有为TabNewClient类定义

window.gbT1Main.setLayout(T1LayMain)。为什么呢我应该如何更改代码以实现上述要求?请解释一下我该如何连接我的课程:(

Window和TabNewClient类(窗口,tab1)

from PyQt5.QtWidgets import QApplication, QDialog, QTabWidget, QGroupBox, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFormLayout, QLineEdit, QDateEdit, QTextEdit, QRadioButton, QGridLayout
import sys
import datetime

class Window(QDialog):
    def __init__(self):
        super().__init__()

        self.InitWindow()

    def InitWindow(self):
        # create tab widget
        self.tab = QTabWidget()

        # create MainWindow groupbox
        self.gbMainWindow = QGroupBox()

        # TAB groupBoxes
        self.gbT1Main = QGroupBox()
        self.gbT2Main = QGroupBox("Main2")
        self.gbT3Main = QGroupBox("Main3")

        # Adding tabs
        self.tab.addTab(self.gbT1Main, "Dodaj klienta")
        self.tab.addTab(self.gbT2Main, "Wyszukaj")
        self.tab.addTab(self.gbT3Main, "Statystki")

        # Setting MainWindow title
        self.setWindowTitle("MEDIKAP - gabinet medycyny pracy")

        # Main Window Layout
        self.layMainWindow = QHBoxLayout()

        # Set MainWindow Layout
        self.layMainWindow.addWidget(self.tab)
        self.gbMainWindow.setLayout(self.layMainWindow)

        # set MainWindow layout visible
        self.setLayout(self.layMainWindow)

        #show window
        self.show()

class TabNewClient:
    def __init__(self):
        self.CreateTab1Layout()

    def CreateTab1Layout(self):

        self.gbAddClient = QGroupBox("Dane klienta")
        self.gbRodzajBadania = QGroupBox("Podstawa prawna")
        self.gbDane = QGroupBox()
        self.gbComment = QGroupBox("Komentarz")
        self.gbButtons = QGroupBox()

        # TAB1 - layouts
        T1LayMain = QVBoxLayout()
        layDane = QHBoxLayout()

        # TAB1
        layDane.addWidget(self.gbAddClient)
        layDane.addWidget(self.gbRodzajBadania)
        self.gbDane.setLayout(layDane)

        # TAB1 - set layout to Main
        T1LayMain.addWidget(self.gbDane)
        T1LayMain.addWidget(self.gbComment)
        T1LayMain.addWidget(self.gbButtons)

        window.gbT1Main.setLayout(T1LayMain)

主类:


from PyQt5.QtWidgets import QApplication
import sys
from guiv3 import Window, TabNewClient

class Main:
    def __init__(self):

        window = Window()
        tab1 = TabNewClient()

if __name__ == "__main__":
    app = QApplication(sys.argv)

    main = Main()

    app.exec_()

错误: window.gbT1Main.setLayout(T1LayMain) NameError:未定义名称“窗口”

1 个答案:

答案 0 :(得分:0)

要回答为什么您会收到有关未定义“窗口”的错误的问题,我相信这是因为window类中没有TabNewClient变量。似乎您正在尝试引用window中定义的Main,但由于该变量不在TabNewClient类的范围内,因此该方法不起作用。我的猜测是,您将遇到gbT1Main的同一问题,因为这同样不在TabNewClient类的范围内。

编辑:我想我了解您在这里尝试的内容。您希望gbT1Main中与window相关的标签保留tab1中的布局。为此,您需要在window中设置Main的布局:

from PyQt5.QtWidgets import QApplication
import sys
from guiv3 import Window, TabNewClient

class Main:
    def __init__(self):

        window = Window()
        tab1 = TabNewClient()
        window.gbT1Main.setLayout(tab1.T1LayMain)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    main = Main()

    app.exec_()

这很可能是您要寻找的东西。

重要提示::这还要求T1LayMainTabNewClient类的属性,因此请在该类内部使用self.T1LayMain,以便可以在其外部进行访问