pyUser01
pyUser01

Reputation: 11

Entry widget contents not changing with function call

I need to change the content of an entry whenever the tkinter frame is shown. Below is what I have so far, and it doesn't seem to work. I have tried to use data = self.read() and then now.insert(0, data) and that has not worked either. If the value is displayed then it doesn't get changed every time the class ReadLabel1 is called.

class ReadLabel1(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, bg="blue")

        label = tk.Label(self, text="SomeData:", font = "Times 12", bg="blue")
        label.place(x=10, y=100) #ack(pady=5,padx=30)

        self.smStr = tk.StringVar()
        now=tk.Entry(self, width=22, textvariable=self.read())
        now.place(x=120, y=103)

    def read(self):
        # code to get data
        return data

Upvotes: 1

Views: 201

Answers (1)

Terry Jan Reedy
Terry Jan Reedy

Reputation: 19144

You need to turn 'change the content of an entry' into a one parameter callback, turn 'whenever the tkinter frame is shown' into an event, and then bind together the app, the event, and the callback. Here is a minimal example.

import time
import tkinter as tk

root = tk.Tk()
now = tk.StringVar()
lab = tk.Label(root, textvariable=now)
lab.pack()
def display_now(event):
    now.set(time.ctime())
root.bind('<Visibility>', display_now)
root.bind('<FocusIn>', display_now)

Minimizing the window to a icon and bringing it back up triggers the Visibility event. Covering and merely uncovering with a different window did not, at least not with Windows. Clicking on the uncovered, or merely inactivated, window triggered FocusIn. You can experiment more with your system. I used this tkinter reference

Upvotes: 2

Related Questions