Home > front end >  How to Refresh a Tab in Tkinter after Interacting with a Database?
How to Refresh a Tab in Tkinter after Interacting with a Database?

Time:12-05

I have a python script for teachers that works very well on my terminal and I'm trying to use Tkinter so I can share this script with other people. In the script, the user uploads a file and other information to an SQLite database.

Below is part of the script that shows just the content for the 1st tab (of 3). The problem is that when people interact with the database the tab needs to get refreshed to show something has happened and that the list of files in the database has changed.

Everything I've read shows you need a button to refresh. But that is not user-friendly. What people want to do is upload a file and then see that file in the list. Is this possible with Tkinter and if so how?

class AppWindow():
    my_list = [4]

    def __init__(self, parent):
        global my_list

        # Create the window
        self.window = parent
        self.window.geometry("700x600")
        #self.center_window()
        self.window.title("Test app")
        # Create a text label and place it in the window
        self.hello_label = tk.Label(self.window, text="Hello world!")
        self.hello_label.place(x=20, y=20)
        # Create 3 tabs
        self.tab_container = tk.Frame(self.window)
        self.tab_container.place(x=0,y=0,width=700,height=400)
        self.tabs = ttk.Notebook(self.tab_container)
        self.tab_2 = tk.Frame(self.tabs)
        self.tabs.add(self.tab_2, text="Parameters")
        self.tabs.place(x=0,y=0,height=400,width=700)
        # Content for tab 2
        self.label2 = tk.Label(self.tab_2, text="")
        self.label201=tk.Label(self.tab_2, text="Put in your target GPA")
        self.label201.place(x=50, y=50)
        btn1 = tk.Button(self.tab_2,text="Target GPA", command=self.getGPA)
        btn1.place(x=50, y=80)
        for lst in self.my_list:
            btn99=tk.Button(self.tab_2,text=lst)
            btn99.grid()

    def getGPA(self):
        userInput = sd.askstring('User Input','Enter target GPA')
        self.my_list.append(userInput)


if __name__ == "__main__":
    root = tk.Tk()
    app = AppWindow(root)
    root.mainloop()

CodePudding user response:

This is merely a guess because of the all the reasons I've already mentioned in comments under your question. Generally speaking, to update or what you call "refresh" a tab requires adding, changing, or deleting the widgets you put on it.

The code below is based what's currently in your code. Every time the Target GP button is clicked another Button is added to the self.tab_2 frame as well as appended to my_list. Changing the widgets doesn't have to be triggered by clicking on a button, it could be the result of some other event (such as the completion of a file upload in the background for example).

import tkinter as tk
import tkinter.ttk as ttk


class AppWindow():
    def __init__(self, parent):
        # Create the window
        self.window = parent
        self.window.geometry("700x600")
        #self.center_window()
        self.window.title("Test app")

        # Create and initialize data list.
        self.my_list = [4]

        # Create a text label and place it in the window
        self.hello_label = tk.Label(self.window, text="Hello world!")
        self.hello_label.place(x=20, y=20)

        # Create 3 tabs
        self.tab_container = tk.Frame(self.window)
        self.tab_container.place(x=0, y=0, width=700, height=400)
        self.tabs = ttk.Notebook(self.tab_container)

        self.tab_2 = tk.Frame(self.tabs)
        self.tabs.add(self.tab_2, text="Parameters")
        self.tabs.place(x=0, y=0, height=400, width=700)

        # Content for tab 2
        self.label201 = tk.Label(self.tab_2, text="Put in your target GPA")
        self.label201.place(x=50, y=50)
        btn1 = tk.Button(self.tab_2, text="Target GPA", command=self.getGPA)
        btn1.place(x=50, y=80)

        # Create a Button for each item currently in list.
        for item in self.my_list:
            btn = tk.Button(self.tab_2, text=item)
            btn.grid()

    def getGPA(self):
#        userInput = sd.askstring('User Input', 'Enter target GPA')  # Not defined.
        userInput = f'{len(self.my_list)}: some user input'
        self.my_list.append(userInput)
        btn = tk.Button(self.tab_2, text=userInput)  # Create another Button.
        btn.grid()


if __name__ == "__main__":
    root = tk.Tk()
    app = AppWindow(root)
    root.mainloop()

  • Related