Tkinter:如何通过另一帧中的按钮更新帧值?

2024-09-30 22:15:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简短的例子。我有两个帧:Page1Page2prj_conf是默认字典

在{}中, 浏览按钮指定文本文件,加载按钮读取文本文件并从文本文件更新prj_conf的值Next按钮跳到Page2

Page2中,Entryproj项显示prj_conf["_cal_input_pwr"]的值

目标是加载文本文件并更新prj_conf的值,然后按Page1中的下一步按钮。我的GUI跳转到Page2,并且Entryproj条目中的prj_conf["_cal_input_pwr"]值应该来自文本文件

然而,在原始Page2中有许多小部件,所以我想在按下下一步按钮时更新Page2中的所有小部件值。我该怎么做

import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox as mBox

# create dafault dictionary
prj_keys = ["_time", "_projet", "_DUT", "_user", "_project_dir", "_cal_input_pwr"]

prj_conf = {key: "0" for key in prj_keys}

#read text file
def read_settingfile():
    print("test")


class main_win(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.geometry(self)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.rowconfigure(0, weight=1)
        container.columnconfigure(0, weight=1)

        self.frames = {}

        for F,geometry in zip(( Page1, Page2), ( "900x617"
                                               , "993x817")):
            page_name = F.__name__
            frame = F(parent=container, controller=self)

            self.frames[page_name] = (frame, geometry)

            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("Page1")

    def show_frame(self, page_name):

        frame, geometry = self.frames[page_name]
        self.geometry(geometry)

        frame.tkraise()


class Page1(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.configure(bg = "#d8d8d8")
        self.controller = controller

        self.labelframe_newfile = tk.LabelFrame(self)
        self.loadLabelframe = tk.LabelFrame(self)
        self.button_next = tk.Button(self, command = lambda: self.setnextdata())
        self.button_next.place(relx=0.811, rely=0.891, height=41, width=150)
        self.button_next.configure(activebackground="#ececec")
        self.button_next.configure(activeforeground="#000000")
        self.button_next.configure(background="#d9d9d9")
        self.button_next.configure(disabledforeground="#a3a3a3")
        self.button_next.configure(foreground="#000000")
        self.button_next.configure(highlightbackground="#d9d9d9")
        self.button_next.configure(highlightcolor="black")
        self.button_next.configure(pady="0")
        self.button_next.configure(text='''Next''')

        self.loadLabelframe.place(relx=0.033, rely=0.25, relheight=0.6
        , relwidth=0.933)
        self.loadLabelframe.configure(relief='groove')
        self.loadLabelframe.configure(font="-family {微軟正黑體} -size 14")
        self.loadLabelframe.configure(foreground="black")
        self.loadLabelframe.configure(text='''Load File''')
        self.loadLabelframe.configure(background="#d9d9d9")
        self.loadLabelframe.configure(highlightbackground="#d9d9d9")
        self.loadLabelframe.configure(highlightcolor="black")

        self.loadprojfile_path = tk.StringVar()
        self.Entry_loadprojfile = tk.Entry(self.loadLabelframe, textvariable = self.loadprojfile_path)
        self.Entry_loadprojfile.place(relx=0.048, rely=0.723, height=31, relwidth=0.755
                    , bordermode='ignore')
        self.Entry_loadprojfile.configure(background="white")
        self.Entry_loadprojfile.configure(disabledforeground="#a3a3a3")
        self.Entry_loadprojfile.configure(font="TkFixedFont")
        self.Entry_loadprojfile.configure(foreground="#000000")
        self.Entry_loadprojfile.configure(highlightbackground="#d9d9d9")
        self.Entry_loadprojfile.configure(highlightcolor="black")
        self.Entry_loadprojfile.configure(insertbackground="black")
        self.Entry_loadprojfile.configure(selectbackground="#c4c4c4")
        self.Entry_loadprojfile.configure(selectforeground="black")

        self.button_browse_proj_fle = tk.Button(self.loadLabelframe,
        command = lambda:self.dir_browse_old())
        self.button_browse_proj_fle.place(relx=0.82, rely=0.723, height=31
        , width=65, bordermode='ignore')
        self.button_browse_proj_fle.configure(activebackground="#ececec")
        self.button_browse_proj_fle.configure(activeforeground="#000000")
        self.button_browse_proj_fle.configure(background="#d9d9d9")
        self.button_browse_proj_fle.configure(disabledforeground="#a3a3a3")
        self.button_browse_proj_fle.configure(foreground="#000000")
        self.button_browse_proj_fle.configure(highlightbackground="#d9d9d9")
        self.button_browse_proj_fle.configure(highlightcolor="black")
        self.button_browse_proj_fle.configure(pady="0")
        self.button_browse_proj_fle.configure(text='''Browse''')

        self.button_load = tk.Button(self.loadLabelframe, command = lambda:self.loadfile())
        self.button_load.place(relx=0.912, rely=0.723, height=31, width=49
                    , bordermode='ignore')
        self.button_load.configure(activebackground="#ececec")
        self.button_load.configure(activeforeground="#000000")
        self.button_load.configure(background="#d9d9d9")
        self.button_load.configure(disabledforeground="#a3a3a3")
        self.button_load.configure(foreground="#000000")
        self.button_load.configure(highlightbackground="#d9d9d9")
        self.button_load.configure(highlightcolor="black")
        self.button_load.configure(pady="0")
        self.button_load.configure(text='''Load''')

    def setnextdata(self):

        self.controller.show_frame("Page2")

    def dir_browse_old(self):

        self.old_work_directory = filedialog.askopenfilename( filetypes = (("project files", "*.prj"),("all files","*.*")) )
        self.loadprojfile_path.set(self.old_work_directory)


    def loadfile(self):

        read_settingfile(self.old_work_directory)
        print("load"+str(prj_conf["_cal_input_pwr"]))


class Page2(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(bg = "#d8d8d8")

        self.TSeparator1 = ttk.Separator(self)
        self.TSeparator1.place(relx=0.005, rely=0.092, relwidth=0.987)

        self.label_title = tk.Label(self)
        self.label_title.place(relx=0.07, rely=0.018, height=55, width=793)
        self.label_title.configure(activebackground="#f9f9f9")
        self.label_title.configure(activeforeground="black")
        self.label_title.configure(background="#d9d9d9")
        self.label_title.configure(disabledforeground="#a3a3a3")
        self.label_title.configure(font="-family {新細明體} -size 30")
        self.label_title.configure(foreground="#000000")
        self.label_title.configure(highlightbackground="#d9d9d9")
        self.label_title.configure(highlightcolor="black")
        self.label_title.configure(text='''Step 2. Calibration Setting''')

        self.button_last = tk.Button(self, command = lambda: self.last_update())
        self.button_last.place(relx=0.03, rely=0.93, height=41, width=150)
        self.button_last.configure(activebackground="#ececec")
        self.button_last.configure(activeforeground="#000000")
        self.button_last.configure(background="#d9d9d9")
        self.button_last.configure(disabledforeground="#a3a3a3")
        self.button_last.configure(foreground="#000000")
        self.button_last.configure(highlightbackground="#d9d9d9")
        self.button_last.configure(highlightcolor="black")
        self.button_last.configure(pady="0")
        self.button_last.configure(text='''Last''')

        self.inpu_pow_leve_frame = tk.Frame(self)
        self.inpu_pow_leve_frame.place(relx=0.081, rely=0.208, relheight=0.092
                , relwidth=0.846)
        self.inpu_pow_leve_frame.configure(relief='groove')
        self.inpu_pow_leve_frame.configure(borderwidth="2")
        self.inpu_pow_leve_frame.configure(relief="groove")
        self.inpu_pow_leve_frame.configure(background="#d9d9d9")
        self.inpu_pow_leve_frame.configure(highlightbackground="#d9d9d9")
        self.inpu_pow_leve_frame.configure(highlightcolor="black")

        self.label_inpu_pow_leve = tk.Label(self.inpu_pow_leve_frame)
        self.label_inpu_pow_leve.place(relx=0.036, rely=0.267, height=36
                , width=271)
        self.label_inpu_pow_leve.configure(activebackground="#f9f9f9")
        self.label_inpu_pow_leve.configure(activeforeground="black")
        self.label_inpu_pow_leve.configure(background="#d9d9d9")
        self.label_inpu_pow_leve.configure(disabledforeground="#a3a3a3")
        self.label_inpu_pow_leve.configure(font="-family {微軟正黑體} -size 14")
        self.label_inpu_pow_leve.configure(foreground="#000000")
        self.label_inpu_pow_leve.configure(highlightbackground="#d9d9d9")
        self.label_inpu_pow_leve.configure(highlightcolor="black")
        self.label_inpu_pow_leve.configure(text='''Input Power Level (dBm)''')

        self.var_inpu_pow_leve = tk.IntVar()
        self.var_inpu_pow_leve.set(prj_conf["_cal_input_pwr"])
        self.Entryproj = tk.Entry(self.inpu_pow_leve_frame,textvariable = self.var_inpu_pow_leve)

        self.Entryproj.place(relx=0.383, rely=0.267,height=31, relwidth=0.58)
        self.Entryproj.configure(background="white")
        self.Entryproj.configure(disabledforeground="#a3a3a3")
        self.Entryproj.configure(font="TkFixedFont")
        self.Entryproj.configure(foreground="#000000")
        self.Entryproj.configure(highlightbackground="#d9d9d9")
        self.Entryproj.configure(highlightcolor="black")
        self.Entryproj.configure(insertbackground="black")
        self.Entryproj.configure(selectbackground="#c4c4c4")
        self.Entryproj.configure(selectforeground="black")

    def last_update(self):

        self.controller.show_frame("Page1")


app = main_win()
app.mainloop()

Tags: selfconfigurebuttonframelabeltkblackentry