简体   繁体   中英

How to update variables from a text file in a GUI in real time? Python and tkinter

I have a script that continuously updates numbers on a text file in the same directory. I made a GUI using tkinter to display these numbers. I'm having a hard time getting the GUI to update the numbers in real time. It will display the numbers as they were when the GUI first started, but will not update the display as the text file changes. Here's some basic code to demonstrate:

def read_files(file, line):
    old = open(f'{file}.txt', 'r').readlines()[line]
    new = old.replace('\n', '')
    return new

number = read_files('Statistics', 0)
number_label = Label(frame1, text=f'{number}')
number_label.grid(row=0, column=0)

The above code shows the number from the text file as it was when the GUI first opened. However, it does not update the number as its value in the text file changes. I did some reading around and also tried the following:

def read_files(file, line):
    old = open(f'{file}.txt', 'r').readlines()[line]
    new = old.replace('\n', '')
    return new

number = read_files('Statistics', 0)
number_label = StringVar()
number_label.set(number)
number_display = Label(frame1, text=f'{number_label.get()}')
number_display.grid(row=0, column=0)

This has the same effect. It shows the value retrieved from the text file at the moment the GUI was opened, but does not update it as the text file is updated. Any help is appreciated.

Since there is no complete code, take a look at this example:

from tkinter import *

root = Tk()

def update_gui():
    number = read_files('Statistics', 0) # Call the function
    number_display.config(text=number) # Change the text of the label, also same as text=f'{number}'
    root.after(1000,update_gui) # Repeat this function every 1 second

def read_files(file, line):
    old = open(f'{file}.txt', 'r').readlines()[line]
    new = old.replace('\n', '')
    return new

number_display = Label(root) # Empty label to update text later
number_display.grid(row=0, column=0)

update_gui() # Initial call to the function

root.mainloop()

Here the label is created outside the function but the text is not given, but inside the function we are repeating the function every 1 second, with after , and changing the text of the label with config method. I have avoided the use of StringVar() as it's of no use here, you can just store it in a normal variable and use it.


Here is a plagiarized look at how after should be used:

def after(self, ms, func=None, *args):
    """Call function once after given time.

    MS specifies the time in milliseconds. FUNC gives the
    function which shall be called. Additional parameters
    are given as parameters to the function call.  Return
    identifier to cancel scheduling with after_cancel."""

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM