How to pass Tkinter entry value from one frame to another through my switch frame function

泪湿孤枕 提交于 2020-01-06 06:39:31

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!