2015-04-16 54 views
-2

我有一個奇妙的功能在這裏:爲什麼我的函數需要一個參數,以及如何使用+來調用它而沒有?

def update_config(val): 
    config = configparser.ConfigParser() 
    fonts_comb = "" 
    for i in range(len(fonts)): 
     if i == len(fonts) - 1: 
      fonts_comb = fonts_comb + fonts[i] 
     else: 
      fonts_comb = fonts_comb + fonts[i] + ", " 
    config["LISTS"] = {"Fonts": fonts_comb} 
    config["variables"] = {"font_size": (screen_font_size.var).get(), 
          "x_offset": (x_offset_spin.var).get(), 
          "y_offset": (y_offset_spin.var).get(), 
          "language": language, 
          "preview_font_size": (preview_font_size_spin.var).get()} 
    variables = config["variables"] 
    if (fonts_menu.var).get() != strings[17]: 
     variables["font"] = (fonts_menu.var).get() 
    else: 
     variables["font"] = font 
    if (preview_fonts.var).get() != strings[18]: 
     variables["preview_font"] = (preview_fonts.var).get() 
    else: 
     variables["preview_font"] = preview_font 
    with open("config.ini", "w") as configfile: 
     config.write(configfile) 

我不知道這是否是相關的,太,但基本上它做什麼名字說 - 更新配置文件。
我不喜歡的功能是它需要一個參數(val這裏,應該是self也許?)。而且「因爲它需要這個論點,我不能稱之爲」正確「。讓我演示一下,下面的作品就好了:

class OptionMenus(tk.OptionMenu): 
    def __init__(self, master, status, *fonts): 
     self.var = tk.StringVar(master) 
     (self.var).set(status) 
     (tk.OptionMenu).__init__(self, master, self.var, *fonts, 
           command = update_config) 

但是 - 調用像下面返回此錯誤:

def crossover(): 
    val = "" 
    update_config(val) 
TypeError: update_config() takes 0 positional arguments but 1 was given

class Spinboxes(tk.Spinbox): 
    def __init__(self, master): 
     self.var = tk.IntVar() 
     tk.Spinbox.__init__(self, master, textvariable = self.var, 
          from_ = 0, to = 100, command = update_config) 

現在,我一直在使用這個解決它

但是,它似乎是一種猴子般的做事方式,那麼有沒有更好的方法來調用這個功能?

+0

事情是'tk.Spinbox'不會將任何參數傳遞給回調命令,但'tk.OptionMenu'將所選值傳遞給回調命令。因此,如果使用相同的函數,它應該能夠接受零個或一個參數。你可以通過使用'def update_config(val = None)來完成這個工作:''好像kindall建議的那樣。 – fhdrsdg

回答

1

使用默認參數值:

def update_config(val=None): 
    # etc. 

你也可以完全刪除參數,並使用單參數lambda調用它的背景下,其中的參數必須傳遞:

def update_config(): 
    # etc. 

# ... 

tk.OptionMenu.__init__(self, master, self.var, *fonts, 
         command=lambda _: update_config()) 

但我認爲第一種選擇更簡單。

0
  1. update_config看起來像一個實例方法,所以是的,我推薦使用接受變量self
  2. 如果一個錯誤表示它只需要0個參數,但給出了1個參數,那就意味着它說的是正確的。這意味着從Spinbox對象調用update_config傳遞它的一個參數。但是,由於它從OptionMenus正常工作,因此無需參數,您需要將其設置爲處理可選參數。

變化:

def update_config(val): 

到:

def update_config(self, event=None): 

,並應解決這個問題。

+0

'Spinbox'仍然返回一個錯誤:'TypeError:update_config()缺少1所需的位置參數:'self'' – makaveli

+0

那麼,是'update_config'的實例方法還是什麼?如果有[MCVE](http://stackoverflow.com/help/mcve)會很好。 – TigerhawkT3

+0

我認爲這是一個比實例方法更規範的方法,但我不太確定。它根本不在班級內部,如果有幫助的話。 – makaveli

相關問題