Tkinter,将功能保存到列表然后运行它们

时间:2013-12-18 11:22:30

标签: python list user-interface listbox tkinter

我正在为学校的项目制作GUI。我在GUI中的所有按钮都与我创建的功能绑定在一起。这些函数需要已经预定义的函数。对于一些预定义的函数,我需要一个或两个参数,我已用条目解决了这个问题。我输入连接到特定按钮的右边条目中的参数,当我按下按钮时,该函数将使用相应的参数运行。

我想要做的是以某种方式按下按钮时,该功能应保存到列表中而不是立即执行。当我按下“运行”按钮(我将创建一个新按钮)时,我的列表中的所有内容都将被执行。我一直在考虑使用列表框,但我不确切知道它们是如何工作的,或者甚至可以运行包含许多函数的列表框。有人对我有任何想法或解决方案吗?我可以使用这个列表框还是还有其他更好用的东西?

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()

2 个答案:

答案 0 :(得分: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

这是你想要的吗?

答案 1 :(得分:0)

如果我是你,我不想将功能保存到列表中。我会为你建议另一个解决方案。

我想你已经听说过 MVC(模型 - 视图 - 控制器)的原理。在您的情况下,列表框是视图的一部分,保存功能然后立即调用它们的过程是控制器的一部分。 将它们分开。

您可能希望在列表框中保存并显示任何字符串,以便让用户知道相应的功能已经登记并准备好运行。例如,保存字符串 "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 ...
        #...

这不是一个完美的解析器,但我希望它可以让你知道解析器是什么样的。