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测试的

链接:


不执行命令是什么意思?它不会打印所需的字符串。请不要链接到场外代码。看见