2013-12-18 123 views
0

我正在學習一個項目的GUI。我在GUI中的所有按鈕都與我創建的函數綁定。這些函數調用已經預定義的函數。對於一些預定義的函數,我需要一個或兩個參數,我已經用條目解決了這個問題。我在連接到特定按鈕的正確條目中鍵入參數,當我按下按鈕時,函數將與相應的參數一起運行。Tkinter,將函數保存到列表中,然後運行它們

我想要做的事情就是在某種程度上,當我按下一個按鈕,該功能應該被保存到一個列表,而不是馬上執行。當我按下「運行」按鈕(我將創建一個新按鈕)時,我的列表中的所有內容都將被執行。我一直在考慮使用列表框,但我不知道它們是如何工作的,或者它甚至有可能運行包含許多函數的列表框。有人對我有任何想法或解決方案嗎?我可以使用此列表框還是有其他更好的使用方法?

class App: 
    def __init__(self, master): 
     frame = Frame(master) 
     frame.pack() 

     self.entry1 = IntVar() 
     self.entry2 = IntVar() 

     def do_something(): 
      value1 = self.entry1.get() 
      value2 = self.entry2.get() 
      self.listbox.insert(END, "predefined_function(value1, value2)") 

     def run_listbox_contents(): 
      pass 

     self.button = Button(frame, text="Move", command=lambda: do_something()) 
     self.button.pack(side=TOP) 

     self.entry1.set("value1") 
     self.entry = Entry(frame, textvariable=self.entry1) 
     self.entry.pack(side=TOP) 

     self.entry2.set("value2") 
     self.entry = Entry(frame, textvariable=self.entry2) 
     self.entry.pack(side=TOP) 

     self.listbox = Listbox(master) 
     self.listbox.pack(side=TOP) 


root = Tk() 

app = App(root) 

root.title("Mindstorms GUI") 
root.geometry("800x1200") 

root.mainloop() 
root.destroy() 

回答

0

如果我是你,我不想功能保存到列表中。我會爲你提出另一種解決方案。

我想你已經聽說過MVC(Model-View-Controller)的原理。在你的情況下,列表框是視圖,而且節省了功能過程的一部分,然後調用他們一次是控制器的一部分。 將它們分開。

您可能想要保存並顯示列表框中的任何字符串,以便讓用戶知道相應的功能已經登記並準備運行。例如,節省"Function1 aug1 aug2 aug3""Funtion2 aug1 aug2"或任何你喜歡爲相應的功能的手柄。

和一個控制器部分,編寫一個函數(假設conductor())。它讀取把手從字符串列表,解析他們調用相應的功能。您想在哪裏運行徵募功能,您只需撥打conductor()即可。


更新:

由於您的評論我明白,你是相當新的編程。讓我告訴你如何用給定的變量名寫一個最簡單的解析器。

def run_listbox(): 
    to_do_list = #get the list of strings 
    for handle_string in to_do_list: 
     #Let's say you got 
     #handle_string = "Predfined_function1 value1 value2" 
     #by here 
     handle = handle_string.split(" ") 
     #Split the string by space, so you got 
     #handle = ["Predfined_function1", "value1", "value2"] 
     #by here 
     if handle[0] == "Predfined_function1": 
      Predfined_function1(handle[1], handle[2]) #Call Predfined_function1(value1, value2) 
     elif handle[0] == "Predfined_function2": 
      Predfined_function2(handle[1], handle[2]) 
     #elif ... 
     #... 
     #elif ... 
     #... 
     #elif ... 
     #... 

這是不是一個完美的解析器,但我希望它可以讓你知道什麼對解析器的樣子。

+0

因爲我對編程完全陌生,所以MVC不是我之前聽說過的。但我想我明白這一點,你的意思。假設我將「Predfined_function value1 value 2」保存爲列表框的一個字符串,我將使用函數run_listbox()。我有什麼要寫,以便該函數解析所有我的字符串,然後調用它們(在這種情況下,Predfined_function(value1,value2)?由於我新編程,我不認爲我遇到了解析尚未 – user3067156

+0

@ user3067156更新。 – Skyler

+0

如果我在列表框中有三個字符串,比如「Predefined_function1 value1 value2」,「Predfined_function2 value1」和「Predefined_function3(這個是確實的不需要參數)。我必須寫什麼才能讓列表框中的每個字符串都被稱爲handle_string?是否只寫了handle_string =「」(通常是一個字符串),還是我在另一種方式?希望你明白我在問什麼問題 – user3067156

1

只需使用標準列表即可。

像這樣

def hest(txt): 
    print "hest: " +txt 

def horse(txt): 
    print "horse: " + txt 

funcList = [] 

funcList.append(hest)  
funcList.append(horse)  

for x in funcList: 
    x("Wow") 

此輸出

hest: Wow 
horse: Wow 

了這你想要什麼?

相關問題