从 __init__ 以外的方法/函数内部更改 tkinter 框架

Posted

技术标签:

【中文标题】从 __init__ 以外的方法/函数内部更改 tkinter 框架【英文标题】:Changing a tkinter frame from inside a method/function other than __init__ 【发布时间】:2015-04-28 07:26:27 【问题描述】:

我想做的是找到一种方法来从除 def __init__ 以外的方法/函数更改 Frame

我用来更改和管理框架的主要课程是:

class ShopCounter(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 i in (PageOne, PageTwo):
            frame = i(container, self)
            self.frames[i] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.showFrame(Login)

    def showFrame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

我从这里遇到的问题是,当我创建一个新窗口时,例如

class PageOne (tk.Frame):
    def __init__ (self, parent, controller):
        tk.Frame.__init__(self, parent)
        lbl = tk.Label(self, text="Page 1")
        lbl.pack()

这也在 __init__ 中 因为这会调用 nextPage 函数(稍后显示) 下一页()

但是我需要从 CSV 电子表格中读取以检查此人是否输入了用户名和密码(为方便起见,没有放置检查代码或输入字段)然后我发现我需要将框架从PageOne 类中的不同函数

然后我遇到了一个问题,现在必须在这个新函数 s 中通过函数的括号在调用它时定义一个控制器,这是一个问题,因为我不知道如何做到这一点,只是把它作为 __init__ 方法中的参数

快速示例:

说类中的函数是这样的..

def nextPage (self, controller):
    controller.showFrame(PageTwo)

IDLE 然后告诉我这个函数“控制器”的参数丢失了,但我不知道如何手动设置它

【问题讨论】:

【参考方案1】:

我找到了解决办法

class PageOne (tk.Frame):
    def __init__ (self, parent, controller):
        tk.Frame.__init__(self, parent)
        lbl = tk.Label(self, text="Page 1")
        lbl.pack()

        button = tk.Button(self, text="switch", command=lambda: self.launch(controller)
        button.pack()

    def launch (self, cont):
        cont.showFrame(PageTwo)

现在我在 PageOne 类中创建了一个函数(启动),它以 self 和 cont(控制器)作为参数。然后,当您按下按钮时,您会将控制器从 init 传递到启动功能。

希望这对您有所帮助。因为就我个人而言,几个月来我一直被这个问题难住了。

更新

这个答案几个月后,我现在找到了一种新方法,而不是总是将控制器作为参数传递给您在每个页面类中使用的每个函数,在类的启动中 (__ init __ ),你可以为持有控制器的对象声明一个变量,下面是一个例子:

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

    def doSomething (self):
        self.controller.doSomething()

通过引用控制器可以运行控制器类中的任何类,还可以获取变量数据并进行更改。

【讨论】:

以上是关于从 __init__ 以外的方法/函数内部更改 tkinter 框架的主要内容,如果未能解决你的问题,请参考以下文章

从 Jupyter 子包内部导入子包的 __init__

Python:从内部类访问外部私有函数

知识点:类

Python+类内部方法相互调用

Python内置函数之super()

在 Python 中从 __init__ 调用 setter