【问题标题】:Save data from multiple classes保存来自多个类的数据
【发布时间】:2018-06-19 06:41:36
【问题描述】:

我环顾四周,研究了许多类似的问题和 gui 类型,但不幸的是我仍然无法解决我的问题。目前我正在开发一个有多个页面的 Tkinter gui。人们必须插入某些属性,最终我想在最后一页打印这些属性。因此我必须访问来自不同类的条目值。但是,不知何故我无法做到这一点。有人可以帮我解决这个问题吗?

import tkinter as tk
class Main(tk.Tk):

    def get_page(self, page_class):
        return self.frames[page_class]

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

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




        container = tk.Frame(self)


        container.pack(side="top", fill="both", expand = True)

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

        self.frames = {}

        for F in (StartPage, PageOne):

            frame = F(container, self)


            self.frames[F] = frame
            self.geometry("700x400")
            self.wm_title('Size')
            self["bg"]="white"

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



        self.show_frame(StartPage)
    def show_frame(self, cont):

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


    def show_frame(self, cont):

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


import tkinter as tk

class StartPage(tk.Frame):



    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller=controller 
        self["bg"]="white"

        label1=tk.Label(self, text="What are the sizes?",bg="white",fg="green",font="verdana 10")
        label1.pack()
        L1 = tk.Label(self, text="Length :",fg="green",font="verdana 8",bg="white")
        L1.pack()
        L1.place(x=220,y = 50)

        self.E1 = tk.Entry(self, bd =5)
        self.E1.pack()
        self.E1.place(x=370,y=50)



        button = tk.Button(self, text="Next",width=25,height=2, command=lambda: controller.show_frame(PageOne))
        button.pack()
        button.place(x=470,y = 180)
        button.config(bg="green",fg='white')


class PageOne(tk.Frame):



    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller=controller
        self["bg"]="white"

        page1 = self.controller.get_page(StartPage) 
        var = page1.E1.get()
        label1=tk.Label(self, text="You have insert",bg="white",fg="green",font="verdana 10")
        label1.pack()
        label2=tk.Label(self, text=var,bg="white",fg="green",font="verdana 10")
        label2.pack()





app = Main()
app.mainloop()

【问题讨论】:

  • 你之前没问过这个吗?你试图做什么?你得到了什么?你收到错误信息了吗?始终将完整的 Traceback 作为文本提出问题。
  • 每个页面都可以访问parentcontroller,你可以用它来存储parentcontroller中的数据吗? self.controller.data1 = "some data"。或者您可以使用它来访问其他页面,即。 self.controller.frames[StartPage].E1.get()
  • place()pack()grid() 是三个层级经理——不要混用。如果您使用place(),则不需要pack()。如果您使用pack(),则不需要place()

标签: python-3.x class user-interface tkinter


【解决方案1】:

问题是因为PageOne.__init__在开始时执行,在你看到StartPage之前,所以当你使用var = page1.E1.get()Entry仍然是空的

您可以将方法update_page() 添加到每个页面并在更改页面时(单击按钮时)执行它。这样update_page 可以使用var = page1.E1.get() 在将文本放入Entry 后获得价值

我添加了按钮 "Back",因此您可以返回到 StartPage 并更改 Entry 中的值,当您转到 PageOne 时,您会看到新值。

import tkinter as tk

class Main(tk.Tk):

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

        self.geometry("700x400")

        container = tk.Frame(self)

        container.pack(side="top", fill="both", expand = True)

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

        self.frames = {}

        for F in (StartPage, PageOne):

            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()        
        frame.update_page() # <-- update data on page when you click button

    def get_page(self, page_class):
        return self.frames[page_class]


class StartPage(tk.Frame):

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

        label1 = tk.Label(self, text="What are the sizes?")
        label1.pack()

        L1 = tk.Label(self, text="Length :")
        L1.pack()

        self.E1 = tk.Entry(self)
        self.E1.pack()

        button = tk.Button(self, text="Next", command=lambda: controller.show_frame(PageOne))
        button.pack()

    def update_page(self): # empty method but I need it
        pass   

class PageOne(tk.Frame):

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

        label1 = tk.Label(self, text="You have insert")
        label1.pack()

        # create empty label at start
        self.label2 = tk.Label(self, text="")
        self.label2.pack()

        button = tk.Button(self, text="Back", command=lambda: controller.show_frame(StartPage))
        button.pack()

    def update_page(self):
        # update label when page is changed
        page1 = self.controller.get_page(StartPage) 
        var = page1.E1.get()
        self.label2['text'] = var


app = Main()
app.mainloop()

【讨论】:

  • 非常感谢您的清晰解释。帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多