我将此代码编写为版本管理器,但它不执行命令changeDir()
。为什么呢?
答案 0 :(得分:1)
你忘了传递一个名字' changeDir
函数的参数。并且没有例外,因为你的陈述没有效果!
代表问题的代码段:
import sys
def exec_smth():
# execution without effect
exec('write_smth')
try:
# execution with exception because of missing argument
exec('write_smth()')
except TypeError as error:
# now we pass an argument
exec('write_smth("I failed because of %s" % error )')
def write_smth(smth):
sys.stdout.write(smth)
exec_smth()
无论如何,在你的__init__
功能之外,由于垃圾收集器,所以根本没有StringVar
,所以你的代码无论如何都会失败!
还有更多的问题,因为你永远不会将任何sv{}
绑定到一个小部件,并期待一些回报!但好吧,让我们尝试用exec
:
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.entries = []
for _ in range(5):
exec('self.sv{} = tk.StringVar()'.format(_))
exec('self.sv{}.trace("w", self.change_sv)'.format(_))
exec('self.entries.append(tk.Entry(self, text="", textvariable=self.sv{}))'.format(_))
for entry in self.entries:
entry.pack()
def change_sv(*args):
# get id of a variable (you can't rely on that (0-9)!)
idx = args[1][-1:]
# get new value
value = getattr(args[0], 'sv{}'.format(idx)).get()
# result
print('Value changed in self.sv%s to %s!' % (idx, value))
app = App()
app.mainloop()
输出:
如您所见 - 我们总是需要对StringVars的引用,我认为带有它们列表的选项要好得多!
注意:如果您需要将某些内容传递给回调函数 - 请使用lambda
函数!所有代码都使用Python 3进行测试。
链接: