Python Tkinter-StringVar()跟踪未执行命令
我编写了这段代码作为版本管理器,但它没有执行命令Python Tkinter-StringVar()跟踪未执行命令,python,tkinter,Python,Tkinter,我编写了这段代码作为版本管理器,但它没有执行命令changeDir()。为什么? 您忘记将'name'参数传递给changeDir函数。没有例外,因为你的声明没有任何效力 表示问题的代码段: import sys def exec_smth(): # execution without effect exec('write_smth') try: # execution with exception because of missing argume
changeDir()
。为什么?
您忘记将'name'参数传递给
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()
无论如何,在\uuuu init\uuuu
函数之外,由于垃圾收集器,根本没有StringVar
s,所以您的代码无论如何都会失败
还有更多的问题,因为您从未将任何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()
输出:
正如您所看到的,我们总是需要一个对StringVar的引用,我认为有一个列表的选项要好得多
注意:如果您需要将某些内容传递给回调函数,请使用lambda
函数!所有代码都是用Python3测试的
链接: