我是约翰,我是一名新程序员!这是我在此的头一篇博文!
我最近使用 Tkinter 创建了一个 Python 程序。该程序允许用户将一些数据插入数据库并创建 .docx 文件。它还允许执行简单的数据库搜索。
在编码过程中,我从未想到源代码会这么长,但我已经使用基于(相对)相似性分组为类的方法编写了它。因此,过了一段时间,我决定将代码拆分为多个模块,每个模块由一个类组成,这会是更明智的做法。它更多地是为了可读性而不是可重用性,因为在我看来,大多数类和方法都是针对该程序的。
问题似乎是其中两个类确实相互依赖,并且我不断收到:
AttributeError: partially initialized module 'main_app' has no attribute 'Main' (most likely due to a circular import)
我将演示这两个类的部分内容,以展示两者如何相互依赖。
main_app.py:
import database
class Main():
..
def create_widgets(self):
..
self.f5 = tk.Frame(self.search_tab, bg="lightyellow", padx=5, pady=5)
self.f5.pack(expand=True, fill='both')
self.delete_button = ttk.Button(self.f5, text='Διαγραφή', command=data.delete_from_database, state='disabled')
self.delete_button.pack(side='right', fill='both')
self.edit_button = ttk.Button(self.f5, text='Επεξεργασία', command=data.update_entry_retrieve, state='disabled')
self.edit_button.pack(side='right', fill='both')
..
if __name__ == "__main__":
root = tk.Tk()
data = database.Database()
main = Main(root)
root.mainloop()
此代码块显示了 Main 类如何使用 Database 类(实例化为数据)的方法。
database.py:
..
import main_app
class Database():
..
def save_to_database(self):
sql = f'INSERT INTO entries VALUES (?,?,?,?,?,?,?,?,?,?,?,?);'
try:
con = lite.connect(self.db)
with con:
cur = con.cursor()
cur.execute(sql, (main.id_number, main.surname, main.name, main.reason, main.office_article, main.office_type, main.office_name, main.protocol_num,\
main.protocol_date, main.other_doc_passport, main.other_doc_driver, main.timestamp))
cur.execute('COMMIT;')
return True
except Exception as e:
print(e)
return False
..
main = main_app.Main()
这段代码数据库如何访问主类的变量。
是否有一个我看不到的简单解决方案,或者应该完全重写代码以减少我的类的依赖性?不管怎样,我花了昨天整个下午的时间来寻找解决方案,但在绕圈子时,就像我的导入一样。我尝试改变模块的导入方式,但完全没有改变。恐怕代码太混乱,无法拆分。
牛魔王的故事
相关分类