我是約翰,我是一名新程序員!這是我在此的頭一篇博文!我最近使用 Tkinter 創建了一個 Python 程序。該程序允許用戶將一些數據插入數據庫并創建 .docx 文件。它還允許執行簡單的數據庫搜索。在編碼過程中,我從未想到源代碼會這么長,但我已經使用基于(相對)相似性分組為類的方法編寫了它。因此,過了一段時間,我決定將代碼拆分為多個模塊,每個模塊由一個類組成,這會是更明智的做法。它更多地是為了可讀性而不是可重用性,因為在我看來,大多數類和方法都是針對該程序的。問題似乎是其中兩個類確實相互依賴,并且我不斷收到:AttributeError: partially initialized module 'main_app' has no attribute 'Main' (most likely due to a circular import)我將演示這兩個類的部分內容,以展示兩者如何相互依賴。main_app.py:import databaseclass 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_appclass 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()這段代碼數據庫如何訪問主類的變量。完整的代碼可以在項目“split”存儲庫中找到。是否有一個我看不到的簡單解決方案,或者應該完全重寫代碼以減少我的類的依賴性?不管怎樣,我花了昨天整個下午的時間來尋找解決方案,但在繞圈子時,就像我的導入一樣。我嘗試改變模塊的導入方式,但完全沒有改變??峙麓a太混亂,無法拆分。
1 回答

牛魔王的故事
TA貢獻1830條經驗 獲得超3個贊
在database.py中,不要導入main_app,而是:
class Database:
def __init__(self, main):
self.main = main
create_widgets在 main_app.py 中,從構造函數中刪除。然后:
main = Main(root)
data = database.Database(main)
main.create_widgets()
添加回答
舉報
0/150
提交
取消