我在一個名為script.py
def load_file() 。
file_name = filedialog.askopenfile(filetypes=['EXE files', '*.exe'] )
return file_name
def simulation(input_path, input_par)。# this works fine.
# 該函式運行一個EXE檔案,給我兩個串列lst1和lst2。
return lst1, lst2
現在,在main.py中定義的以下按鈕呼叫了load_file函式,并且作業正常(我在終端中從函式中列印出路徑)。我無法理解的是,如何將我在load_file函式中得到的路徑作為引數input_path通過main.py中的按鈕傳遞給模擬函式。
input_var = #??/span>
button = Button(frame_file, text='Open file', command=load_file)
button.grid(row=1, column=1)
模擬(input_path, input_var)
uj5u.com熱心網友回復:
你可以使用partial方法來傳遞引數。
simulation = partial(simulation, input_path, input_par)
buttonCal = tk.Button(root, text="Simulate"/span>, command=simulation)
uj5u.com熱心網友回復:
我認為你的問題是重復的,只是從標題上看不出來,因為它的措辭有點奇怪:
我可以提出一個除執行緒中的解決方案,但不得不承認,它并不干凈。
你可以使用lambda,或者已經提到的partial方法來傳遞一個可變的物件,正如@vnk所描述的。使用lambdas(或部分應用的函式)是向Tkinter回呼傳遞引數的通常方法。
因為我假設你的路徑可能是一個字串,它是不可變的,你應該使用一個物件,如pathlike.Path,或者自己創建一個物件,并將你的路徑字串包裹到其中。不幸的是,你的回呼也必須與之合作。
你的回呼必須與之合作。
path_container = [] # 你可以定義一個類來獲得更干凈的代碼,而不必使用神奇的0索引。
tk.Button(root, text="Open file", command=(lambda: load_file(path_container)))
# 你的load_file必須知道它的引數是一個串列,其第0個元素必須包含路徑,。
# 或者,如果你選擇更可讀的方法,你的的.path屬性
# path容器物件應該被使用。
如果你真的很瘋狂,你甚至可以創建一個函式來改變一個可變的物件,所以你不必改變你的load_file函式:
def store_path(path_container, path)。
path_container[0] = path # Or path_container.path = path, if you're doing it cleaner..
tk.Button(root, text="Open file", command=(lambda: store_path(path_container, load_file()))))
一個lambda是有用的,因為它從父級范圍捕獲變數,例如path_container。
需要一個助手,因為適用于 lambdas 的限制是它們的主體必須是一個單一的運算式,而在 Python 中,賦值 (實際上是名稱系結) 不是這樣的。在許多其它語言中是這樣的,例如 C.
說實話,最明智的解決方案可能是將你的回呼設計為使用 pathlib.Path 物件。如果你的程式越來越大,你將從擁有一個適當的路徑類而不是字串中受益,即使你不使用 Tkinter。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333032.html
標籤:
