2017-08-29 63 views
0

我正在使用程序Maya在python中製作一個相當大的項目。我有很多選項將由GUI和用戶輸入確定。 選項的一個示例是呈現的維度。但是我還沒有製作一個圖形用戶界面,我仍然處於測試階段。將gui變量傳遞給類的有效方法?

我最終要的是一種有變量能夠由多個模塊內的各種類/方法進行查找和使用。另外還有一種方法可以在沒有實際GUI的情況下測試所有代碼。

我應該直接所有的數據傳遞給每個方法?我的這個問題是,如果foo方法依賴於變量A,但法條需要調用foo,它可以得到真正討厭的來自世界各地的所謂的傳遞這些變量來富。

另一種方式,我看到路過的所有變量,通過給每個類實例本身並使用實例變量的訪問。但是如果選項發生變化,那麼每次運行時都必須重新輸入重新導入。

爲了測試我現在用的是從與變量的配置文件獲取變量的模塊,我導入模塊和整個腳本中使用實例變量。

def __init__(self): 
     # Get and assign all instance variables. 
     options = config_section_map('Attrs', '%s\\ui_options.ini' %(data_path)) 
     for k, v in options.items(): 
      if v.lower() == 'none': 
       options[k] = None 
     self.check_all = int(options['check_all']) 
     self.control_group = options['control_group'] 

有沒有人有任何建議,或可以指出我在正確的方向處理獲取/使用UI變量?

+0

你可能會考慮一個'Session'或'Interface'類,你的邏輯和用戶界面之間的高層次的接口層。它可以處理所有你需要的變量管理,通過它自己的方法或通過調用其他類的方法;或者,它可以直接提供對其他類的訪問。在運行代碼時,您需要啓動會話,初始化所有邏輯,然後通過將會話傳遞給它來啓動您的UI。在無代碼的情況下使用代碼時,您只需刪除UI層,並直接與會話交互(用於測試)或添加另一個專用層(即CLI)。 – mapofemergence

+0

謝謝,我會試試! –

回答

2

如果選項列表不是過長,也不會更改類初始化,這使得初始化容易,你可以簡單地設置成員變量爲讀者瞭解:

class OptionData(object): 


    def __init___(self): 
     #set the options on startup 

     self.initial_path = "//network" 
     self.initial_name = "filename" 
     self.use_hdr = True 
     # ... etc 

如果預期初始化經常更改你能打出初始值到構造函數類:

class OptionData(object): 


    def __init___(self, path = "//network", name = "filename", hdr=True) 

    self.initial_path = path 
    self.initial_name = name 
    self.use_hdr = hdr 

如果您需要保留的數據,你可以填寫類閱讀CFG文件,你在做什麼,或以其他方式存儲它。堅持會讓事情變得更加困難,因爲您無法保證用戶不會同時打開兩個Maya,從而可能以不可預知的方式更改保存的數據。您可以使用Maya的fileInfo存儲每個文件的數據副本。

在這兩種情況下,我都會讓實際的GUI將數據對象(OptionData或任何你稱之爲你的)作爲初始化器。這樣你就可以從GUI讀取和寫入數據。然後有實際功能的代碼讀取OptionData:

def perform_render(optiondata): 
    #.... etc 

這樣,你可以在無需所有的圖形用戶界面和功能代碼將沒有明智的運行批處理過程。 GUI的唯一工作是成爲數據對象的自定義編輯器,然後將其傳遞給處於有效狀態的最終函數。