从Tkinter Entry小部件中获取textvariable?

时间:2013-01-31 15:05:06

标签: python tkinter tkinter-entry

我正在尝试将一个函数绑定到我的Tkinter根,当用户按下return时它会作出反应。这是代码:

def returnPressed(event):
    print repr(event.widget)

master = Tk()

master.bind("<Return>", returnPressed)
myStringVar = StringVar(value="Foo")
myEntry = Entry(master, textvariable=myStringVar)
myEntry.grid()

master.mainloop()

这很有效,但现在我需要在StringVar函数中获取Entry的{​​{1}}变量。

我有小部件,但我无法获取变量对象。我知道如何获取变量内容但我确实需要该对象。

3 个答案:

答案 0 :(得分:0)

要获取窗口小部件的任何属性,请使用cget

print repr(event.widget.cget("textvariable"))

但是,在这个特定的实例中,由于一些实现细节,你得到的是stringvar的内部名称而不是stringvar本身。所以,你必须找到另一种方式。

最简单的方法是将stringvar实例传递给被调用的函数。你可以用lambda或functools.partial来做到这一点。例如:

def returnPressed(event, v):
    ...
master.bind("<Return>",lambda event, v=myStringVar: returnPressed(event, v))

答案 1 :(得分:0)

在这方面,我通过使用外部对象来解决tkinter的不良设计,该对象同时包含对其使用的EntryStringVar文本变量的引用,以便于访问(tuple也可以):

class EntryWithText()
    def __init__(self):
        self.entry = None
        self.textvariable = StringVar() #or None


entryWithTexts = []
for i in range(10):
    entryWithTexts[i] = EntryWithText()
    entryWithTexts[i].entry = Entry(master, textvariable=entryWithTexts[i].textvariable, ...)
    entryWithTexts[i].textvariable.set("this is entry number " + str(i))

毫无疑问,如果您有10万个这样的条目,那么额外的间接级别将产生一些影响,但是我在这里编写小型实用程序,因此不必担心。

答案 2 :(得分:-1)

我知道这是一个老问题,但我想我通过内部化控制变量找到了解决 tkinter 限制的方法。那么您在创建小部件时不需要声明单独的值:

class DynamicLabel(tkinter.Label):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master=master, *args, **kwargs)
        self.master = master
        self.value=None
        for kwarg, value in kwargs.items():
            if kwarg == 'textvariable':
                if not isinstance(value, tkinter.StringVar):
                    raise ValueError('Textvariable must be StringVar')
                self.value = value
        if not self.value:
            self.value = tkinter.StringVar()
            self.config(textvariable=self.value)

    def set(self, txt):
        self.value.set(txt)

    def get(self):
        return self.value.get()

这样做是用 self.value 为控制变量创建一个代理。

然后我们将遍历所有 kwargs,如果找到 textvariable,我们将 self.value 作为对它的引用。

如果在创建小部件时未设置 textvariable,我们只需创建自己的并使用 self.config(textvariable=self.value)

将其分配给小部件

剩下的就是创建 set 和 get 方法来访问控制变量。

我想通过忽略在创建小部件时分配的 textvariable 并始终从头开始创建一个新的,可以进一步简化上述内容。

您甚至可以将 self.value 设为 property 以便能够直接与 self.value 互动