更新之前的帧框架tkraise()

2024-04-27 20:33:03 发布

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

我正在尝试编写一个小应用程序,从数据库中搜索客户的详细信息,并使用不同的框架来更新客户的各个方面,以输入不同类别的信息。由于每一帧的信息输入是完整的,我想返回到一个恢复帧,以查看和随后存储完整的信息。我的问题是,我不能让resume框架更新我存储在controller类中dict中的信息。帧更新()似乎不起作用。正确的方法是什么? 谢谢你的帮助。 以下是代码的简化版本

import tkinter as tk
from PIL import ImageTk
from tkinter import ttk


class OrdersApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "2017 Orders")
        tk.Tk.wm_geometry(self, "1024x690+40+60")

        windowbox = tk.Frame(self)
        windowbox.pack(side="top", fill="both", expand=True)

        windowbox.grid_rowconfigure(0, weight=1)
        windowbox.grid_columnconfigure(0, weight=1)

        self.shared_data = {
            "familyname": tk.StringVar(),
        }

    self.frames = {}

    for F in (Home, CustomerSelect):

        frame = F(windowbox, self)

        self.frames[F] = frame
        frame.configure(background="#dcc8af")
        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame(Home)

def show_frame(self, cont):

    frame = self.frames[cont]
    frame.tkraise()

def search_by_number(self, searchnumber, cont):
    # cont is the frame to be called after function run
    print(searchnumber)  # to check input
# here data grabbed from db using user input phone number (now hard coded)
    row = 'chris'

    self.shared_data["familyname"].set(row)

    print(self.shared_data["familyname"].get() + ' SBN has run')
    # the data is stored successfult to the controler dict
    frame = self.frames[cont]
    frame.update()
    frame.tkraise()
# this raises cont(customerdetails) but the new information from  shared_data is not updated


class Home(tk.Frame):

def __init__(self, parent, controller):
    self.controller = controller
    tk.Frame.__init__(self, parent)

    button1 = tk.Button(self, text="Search", compound=tk.CENTER, borderwidth=3, relief="raised",
                        command=lambda: controller.search_by_number(phonenumber.get(), CustomerSelect))
    image3 = ImageTk.PhotoImage(file="images/buttonRed.gif")
    button1.config(image=image3, width=64, height=40)
    button1.image = image3
    button1.grid(row=0, column=0)

    framelabel = tk.Label(self, text="Home Frame")
    framelabel.grid(row=0, column=1)

    phonelabel = ttk.Label(self, text="phone number", font=("Arial", 20), background='#dcc8af')
    phonelabel.grid(row=2, column=1)
    phonenumber = ttk.Entry(self, width=30, font=("Arial", 20))
    phonenumber.insert(0, "0468777904")
    phonenumber.grid(row=2, column=2, padx=16, pady=16)


class CustomerSelect(tk.Frame):

def __init__(self, parent, controller):
    self.controller = controller
    tk.Frame.__init__(self, parent)

    framelabel = tk.Label(self, text="Customer select Frame")
    framelabel.grid(row=0, column=3)

    familynamelabel = ttk.Label(self, text="Family name", font=("Arial", 10), background='#dcc8af')
    familynamelabel.grid(row=1, column=2)
    familyname = ttk.Entry(self, width=20, font=("Arial", 10))
    fn = self.controller.shared_data["familyname"].get()
    familyname.insert(0, fn)
    familyname.grid(row=1, column=3, padx=4, pady=8)


app = OrdersApp()
app.mainloop()

Tags: selfdatainitdefcolumnframetkgrid
1条回答
网友
1楼 · 发布于 2024-04-27 20:33:03

除了你的代码还有很多问题。这是一个简单的示例,使用两个类,演示了如何通过调用第二个类中的update函数来更新其中一个类中的条目。请注意,类的一部分用途是包含与代码的特定函数相关的所有方法,也就是说,在这个简单的示例中,类创建它使用的小部件并更新其条目小部件。在

class OrdersApp():

    def __init__(self, master):
        self.master=master
        self.frames = {}

        CS_instance=CustomerSelect(self.master)

        ## dictionaryy will only have one entry because there
        ## is only one other class in this example 
        self.frames["CustomerSelect"]=CS_instance

        ## test = wait for 5 seconds and change entry
        self.master.after(5000, self.change_entry)

    def change_entry(self):
        """ change the Entry widget from this class
            by calling function in other class
        """
        self.frames["CustomerSelect"].update_entry("From OrdersApp  ")

class CustomerSelect():
    def __init__(self, parent):
        fr=tk.Frame(parent)
        fr.grid(row=1, column=1)
        tk.Label(fr, text="Customer select Frame").grid(row=0, column=3)

        tk.Label(fr, text=" Family name ", font=("Arial", 10),
                 background='#dcc8af').grid(row=1, column=2)
        self.familyname = tk.Entry(fr, width=50, font=("Arial", 10))
        self.familyname.grid(row=1, column=3, padx=4, pady=8)

        ## initial text
        self.update_entry("From CustomerSelect")

    def update_entry(self, new_text):
        self.familyname.insert(0, new_text)

master=tk.Tk()
OA=OrdersApp(master)
master.mainloop()

相关问题 更多 >