2017-09-06 24 views
0

之前更新帧我试图编写一个小应用程序,从数据库搜索客户的详细信息,并更新他们使用不同的帧输入各种信息的catagorys的方面。当每一帧信息输入完成时,我想返回到一个简历框架来查看并随后存储完整的信息。我的问题是我无法通过控制器类中的字典存储信息来更新简历框架。 frame.update()似乎不起作用。什么是实现这一目标的正确方法? 感谢您的帮助。 这里是代码的简化版本;更新帧frame.tkraise()

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() 
+0

您好,请提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。您提供了比检查问题所需更多的代码。您还需要提供您的导入,现在您正在调用您的课程,因为这些课程与确保您的代码不会丢失任何内容相关。 –

+0

感谢您的提示 - 我很缺乏经验(和老)我跟着链接,并希望更好地刺穿代码。它运行没有错误,但familyname ttk Entry小部件似乎没有收到数据? – user3617217

回答

0

除了缩进之外,代码还有很多问题。这是一个简单的例子,使用2个类,它显示了如何通过调用第二个类中的更新函数来更新任何一个Entry。请注意,类的部分目的是包含与代码的特定功能相关的所有方法,即类将创建它使用的小部件,并在此简单示例中更新其Entry部件。

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() 
+0

感谢您的输入。 我似乎无法得到此代码运行它自己(我先导入Tkinter)或通过替换我的示例中的类。在这两种情况下,我得到的控制台错误 线10条,在__init__ CS_instance = CustomerSelect(self.master) NameError:名字 'CustomerSelect' 没有定义 我缺少什么? – user3617217

+0

它运行良好,使用“导入tkinter作为tk”。对于我发布的示例,我没有看到第10行可以是“CS_instance = CustomerSelect(self.master)”。检查类定义上的拼写并确保它拼写相同,并且在其他代码下不缩进。除此之外,使用完整的错误消息发布您正在运行的代码。 –