Tkinter - StringVar()跟踪不执行命令

时间:2017-05-13 20:29:06

标签: python tkinter

我将此代码编写为版本管理器,但它不执行命令changeDir()。为什么呢?

https://pastebin.com/VSnhzRzF

1 个答案:

答案 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()

输出:

output

如您所见 - 我们总是需要对StringVars的引用,我认为带有它们列表的选项要好得多!

注意:如果您需要将某些内容传递给回调函数 - 请使用lambda函数!所有代码都使用Python 3进行测试。

链接: