【发布时间】: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