我最近问了另一个问题,询问如何将列表从一个函数传递到另一个函数,@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行)时,它绕过了点击第二个函数按钮的需要。
我需要更改/添加什么来允许第一个函数的列表可用于第二个函数,但是在需要之前不会对其执行操作?
非常感谢, 克里斯。
答案 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()