如何通过我的切换框函数将Tkinter入口值从一帧传递到另一帧 [英] How to pass Tkinter entry value from one frame to another through my switch frame function
问题描述
我的Tkinter应用程序添加了Notebook,并且我想在笔记本内部使用按钮切换框架.实现了笔记本开关和框架开关.当我单击确定"按钮enter code here
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
在框架中:类Tab1_Frame1 要将值从self.uidentry = Entry(self,bd = 5)传递给类Tab1_Frame2
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()```
推荐答案
您的按钮使用母版self.master.switch_frame()
中的方法,该方法只能切换标签页
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))
,但是它可以使用自己的方法,该方法将使用self.master.switch_frame()
来切换标签页,并且还将值从当前标签页直接移动到新标签页:
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
或master
和其他选项卡可以在__init__
中获取它:
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
每个标签页在switch_frame
中可能具有不同的代码
Every Tab may have different code in switch_frame
最好在master
中以默认值开头创建此变量.
It is good to create this variable in master
at start with default value.
此处master
是Tab1
,但是使用master.master
您可以将其保留在NoteBook
中,并使用master.master.master
在RootApp
Here master
is Tab1
but using master.master
you can keep it in NoteBook
, and using master.master.master
in RootApp
完整代码:
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()
这篇关于如何通过我的切换框函数将Tkinter入口值从一帧传递到另一帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!