How to connect a variable to Entry widget?
Asked Answered
P

1

10

I'm trying to associate a variable with a Tkinter entry widget, in a way that:

  1. Whenever I change the value (the "content") of the entry, mainly by typing something into it, the variable automatically gets assigned the value of what I've typed. Without me having to push a button "Update value " or something like that first.

  2. Whenever the variable gets changed (by some other part of the programm), I want the entry value displayed to be adjusted automatically. I believe that this could work via the textvariable.

I read the example on http://effbot.org/tkinterbook/entry.htm, but it is not exactly helping me for what I have in mind. I have a feeling that there is a way of ensuring the first condition with using entry's "validate". Any ideas?

Protamine answered 26/3, 2010 at 14:38 Comment(6)
Perhaps you could suggest an alternative? :)Bible
What's wrong with tkinter? According to the python homepage, it is "...Python's de-facto standard GUI package." And the "most commonly used one."Protamine
Control variables: infohost.nmt.edu/tcc/help/pubs/tkinter/control-variables.htmlPippy
When you say 'variable', do you mean a python variable like a int or a str or a Tkinter variable like IntVar or StringVar?Katey
stackoverflow.com/questions/520015 contains discussion of GUI toolkits in Python, which would be a good place to discuss the relative merits of these. There is no one advocating Tkinter (and one guy really dissing it), which is not surprising for me; Tk was hip back in the 90s when it was added to Python, but it's sort of lost its luster. It can look okay on Windows, but I've never seen a Python Tkinter app that wasn't hideous on Linux. Notably missing from the thread I linked is PyGTK pygtk.org – these bindings are mature and GTK+ is a decent framework with which to work.Harmonie
The variables i need to work with are normal python ints or strings. But since Tkinter variables can easily be converted via get and set, is it that much of a difference?Protamine
S
15

I think you want something like this. In the example below, I created a variable myvar and assigned it to be textvariable of both a Label and Entry widgets. This way both are coupled and changes in the Entry widget will reflect automatically in Label.

You can also set trace on variables, e.g. to write to stdout.

from tkinter import *


root = Tk()
root.title("MyApp")

myvar = StringVar()

def mywarWritten(*args):
    print "mywarWritten",myvar.get()

myvar.trace("w", mywarWritten)

label = Label(root, textvariable=myvar)
label.pack()

text_entry = Entry(root, textvariable=myvar)
text_entry.pack()

root.mainloop()
Scharf answered 26/3, 2010 at 15:7 Comment(6)
Thank you, this goes in the right direction, but to work with the variables, I need to convert them to normal python variables. Your example works because the widgets share the same textvariable. But what would you do, for example, if you wanted to print the content of your entry to the standard output whenever it gets changed instead of writing it in a tkinter label?Protamine
You do this: text_entry.bind('<Key>', handler) where handler is a function that assigns your python variable. See my answer.Katey
@Sano98, i have edited answer, you can easily trace variables for read/writeScharf
Thanks, I used your proposal after I encountered the problems described by Brian Oakley when trying it with binding to keyppress as bpowah suggested. After a little study, I now see that tracing seems taylormade for a problem like this. But when using IntVar instead of StringVar, a ValueError occurs when deleting completely the content of the entry - the empty literal "" is not valid for int conversion. It is given the value 0, which is what I expected, but is there a way to avoid the error? Or to catch it somehow?Protamine
@Sano98, you may either change the global getint defined in tkinter or may better derive a class from IntVar to overide get, or may be there are better ways, you may ask another questionScharf
Please, please, please please never use from <xxx> import * in examples.Catarrhine

© 2022 - 2024 — McMap. All rights reserved.