我正在嘗試創建具有多個螢屏的簡單應用程式。這是我的專案結構。
main.py
- screens
mainScreen.py
regressions.py
我想要做的基本上是在它們之間切換,我不能,因為ImportError: cannot import name 'MainScreen' from partially initialized module 'screens.mainScreen' (most likely due to a circular import)
我想我明白問題是什么,但我不知道如何克服它。
這是我的代碼
main.py
import tkinter as tk
from screens.mainScreen import MainScreen
root = tk.Tk()
run = MainScreen(root)
root.mainloop()
回歸.py
import tkinter as tk
from .mainScreen import MainScreen
class Regressions:
def __init__(self, master):
# keep `root` in `self.master`
self.master = master
self.label = tk.Button(self.master, text="Home", command=self.load_new)
self.label.pack()
def load_new(self):
self.label.destroy()
# use `root` with another class
self.another = MainScreen(self.master)
主螢屏.py
import tkinter as tk
from .regressions import Regressions
class MainScreen:
def __init__(self, master):
# keep `root` in `self.master`
self.master = master
self.label = tk.Button(self.master, text="Regressions", command=self.load_new)
self.label.pack()
def load_new(self):
self.label.destroy()
# use `root` with another class
self.another = Regressions(self.master)
mainScreen.py 與regressions.py 相同,但重定向到regressions.py 我將感謝您提供如何解決它的任何提示。
uj5u.com熱心網友回復:
正如錯誤訊息中所述,問題是回圈匯入問題。
回歸.py
from .mainScreen import MainScreen
主螢屏.py
from .regressions import Regressions
regressions進口mainScreen和mainScreen進口regressions
您必須找到一種方法來消除這種依賴性。
也許這會有所幫助:自定義包中的 Python 回圈匯入和init .py
uj5u.com熱心網友回復:
我會以不同的方式組織它。
在main.py我首先創建MainScreen然后Regressions分配類.another
然后,你就不必進口MainScreen的regressions.py,并Regressions在MainScreen.py,因為所有它做main.py
# create screens
main_frame = MainScreen(root)
regressions_frame = Regressions(root)
# assing screens to other screens
main_frame.another = regressions_frame
regressions_frame.another = main_fram
但這可能需要不同的方法來顯示它。
我會Frame用來創建螢屏,后來我可以用來.pack()在 window 中顯示螢屏,并.pack_forget()從視窗中洗掉上一個螢屏。
這也是好主意,因為它沒有destroy螢屏,它擁有所有的舊值-因此,如果您再次顯示相同的螢屏,那么你仍然有舊值(Entry,Checkbox,等),Regressions可這仍然是在訪問值MainScreen,以及MainScreenCAN訪問值Regressions
主螢屏.py
import tkinter as tk
class MainScreen(tk.Frame):
def __init__(self, master):
super().__init__(master)
# keep `root` in `self.master`
#self.master = master # super().__init__(master) should do it automatically
self.label = tk.Button(self, text="Regressions", command=self.load_new)
self.label.pack()
self.another = None
def load_new(self):
if self.another:
# hide current screen (without destroying)
self.pack_forget()
# show another screen
self.another.pack()
回歸.py
import tkinter as tk
class Regressions(tk.Frame):
def __init__(self, master):
super().__init__(master)
# keep `root` in `self.master`
#self.master = master # super().__init__(master) should do it automatically
self.label = tk.Button(self, text="Home", command=self.load_new)
self.label.pack()
self.another = None
def load_new(self):
if self.another:
# hide current screen (without destroying)
self.pack_forget()
# show another screen
self.another.pack()
主檔案
import tkinter as tk
from .mainScreen import MainScreen
from .regressions import Regressions
if __name__ == '__main__':
root = tk.Tk()
# create screens
main_frame = MainScreen(root)
regressions_frame = Regressions(root)
# assing screens to other screens
main_frame.another = regressions_frame
regressions_frame.another = main_frame
# show main_frame
main_frame.pack()
root.mainloop()
uj5u.com熱心網友回復:
您應該if __name__=='__main__':在匯入模塊之前使用以避免回圈匯入
回歸.py
import tkinter as tk
if __name__=='__main__':
from .mainScreen import MainScreen
class Regressions:
def __init__(self, master):
# keep `root` in `self.master`
self.master = master
self.label = tk.Button(self.master, text="Home", command=self.load_new)
self.label.pack()
def load_new(self):
self.label.destroy()
# use `root` with another class
self.another = MainScreen(self.master)
主螢屏.py
import tkinter as tk
if __name__=='__main__':
from .regressions import Regressions
class MainScreen:
def __init__(self, master):
# keep `root` in `self.master`
self.master = master
self.label = tk.Button(self.master, text="Regressions", command=self.load_new)
self.label.pack()
def load_new(self):
self.label.destroy()
# use `root` with another class
self.another = Regressions(self.master)
順便提一句:
這是 10 年前由 Bryan Oakley 創建的更復雜的版本。
在 tkinter 中的兩幀之間切換
您可以在 Stackoverflow 上的許多問題中看到這種方法被重用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341424.html
標籤:Python 蟒蛇-3.x 特金特 tkinter 布局
