问题
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 input from one frame of notebook to another frame when I click 'okay' buttonenter code here
I tried to pass the value as argument for frame class initialization
assign the entry filed value to a global variable
In Frame : class Tab1_Frame1 want to pass value from self.uidentry = Entry(self, bd=5) to class Tab1_Frame2
import tkinter as tk
from tkinter import *
from tkinter import ttk
# Root class to create the interface and define the controller function to switch frames
class RootApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.switch_frame(NoteBook)
# controller function
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
# sub-root to contain the Notebook frame and a controller function to switch the tabs within the notebook
class NoteBook(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.notebook = ttk.Notebook()
self.tab1 = Tab1(self.notebook)
self.notebook.add(self.tab1, text="User Bash History")
self.notebook.pack()
# controller function
def switch_tab1(self, frame_class):
new_frame = frame_class(self.notebook)
self.tab1.destroy()
self.tab1 = new_frame
# Notebook - Tab 1
class Tab1(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self._frame = None
self.switch_frame(Tab1_Frame1)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
# first frame for Tab1
class Tab1_Frame1(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.label = Label(self, text="Userbash history")
self.userid = Label(self, text ="User ID", bg="blue", fg="white")
self.userid.pack()
self.newWindow = None
self.uidentry = Entry(self, bd=5)
self.uidentry.pack()
global uid
uid = self.uidentry.get()
# button object with command to replace the frame
self.button = Button(self, text="OK", command=lambda: master.switch_frame(Tab1_Frame2))
self.label.pack()
self.button.pack()
def new_window(self):
if self.newWindow is not None:
self.newWindow.destroy()
self.newWindow = Frame(self)
self.uid=self.uidentry.get()
self.app = logwindow(self.newWindow, self.uid)
# second frame for Tab1
class Tab1_Frame2(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.label = Label(self, text="it has been changed!")
# and another button to change it back to the previous frame
self.button = Button(self, text="self" , command=lambda: master.switch_frame(Tab1_Frame1))
self.label.pack()
self.button.pack()
def new_window(self):
self.newWindow = tk.Toplevel(self.master)
self.uid=self.uidentry.get()
if __name__ == "__main__":
Root = RootApp()
Root.geometry("640x480")
Root.title("My Host APP")
Root.mainloop()```
回答1:
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()
来源:https://stackoverflow.com/questions/57182683/tkinter-entry-widgter-value-passing-between-frame-using-master-frame-swicth-clas