如何通过我的切换框函数将Tkinter入口值从一帧传递到另一帧 [英] How to pass Tkinter entry value from one frame to another through my switch frame function

查看:156
本文介绍了如何通过我的切换框函数将Tkinter入口值从一帧传递到另一帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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.

此处masterTab1,但是使用master.master您可以将其保留在NoteBook中,并使用master.master.masterRootApp

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆