4

我的問題如下。從網頁背景來看,我沒有遇到問題,但在Python桌面應用程序中,我無法真正瞭解根據MVC模式組織代碼的最佳方式。在python桌面GUI中的MVC模式

我想創建一個窗口,根據用戶輸入,按下按鈕時,它會顯示數據庫中可用的類似條目。窗戶是我的看法。

所以基本上這些都是關係:

enter image description here

1)通信控制器 - >視圖

控制器具有的視圖的一個實例,並且可以使用其公開的方法例如view.show_data()。我認爲這是一條路。

# Controller 
my_view = View() 
... 
my_view.show_data(whatever_data) 

2)通訊視圖 - >控制器

當用戶將一些文本,在控制器中的方法,已被燒製,以便它可以詢問該模型在必要的數據數據庫。問題是我不知道什麼是視圖告訴控制器必須觸發這種方法的最佳方式。

我的第一個想法是通過控制器到視圖的參考,並綁定視圖上的事件,像這樣:

# Controller 
my_view = View(self) 
my_model = Model() 
... 

def on_user_input(self): 
    # process the input 
    user_input = ... 
    self.my_model.method_to_get_info(user_input) 

和視圖:

# View 
def __init__(self, controller): 
    self.controller_reference = controller 
    self.launch_gui() 
    self.config_binds() 

def launch_gui(self): 
    # ... configure all the GUI itself 
    self.button = ... 


def config_binds(self): 
    self.button.Bind(wx.EVT_BUTTON, self.controller_reference.on_user_input()) 

但我認爲這個「閉環」關係不是一個很乾淨的解決方案。視圖在控制器中引用,在視圖中引用控制器。我認爲它在視圖和控制器之間建立了緊密的關係。

這是怎麼回事?

+0

這個問題很可能引發爭議,並不適合StackOverflow的技術問答格式。因此,它可能會以目前的格式被關閉。您可能會在Programmers.StackExchange.com上找到更好的受衆。 –

回答

3

該視圖應該引發事件。通常情況下,您不是直接向控制器發送事件,而是GUI的框架通用事件處理程序。有問題的事件通常是像「一鍵被按下」,「有人移動鼠標」這樣的事件。

與您的情況相比,更「高級」的MVC可以很好地讓各部分知道對方。你告訴視圖什麼對象是它的控制器是非常好的。重要的部分是所有部件都使用明確界面,以便部件可以互換。

正如你所看到的,這與模型 - 視圖 - 控制器的普通網絡概念完全不同,它根本不是模型 - 視圖 - 控制器,而是名不符實,應該稱爲模型視圖模板。

+0

謝謝,我會按照我所說的去做。我不明白爲什麼在網上它應該是一個模型 - 視圖 - 模板...據我所知,模板只是一個視圖。 – bgusach

+0

@ ikaros45:不,模板無法將信息發送給控制器。 MVC是事件驅動的,網絡不是,它是無狀態和異步的。該模板始終與視圖緊密結合,並且在大多數框架中也是可選的(實際上嚴格地將其視爲「模型視圖」)。它根本與MVC毫無關係,任何開始調用這個「MVC」的web實現的人都應該被打屁股,因爲它只會引起很多混淆。 –

+0

看來我是這種困惑的受害者。我會繼續讀這個!再次感謝! – bgusach