OOP Tkinter Python OOP - 从一个类如何在另一个类中运行方法?

时间:2017-04-06 21:56:16

标签: python class oop user-interface tkinter

我希望有一个带有输入框的框架,当按下它旁边的提交按钮时,它会提交输入并从类Add_Label调用函数ChangedPage,其中函数添加在然后提出我希望标签出现的下一帧。

问题是我希望我调用的函数将一个小部件添加到第二个类而不是我调用它的类。我制作了一个新程序来证明这个问题:

import tkinter as tk

class Creating_Stuff(tk.Tk):

    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 (PageTwo, ChangedPage):

            frame = F(container, self)

            self.frames[F] = frame

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

        self.show_frame(PageTwo)

    def show_frame(self, cont):

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

class PageTwo(tk.Frame):

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

        self.tk_setPalette(background='#bbfff0', foreground='black',
               activeBackground='#d9d9d9', activeForeground='#ff9933')

        self.controller = controller

        title_2 = tk.Label(self, text= "Input Page #frame1", font = "Times 17 underline bold").place(relx = 0.5, rely = 0.1, relwidth = 0.4, anchor="center")

        self.ENTRY = tk.Entry(self,width = 10, bg='white', fg='Black')
        self.ENTRY.place(relx=0.5,rely=0.5,relwidth=0.3,anchor="center")

        self.submit_button_2 = tk.Button(self, text="Submit Request", bg='#f2f2f2', command= self.raising)
        self.submit_button_2.place(relx=0.4,rely=0.6,relwidth=0.2,anchor="center")

        ####Generic Stuff

        Exit = tk.Button(self, text ="Exit",command=lambda:destroy(),bg='#f2f2f2')
        Exit.place(relx=0.5,rely=(9/10), relwidth = 0.4, anchor="center")

    def raising(self):
        #Memes and stuff goes here
        global bob

        bob = self.ENTRY.get()
        ChangedPage.Add_Label(self)

        self.controller.show_frame(ChangedPage)

class ChangedPage(tk.Frame):

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

        ###Main stuff for the frames

        self.title_27 = tk.Label(self, text= "Example Changed Page? #frame2", font = "Times 16 italic underline"
                                 ).place(relx = 0.36, rely = 0.05, relwidth = 0.4, anchor=tk.CENTER)

        ####Generic Stuff
        bk2_Menu2 = tk.Button(self, text="Back to start",
                            command=lambda: controller.show_frame(PageTwo),bg='#f2f2f2')
        bk2_Menu2.place(relx=0.5,rely=(0.8), relwidth = 0.2, anchor="center")


        Exit = tk.Button(self, text ="Exit",command=lambda:destroy(),bg='#f2f2f2')
        Exit.place(relx=0.5,rely=(9/10), relwidth = 0.4, anchor="center")

    def Add_Label(self):

        self.label1 = tk.Label(self, text= bob, font="Times 20")
        self.label1.place(anchor = tk.CENTER, relx = 0.5, rely = 0.5, relwidth = 0.2, relheight = 0.1)

app = Creating_Stuff()
def destroy():
    app.destroy()

app.tk_setPalette(background='#bbfff0', foreground='black',
       activeBackground='#d9d9d9', activeForeground='#ff9933')

app.title("Example Label Adding Program")
app.geometry("800x450")
app.mainloop()

我所显示的代码是一个程序,第一页带有输入框,当你提交它时会带你到下一帧并运行类ChangedPage中的函数,这是为了在页面上制作标签这只是提出来的。任何人都可以看到出了什么问题吗?

起始页面在这里:

它应该去哪里:

2 个答案:

答案 0 :(得分:1)

第一步是更新控制器,以便能够返回页面实例。

class Creating_Stuff(tk.Tk):
    ...
    def get_page(self, page_class):
        return self.frames[page_class]

接下来,您需要调用此函数来获取对先前创建的实例的引用,您可以从该实例调用该方法:

class PageTwo(tk.Frame):
    ...
    def raising(self):
        ...
        changed_page = self.controller.get_page(ChangedPage)
        changed_page.AddLabel()
        ...

答案 1 :(得分:0)

您正在调用一个类方法,没有附加任何实例来处理它。

例如,要创建class Creating_Stuff(tk.Tk):,请使用代码

app = Creating_Stuff()

这会为您提供名为Creating_Stuff的{​​{1}}实例。因此,您致电app

您可能在某些代码中创建了app.destroy()的实例,但是您没有引用该实例。

在某些时候(可能在class ChangedPage的{​​{1}}),您需要以下内容:

__init__

然后在PageTwo

MyWorkingPage = ChangedPage()

现在,代码将显示您要显示的ChangedPage。

def raising(self):MyWorkingPage.Add_Label() self.controller.show_frame(MyWorkingPage) 之类的内容,但它们并不是您想要的。