功能之间的共享列表

时间:2015-01-07 14:13:37

标签: windows python-2.7

我最近问了另一个问题,询问如何将列表从一个函数传递到另一个函数,@Modred友好地回答了这个问题。基本上我现在得到的是:

def run_command():
    machines_off = []
        # Some stuff .....
        machines_off.append(machineName)
        # Some stuff ....
    wol_machines(machines_off)

def wol_machines(machines_off):
    # Some stuff ....

(我已经清除了这个例子的所有非必要代码,因为它是300多行)。

现在,通过单击tkinter按钮调用每个函数; run_command总是运行,有时会将项添加到列表'machines_off'。如果单击第二个功能按钮,我只想要它动作machine_off。在单击run_command按钮后,它会遍历整个脚本,包括我不想要的第二个函数。我假设当我将列表转发到第二个函数(第5行)时,它绕过了点击第二个函数按钮的需要。

我需要更改/添加什么来允许第一个函数的列表可用于第二个函数,但是在需要之前不会对其执行操作?

非常感谢, 克里斯。

1 个答案:

答案 0 :(得分:0)

我猜你的代码看起来像:

from Tkinter import Tk, Button

def run_command():
    machines_off = []
    # Some stuff .....
    machineName = "foo"
    machines_off.append(machineName)
    # Some stuff ....
    wol_machines(machines_off)

def wol_machines(machines_off):
    print "wol_machines was called"
    print "contents of machines_off: ", machines_off
    # Some stuff ....

root = Tk()
a = Button(text="do the first thing", command=run_command)
b = Button(text="do the second thing", command=wol_machines)
a.pack()
b.pack()

root.mainloop()

如果您希望这些功能彼此独立执行,则不应在wol_machines内拨打run_command。你必须找到两种方法来查看列表的其他方法。一种方法是使用全局值。

from Tkinter import Tk, Button

machines_off = []

def run_command():
    #reset machines_off to the empty list.
    #delete these next two lines if you want to retain old values.
    global machines_off
    machines_off = []
    # Some stuff .....
    machineName = "foo"
    machines_off.append(machineName)
    # Some stuff ....

def wol_machines():
    print "wol_machines was called"
    print "contents of machines_off: ", machines_off
    # Some stuff ....

root = Tk()
a = Button(text="do the first thing", command=run_command)
b = Button(text="do the second thing", command=wol_machines)
a.pack()
b.pack()

root.mainloop()

这是对原始代码的最简单更改,可以为您提供所需的行为,但全局值通常被认为是糟糕设计的标志。更面向对象的方法可以将全局本地化为类属性。

from Tkinter import Tk, Button

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.machines_off = []
        a = Button(self, text="do the first thing", command=self.run_command)
        b = Button(self, text="do the second thing", command=self.wol_machines)
        a.pack()
        b.pack()
    def run_command(self):
        #reset machines_off to the empty list.
        #delete this next line if you want to retain old values.
        self.machines_off = []
        # Some stuff .....
        machineName = "foo"
        self.machines_off.append(machineName)
        # Some stuff ....

    def wol_machines(self):
        print "wol_machines was called"
        print "contents of machines_off: ", self.machines_off
        # Some stuff ....

root = App()
root.mainloop()