【问题标题】:How to use this variable in another file如何在另一个文件中使用此变量
【发布时间】:2022-01-04 19:24:26
【问题描述】:

我正在处理我的项目,但每次尝试导入变量时都会遇到错误。我尝试了很多东西,但都没有效果。另外我知道最好不要使用 pyuic 自动生成的代码,但现在是时候尝试一些东西了。所以我需要将变量 'name_db' 导入另一个文件我收到错误“ NameError:名称'name_db'未定义”。这是代码

#logged.py                                                                                           from PyQt5 import QtCore, QtGui, QtWidgets
from add_student import Ui_Add_student 
import sqlite3
import os, sys
import create
from os import listdir
from os.path import isfile, join
from journal import *


class Ui_Logged(object):

     def add(self):
         self.window = QtWidgets.QMainWindow()
         self.ui = Ui_Add_student()
         self.ui.setupUi(self.window)
         
         self.window.show()
    
     def update(self):
         os.execl(sys.executable, sys.executable, *sys.argv)
     def open(self):
         
         os.system('python create.py')
         os.system('python journal.py')
        
     def setupUi(self, Logged):
         
         path = os.getcwd()
         only = os.path.join(path, r"db")
         
         onlyfiles = [f for f in listdir(only) if isfile(join(only, f))]

         Logged.setObjectName("Logged")
         Logged.resize(337, 300)
         self.centralwidget = QtWidgets.QWidget(Logged)
         self.centralwidget.setObjectName("centralwidget")
         self.pushButton = QtWidgets.QPushButton(self.centralwidget)
         self.pushButton.setGeometry(QtCore.QRect(250, 250, 75, 23))
         self.pushButton.setObjectName("pushButton")
         #############################################
         self.pushButton.clicked.connect(self.add)
         #############################################
         self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
         self.pushButton_3.setGeometry(QtCore.QRect(101, 80, 75, 23))
         self.pushButton_3.setObjectName("pushButton_3")

         self.pushButton_3.clicked.connect(self.update)
         
         self.comboBox = QtWidgets.QComboBox(self.centralwidget)
         self.comboBox.setGeometry(QtCore.QRect(20, 10, 201, 41))
         self.comboBox.setObjectName("comboBox")
         self.comboBox.addItems(onlyfiles)
         
         self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
         self.pushButton_2.setGeometry(QtCore.QRect(10, 80, 75, 23))
         self.pushButton_2.setObjectName("pushButton_2")

         self.pushButton_2.clicked.connect(self.open)
         
         Logged.setCentralWidget(self.centralwidget)
         self.menubar = QtWidgets.QMenuBar(Logged)
         self.menubar.setGeometry(QtCore.QRect(0, 0, 337, 21))
         self.menubar.setObjectName("menubar")
         Logged.setMenuBar(self.menubar)
         self.statusbar = QtWidgets.QStatusBar(Logged)
         self.statusbar.setObjectName("statusbar")
         Logged.setStatusBar(self.statusbar) 

         os.environ['name_db'] = self.comboBox.currentText()
         
         self.retranslateUi(Logged)
         QtCore.QMetaObject.connectSlotsByName(Logged)
    
   
 
     def retranslateUi(self, Logged):
         _translate = QtCore.QCoreApplication.translate
         Logged.setWindowTitle(_translate("Logged", "MainWindow"))
         self.pushButton.setText(_translate("Logged", "Додати учня"))
         self.pushButton_2.setText(_translate("Logged", "Відкрити"))
         self.pushButton_3.setText(_translate("Logged", "Оновити"))
        

         




if __name__ == "__main__":
    import sys
    

    app = QtWidgets.QApplication(sys.argv)
    Logged = QtWidgets.QMainWindow()
    ui = Ui_Logged()
    ui.setupUi(Logged)
    Logged.show()
    sys.exit(app.exec_())
import sys, os
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from datetime import date

def initializeModel(model):
   import logged

   
    

   model.setTable('sportsmen')
   model.setEditStrategy(QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, Qt.Horizontal, "Дата")
   model.setHeaderData(1, Qt.Horizontal, "Математика")
   model.setHeaderData(2, Qt.Horizontal, "Українська мова")
   model.setHeaderData(3, Qt.Horizontal, "Інформатика")
   
def createView(title, model):
   view = QTableView()
   view.setModel(model)
   view.setWindowTitle(title)
   return view



def findrow(i):
   delrow = i.row()

if __name__ == '__main__':
   import logged

   path = os.getcwd()
   app = QApplication(sys.argv)
   db = QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName(os.path.join(path, r"db/", name_db))
   model = QSqlTableModel()
   delrow = -1
   initializeModel(model)

   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)

   dlg = QDialog()
   layout = QVBoxLayout()
   layout.addWidget(view1)

   dlg.resize(500,300)
   dlg.setLayout(layout)
   dlg.setWindowTitle("Database Demo")
   dlg.show()
   sys.exit(app.exec_())                                                                        

【问题讨论】:

  • 您可能忽略了它,但是您正在编辑的文件顶部应该有一个 clear 警告,上面写着“除非您知道什么,否则不要编辑它你在做”。这是因为编辑 pyuic 生成的文件是一种不好的做法(有很多原因):这些是自动生成的文件,旨在使用> 作为进口。请阅读有关using Designer 的官方指南,因为大多数问题源于尝试编辑这些文件(除了当前答案中指出的问题)。
  • 这里所有的问题都是因为随机地把东西放在一起,希望能有效果,而不是花时间先了解基础知识。您确实需要通过一些tutorials 来了解如何将典型的 PyQt 应用程序组合在一起。

标签: python pyqt pyqt5


【解决方案1】:

您绝不会将name_db 定义为logged.py 的全局变量或属于Ui_Logged 类的变量。

如果你愿意,你可以在你的 Ui_Logged 类中将 name_db 作为一个变量,在logged.py 中作为self.name_db = ...,然后在导入后通过创建你的类my_instance = logged.UiLogged() 的实例在你的第二个文件中获取它,运行创建变量的setupUi() 方法(除非您将其放入__init__),然后使用my_instance.name_db 访问变量。

另外,鉴于您目前似乎正在使用环境变量,您必须使用os.environ["name_db"] 再次从环境中获取它,而不是尝试引用名为name_db 的变量。

如果你这样做,os.environ[name_db'] 行仍然不会执行,除非你先运行setupUi()。再一次,__init__ 会减少这个问题。

所以,如果您使用环境路由(我认为这不是一个好主意,但这是您的程序),请尝试在第二个文件中将 db.setDatabaseName(os.path.join(path, r"db/", name_db)) 替换为 db.setDatabaseName(os.path.join(path, r"db/", os.environ['name_db'])),并创建class + 在此行之前运行该函数。

【讨论】:

  • 也许我没搞清楚,但现在它给了我这个错误:“从记录的导入 Ui_Logged ImportError: cannot import name 'Ui_Logged'”
  • 你可以只导入logged然后做logged.Ui_Logged吗?你用的是什么IDE?任何好的 IDE 都应该可以轻松解决此类错误
  • 我正在使用 sublime text 3,并且当我使用导入记录时,它会给出此错误“ db.setDatabaseName(os.path.join(path, r"db/", my_instance.name_db)) AttributeError: 'Ui_Logged' 对象没有属性 'name_db' "
  • 因为如果您的 logged.py 没有更改,那么没有,它没有具有该名称的属性。给 Ui_Logged 一个 def __init__() 将 self.name_db 设置为 = 不管它的意思是什么?
  • @ch4rl1e97 不,即使在 UI 开发中这也不是一个好的选择,除非你真的知道你在做什么。这里的问题只是属性访问问题(以及对自动生成的文件的不当使用,除非完全意识到后果,否则应该进行编辑)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多