【问题标题】:Switch frames in Tkinter without a button无需按钮即可在 Tkinter 中切换帧
【发布时间】:2021-03-30 13:40:49
【问题描述】:

我正在使用以下代码创建一个 Tkinter 窗口并切换它显示的帧。

import tkinter

class GUI(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        self._frame = None
        self.switch(Frame1)

    def switch(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()


class Frame1(tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        tkinter.Label(self, text="Frame1").pack()

        parent.switch(Frame2) # not working
        tkinter.Button(self, text="switch", command=lambda: parent.switch(Frame2)).pack() # working


class Frame2(tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        tkinter.Label(self, text="Frame2").pack()


if __name__ == '__main__':
    gui = GUI()
    gui.mainloop()

请注意,切换功能是在没有按钮的情况下执行的,但仅在单击时起作用。

【问题讨论】:

  • 你在哪里打电话给.switch(),如果不是通过按钮?我们需要看到minimal reproducible example 才能提供帮助。
  • @jasonharper 谢谢,我编辑了我的问题。
  • 您在Frame1.__init__() 中对.switch() 的调用发生在GUI.__init__() 中对.switch() 的调用中。外部调用取消了内部调用的效果。但是这段代码无论如何都没有意义,有一个Frame1 只是用Frame2 替换自己有什么意义?
  • @jasonharper 在Frame1.__init__() 中的.switch() 调用上方有一个数据读取过程。在此过程完成之前,应显示 Frame1,但我无法在 Frame1.__init__() 方法内切换帧。我能做什么?
  • 在您描述的场景中,Frame1 永远不会真正可见;小部件状态更改不会立即显示,您通常必须返回主循环才能实际发生视觉更新。可以更快地强制更新,但这仍然会使您的 GUI 在数据读取过程中处于无响应状态 - 这不是一个很好的用户体验。

标签: python python-3.x tkinter tkinter-button


【解决方案1】:

这是正在发生的事情:

  1. GUI 开始切换到第 1 帧
  2. Frame1 已创建并切换到 Frame 2
  3. GUI 完成切换到第 1 帧

因此,应用程序在第 1 帧结束

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多