当我尝试访问self.cursor_dat' from class in different script. It says:
ImportError时,我遇到了奇怪的错误:无法导入名称query_selection_class`。在不尝试访问变量的情况下也会发生错误。 import命令有问题。
这里是我创建变量的 file1.py :
class connection_settings_class(QtGui.QMainWindow,Ui_main_connection_settings_window):
def __init__(self):
self.create_connection_window()
self.host = 'localhost'
self.port = '3307'
self.user = 'root'
self.password = ''
self.database = 'rtr'
def connection(self):
""" connect to the database and create cursor that will be used to exetute MySQL queries """
try:
self.cnxn = pyodbc.connect(driver = '{MySQL ODBC 5.3 ANSI Driver}', # ANSI or Unicode
host = self.host,
port = self.port,
user = self.user,
password = self.password,
database = self.database)
except:
print('Connection FAIL')
**self.cursor_dat** = self.cnxn.cursor()
**self.cursor_dat**.execute("""SELECT * FROM test_db.attempt;""")
row = **self.cursor_dat**.fetchone()
if row:
print("Succesfully connected to the database.")
print row
self.status_label.setText("Connected")
else:
print("Connection FAIL")
self.status_label.setText("Disconnected")
def create_connection_window(self):
...rest of the code
...这里是 file2
import file1 -> I also tried from file1 import connection_settings_class
class plausible_implausible_class(QtGui.QMainWindow,Ui_plausible_implausible_win):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.show()
sc = MyStaticMplCanvas(self.centralwidget, width=500, height=400, dpi=100)
self.verticalLayout_3.addWidget(sc)
**a = file1.connection_settings_class.cursor_dat**
答案 0 :(得分:0)
我可能会在看你的样本时犯下一个非常愚蠢的错误,但我看到的是:
self.cursor_dat= self.cnxn.cursor()
在connection_settings_class.connection()
方法中定义。您永远不会调用connection()
,因此永远不会创建该属性。
另外我注意到你是静态调用类,而不是创建类的实例,但是你没有创建静态属性,它们都是在__init__
上创建的。您可能想要创建一个类的实例,然后最初将cursor_dat
定义为None
。
如果您想要连接共享,可以设置连接池并仍然创建单个实例。
答案 1 :(得分:0)
好的,路径没有问题,因为@tdelaney提到的所有脚本都是正面的。 for循环的结果是'/ Users / BauchMAC / PycharmProjects / py_GUI / Database_GUI' - >真即可。我使用os.getcwd()获得的工作目录是相同的。
我还尝试创建两个新脚本,一切正常。所以问题是我不理解python中的“导入规则”,因为这是问题的根源。
因此越过进口存在明显问题。解决问题的方法是将值作为参数传递。
下面你可以看到我想要怎么做以及出错的原因:
文件1:
from try4 import ClassB
class ClassA():
def __init__(self):
self.cursor_dat = 1
self.query_selection_win = ClassB()
object1 = ClassA()
文件2:
from try3 import ClassA <-- source of the probles
class ClassB():
def __init__(self, cursor_dat):
print(ClassA.cursor_dat)
以下是应该如何(至少它有效,我不确定它是否是最好的方法,我还是新手)
文件1:
from try4 import ClassB
class ClassA():
def __init__(self):
self.cursor_dat = 1
self.query_selection_win = ClassB(self.cursor_dat)
object1 = ClassA()
文件2:
class ClassB():
def __init__(self, cursor_dat):
print(cursor_dat)
我希望这会对像我这样的新手有所帮助:)。