2013-03-23 159 views
0

我有幾個問題,調用在另一個腳本中使用tkinter定義的Python函數。我希望爲我的功能提供一個單獨的腳本,以便GUI在需要時使用。目前我正在這樣做。tkinter命令從另一個Python腳本調用函數

ttk.Button(mainframe, text="1", command=one).grid(column=1, row=1, sticky=NW) 

def one(): 
    code_entry.insert(END,"1") 

上面調用一個按鈕單擊命令,它將在輸入字段中使用GUI打印一個字符。我以爲我可以創建一個單獨的腳本來握住我的功能,並呼籲他們這樣的:

ttk.Button(mainframe, text="1", command=functions.one()).grid(column=1, row=1, sticky=NW) 

,然後簡單地在我的GUI的頂部添加import語句,象下面這樣:

import functions 

這不起作用,並尋找一些關於如何解決這個問題的建議。

回答

1

您沒有指定任何錯誤消息,但最有可能的是您在做fuctions.one() - 在創建按鈕之前實際調用該模塊的one()函數。它只是通過刪除()部分來修復 - 當你指定一個沒有()的函數時,你傳遞了函數對象的引用。

還銘記保持code_entry變量的範圍 - 如果你正在使用它作爲一個模塊級之前全球(或功能的地方,如果one()是相同的功能,您的電話ttk.Button內),這將無法使用當你將它移動到沒有code_entry的新命名空間時。

爲了解決這個問題,您應該首先將code_entry作爲參數傳遞給回調而不需要,然後調用one()。通常的做法是創建一個lambda - 本質上創建一個函數,它可以在原始one()的相同範圍內工作,可以訪問像code_entry這樣的變量,但也可以在不同的模塊中調用函數。

ttk.Button(mainframe, text="1", command=lambda: functions.one(code_entry)) 

注意,這是基本相同:

def some_anonymous_function(): 
    functions.one(code_entry) 
ttk.Button(mainframe, text="1", command=some_anonymous_function) 

兩個例子都創建一個功能對象和傳遞該對象作爲基準 - 的functions.one()呼叫拉姆達的實際上是拉姆達的主體內函數,稍後由tkinter調用。

當然,你也必須重新定義一個()來接受這種新的參數:

def one(code_entry): 
    code_entry.insert(END,"1") 
+0

乾杯對此非常感謝。 – user1978826 2013-03-23 17:34:33

+0

@dequis如果我想將某些值傳遞給函數,我應該怎麼做? 我有一個繪製應用程序,我已經在另一個腳本上寫了保存功能。 爲保存功能工作它需要tkinter畫布,我試圖通過畫布到 'save.bind('',export.save_img(canvas))' 012工作,但如果保存功能是相同的腳本 'save.bind('',export.save_img)' 請幫助我,因此我不能有任何功能需要主文件之外的參數。 – 2017-11-05 14:53:24

相關問題