【问题标题】:Tkinter - Why is my python class being called?Tkinter - 为什么我的 python 类被调用?
【发布时间】:2021-04-10 14:43:32
【问题描述】:

谁能解释为什么程序运行时会打印“hello”?我原以为只有 welcome_frame 会运行,因为那是已经提出的框架,但似乎并非如此。

那么为什么在我启动程序时所有类都会立即运行,我该如何阻止这种情况发生?

我想要的是在welcome_frame 中按下一个按钮,它会导致edit_booking_frame 中的所有内容都运行。

谢谢你:)

# import tkinter modules
from tkinter import *
from tkinter import ttk

# define self
class tkinterApp(Tk):

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

        # creating a container
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)

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

        # initialising frames to an empty array
        self.frames = {}

        for F in (welcome_frame, edit_booking_frame):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

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

        self.show_frame("welcome_frame")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

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


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

        print("hello") ### WHY IS THIS PRINTED???


if __name__ == "__main__":
    app = tkinterApp()
    app.geometry("1000x800")
    app.mainloop()

【问题讨论】:

  • 在 for 循环中有这一行:F(parent=container, controller=self),当Fedit_booking_frame 时,它调用edit_booking_frame 的构造函数,即__init__ 方法。
  • 在代码中,所有帧都将被初始化,但屏幕上只显示顶部帧。通过在您的show_frame 方法中调用.tkraise(),您可以将该框架设置为最上面的框架,因此其余的都在它下面。

标签: python python-3.x class tkinter


【解决方案1】:

那么为什么在我启动程序时所有类都会立即运行,我该如何阻止这种情况发生?

这就是您复制的代码的设计目的。每个类都在程序一开始就被实例化,在这个循环中:

for F in (welcome_frame, edit_booking_frame):
    page_name = F.__name__
    frame = F(parent=container, controller=self)
    self.frames[page_name] = frame

F(parent=container, controller=self) 行将类实例化。第一次循环Fwelcome_frame,下一次是edit_booking_frame

循环与执行此操作相同:

self.frames['welcome_frame'] = welcome_frame(parent=controller, controller_self)
self.frames['edit_booking_frame'] = edit_booking_frame(parent=controller, controller=self)

我想要的是在welcome_frame 中按下一个按钮,它会导致edit_booking_frame 中的所有内容都运行。

如果是这样,可能不应该使用此代码。此代码明确设计用于预先创建所有帧。

还有其他选择,并且有一些方法可以安排代码在框架显示后运行。我建议查看此问题的答案中的所有答案和链接:

Switch between two frames in tkinter

【讨论】:

  • 好的,我已经浏览了所有的答案和链接,似乎创建自定义事件将是解决此问题的最佳方式...仍然不完全确定如何执行此操作。我已经向show_frame 函数添加了一个自定义事件,但不太确定从那里去哪里。自定义事件是最好的主意还是我只是让事情变得过于复杂?我正在考虑完全放弃课程 TBH。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2022-08-24
  • 2013-04-24
  • 2018-07-11
相关资源
最近更新 更多