【问题标题】:How application structure should looks like?应用程序结构应该是什么样子?
【发布时间】:2019-08-08 17:18:27
【问题描述】:

我正在尝试创建一个小型数据库应用程序以将所有客户端保留在内部。我想使用 PyQt5 编写 GUI。我无法理解应用程序结构的外观。 我想要一个启动应用程序的主类,并且我想将 GUI、DB 和 Main 类分开在不同的文件中。

你可以在下面看到我的代码 sn-ps。它不起作用,因为某些变量无法识别,实际上我不明白为什么。

我的想法: 1.窗口,tab1对象将在主类init函数中创建 2、window、tab1实例创建后,其init里面的方法会被调用 3. 我有 window, tab1 对象,它的变量可以自己使用

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

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: 名称“窗口”未定义

【问题讨论】:

  • 您能否向我们展示完整的追溯?
  • 关于结构,google for MVC - Model - View - Controller,这是一种比较常见的软件设计模式。数据库是模型,视图是应用程序。两者都是分开的东西。它们由一个控制器连接,在它们之间进行协商。

标签: python class theory


【解决方案1】:

要回答为什么您会收到关于未定义“窗口”的错误的问题,我相信这是因为TabNewClient 类中没有window 变量。看起来您正试图引用Main 中定义的window,但这不起作用,因为该变量不在TabNewClient 类的范围内。我的猜测是你会在gbT1Main 遇到同样的问题,因为这也超出了TabNewClient 类的范围。

编辑:我想我明白你在这里尝试什么。您希望window 中的gbT1Main 相关选项卡保留tab1 的布局。为此,您需要在Main 中设置window 的布局:

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_()

这很可能是您正在寻找的。​​p>

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

【讨论】:

  • 我正在尝试分离 GUI、数据库和更多文件并在 Main 类中运行它们(创建 GUI、DB 对象)。或者也许更好的主意是将所有类保存在一个 python 文件中?我想知道哪种方法最能让我的应用程序尽可能易于理解和清晰,但我不知道如何用谷歌搜索它:D
  • 查看我的更新答案。我想我明白你想要什么,但老实说我不确定。我主要是想了解window.gbT1Main.setLayout(T1LayMain) 完成了什么。
  • 这帮助我摆脱了 gbT1Main 的错误,但另一个问题是 GUI 窗口在我运行应用程序后立即消失。当我将以下代码放入包含 window 和 TabNewClient 类的文件中时,一切正常,我可以看到 GUI:python if __name__ == "__main__": app = QApplication(sys.argv) window = Window() tab1 = TabNewClient() app.exec_()
猜你喜欢
  • 2011-05-18
  • 2016-12-28
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
相关资源
最近更新 更多