My Tkinter application have added Notebook and inside the notebook I want to switch the frame using a button. Implemented notebook switch and frame switch. i want to take entry
Your button uses method from master self.master.switch_frame() which only switch tabs
self.button = Button(self, text="OK", command=lambda: master.switch_frame(Tab1_Frame2))
but it could use own method which will use self.master.switch_frame() to switch tabs and it will also move value(s) from current tab directly to new tab:
self.button = tk.Button(self, text="OK", command=self.switch_frame)
def switch_frame(self):
# get value from Entry in current Tab
value = self.uidentry.get()
# switch tab
self.master.switch_frame(Tab1_Frame2)
# use value directly in new Tab
self.master._frame.uidentry = value
self.master._frame.label['text'] = value
or to master and other tabs can get it in __init__ :
self.button = tk.Button(self, text="OK", command=self.switch_frame)
def switch_frame(self):
# keep uidentry in master
self.master.uidentry = self.uidentry.get()
# switch tab
self.master.switch_frame(Tab1_Frame2)
class Tab1_Frame2(tk.Frame):
def __init__(self, *args, **kwargs):
# get uidentry from master
self.uidentry = self.master.uidentry
self.label['text'] = self.master.uidentry
Every Tab may have different code in switch_frame
It is good to create this variable in master at start with default value.
Here master is Tab1 but using master.master you can keep it in NoteBook, and using master.master.master in RootApp
Full code:
import tkinter as tk
from tkinter import ttk
class RootApp(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("640x480")
self.title("My Host APP")
self._frame = None
self.switch_frame(NoteBook)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
class NoteBook(tk.Frame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.notebook = ttk.Notebook()
self.tab1 = Tab1(self.notebook)
self.notebook.add(self.tab1, text="User Bash History")
self.notebook.pack()
def switch_tab1(self, frame_class):
new_frame = frame_class(self.notebook)
self.tab1.destroy()
self.tab1 = new_frame
class Tab1(tk.Frame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.uid = '' # default value at start
self._frame = None
self.switch_frame(Tab1_Frame1)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
# first frame for Tab1
class Tab1_Frame1(tk.Frame):
def __init__(self, *args, **kwargs):
global uid
super().__init__(*args, **kwargs)
self.label = tk.Label(self, text="Userbash history")
self.label.pack()
self.userid = tk.Label(self, text ="User ID", bg="blue", fg="white")
self.userid.pack()
self.newWindow = None
self.uidentry = tk.Entry(self, bd=5)
self.uidentry.pack()
uid = self.uidentry.get()
# button object with command to replace the frame
self.button = tk.Button(self, text="OK", command=self.switch_frame)
self.button.pack()
def switch_frame(self):
# get value from Entry in current Tab
value = self.uidentry.get()
# keep value in master
self.master.uid = value
# switch tab
self.master.switch_frame(Tab1_Frame2)
# use value directly in new Tab
#self.master._frame.uid = value
#self.master._frame.label['text'] = value
def new_window(self):
if self.newWindow:
self.newWindow.destroy()
self.newWindow = tk.Frame(self)
self.uid = self.uidentry.get()
self.app = logwindow(self.newWindow, self.uid)
class Tab1_Frame2(tk.Frame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.label = tk.Label(self, text="it has been changed!")
self.label.pack()
# get value from master
self.uid = self.master.uid
self.label['text'] = self.uid
# and another button to change it back to the previous frame
self.button = tk.Button(self, text="self", command=lambda: self.master.switch_frame(Tab1_Frame1))
self.button.pack()
def new_window(self):
self.newWindow = tk.Toplevel(self.master)
self.uid = self.uidentry.get()
if __name__ == "__main__":
root = RootApp()
root.mainloop()