python - 如何通过我的切换帧功能将 Tkinter 条目值从一帧传递到另一帧
问题描述
我的 Tkinter 应用程序添加了笔记本,在笔记本内我想使用按钮切换框架。实现了笔记本交换机和框架交换机。当我单击“确定”按钮时,我想从笔记本的一帧输入输入到另一帧enter code here
我试图将值作为参数传递给框架类初始化
将条目字段值分配给全局变量
在 Frame 中:类 Tab1_Frame1 想要将值从 self.uidentry = Entry(self, bd=5) 传递到类 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()```
解决方案
您的按钮使用来自 master 的方法,self.master.switch_frame()
该方法仅切换选项卡
self.button = Button(self, text="OK", command=lambda: master.switch_frame(Tab1_Frame2))
但它可以使用自己的方法self.master.switch_frame()
来切换选项卡,它还将值从当前选项卡直接移动到新选项卡:
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
或 tomaster
和其他选项卡可以进入__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
最好master
在开始时使用默认值创建此变量。
这master
是Tab1
但是使用master.master
你可以把它保存在里面NoteBook
,并master.master.master
在里面使用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()
推荐阅读
- excel - 查找从 windows live mail 保存的文件
- c# - 如何获得前1个月的年龄记录
- javascript - 在jquery对象上应用jquery的html方法
- python - 检查“受保护”类型的正确方法
- php - 为什么查询日期会在 laravel 中提供错误的输出/结果
- mysql - sequelize 在连接两个表时将 where 子句转换为 and 子句
- javascript - Highcharts 在鼠标悬停在图表线上时显示/突出显示 y 轴
- python - 如果您想停止屈服,生成器函数的返回是否仍然有效?
- oauth-2.0 - Bixby:无法为我的胶囊实现登录功能
- java - org.codehaus.jackson.map.JsonMappingException:要反序列化的非法类型(de.db.kigbau.client.domain.Benutzer):出于安全原因阻止