2014-11-07 83 views
0

我正在設計一個使用python Tkinter的GUI程序。我在類結構中開發它,每個類都包含一個包含小部件的框架。問題是,一個類需要另一個類的一個小部件作爲參數,另一個類也是如此。我很困惑如何實例化類。這是我迄今爲止嘗試過的代碼。實例化時將一個窗口小部件從一個類傳遞到另一個類

frame1 = infoframe(lambda : frame2.listbox1) 
frame2 = scriptframe(frame1.entry1) 
我每次調用幀1的功能需要frame2.listbox1作爲參數時

,功能不承認frame2.listbox1作爲一個列表框。我也試過這個代碼:

frame1 = infoframe(None) 
frame2 = scriptframe(frame1.entry1) 
frame1['object'] = frame2.listbox1 

但仍然沒有運氣。我在課堂結構中製作程序,以便程序組織良好,但看起來並不像我想的那麼簡單。

回答

0

您必須將您的代碼分解爲單元,以便單元之間的依賴關係圖是非循環的。這可能需要你做一些通常被認爲是不好的風格。

讓我們考慮Python如何允許兩個模塊(如'a'和'b')相互導入。假設主模塊以import a開頭。如果導入代碼在檢查sys.modules['a']的存在之後執行'顯而易見的'sys.modules['a'] = module('a', code_of_a),則在模塊調用返回之前,sys.modules中不會添加任何內容。在返回之前,當進口b和b嘗試導入a時,sys.modules['a']將不存在,並且sys.modules['a'] = module('a', code_of_a)將被重複,依此類推,直到達到遞歸限制。

爲防止出現這種情況,import將模塊初始化分爲兩個階段。它開始在sys.modules中放置一個幾乎爲空的模塊,如sys.modules['a'] = module('a')。然後它調用類似sys.modules['a'].populate(code_of_a)。暴露未初始化的對象通常被認爲是不好的風格,但在這裏很重要。這與你嘗試的想法是一樣的。

現在,當進口b時,模塊a將具有由前面的語句定義的任何對象。當b導入a時,它會得到部分初始化的模塊a。用戶只需要安排,無論b需要在import b之前已經被初始化,以便將a分成'a_before'和'a_after'來打破依賴週期。將import b放在文件中間的某個位置違反了PEP8警告,將導入置於頂部,但在其中一個文件中需要相互導入才能工作。

另一種解決方案是將代碼從a和b移動到首先初始化的新模塊c中。

我希望這能爲您提供一些適合您情況的想法。

相關問題