【发布时间】:2020-08-23 14:44:58
【问题描述】:
我刚开始使用 python,我正在尝试制作一个由 3 帧组成的简单 gui。一个在左边,一个在右边,一个在中间。稍后我想在这些框架中添加按钮和东西,但现在仅此而已。如果按退出键,我希望左框架消失或再次出现。为此,我编写了以下代码:
from tkinter import Tk, Button, Label, Frame
class Main:
def __init__(self):
self.root = Tk()
self.init_gui()
def init_gui(self):
self.root.title("Gui Testing")
self.root.minsize(900,600)
self.root.bind("<Escape>", self.toggle_left_menu)
self.root.grid_columnconfigure(0, minsize=200)
self.root.grid_columnconfigure(1, weight=1)
self.root.grid_columnconfigure(2, minsize=250)
self.root.grid_rowconfigure(0, weight=1)
# main 3 panels
self.left_menu_active = True
self.left_menu = Frame(self.root, bg="#333")
self.left_menu.grid(row=0, column=0, sticky="nsew")
self.center = Frame(self.root, bg="white")
self.center.grid(row=0, column=1, sticky="nsew")
self.right_menu = Frame(self.root, bg="#888")
self.right_menu.grid(row=0, column=2, sticky="nsew")
self.toggle_left_menu()
def toggle_left_menu(self, event=None):
if self.left_menu_active == True:
self.left_menu_active = False
self.root.grid_columnconfigure(0, minsize=0)
self.left_menu.grid_forget()
else:
self.left_menu_active = True
self.root.grid_columnconfigure(0, minsize=200)
self.left_menu.grid(row=0, column=0, sticky="nsew")
def start(self):
self.root.mainloop()
Main().start()
问题是当我按下退出键时,什么也没有发生。但是,当我通过单击并拖动它来移动窗口时,它会突然更新,并以我想要的方式显示窗口。所以代码似乎可以工作,但由于某种原因窗口没有更新。
我不知道我能做些什么。我发现它确实会更新左侧和中心框架的网格位置,但grid_configure() 似乎不会在不移动窗口的情况下更新。
有没有办法更新框架或以其他方式实现框架切换?
编辑:
问题已通过在每一帧中添加一个按钮来解决。现在框架不再是空的,它似乎有效。我还稍微编辑了toggle_left_menu() 函数。这是我改变的:
添加按钮:
self.test_button1 = Button(self.left_menu, text="left", padx=10, pady=5)
self.test_button1.grid(row=0, column=0)
self.test_button2 = Button(self.center, text="center", padx=10, pady=5)
self.test_button2.grid(row=0, column=0)
self.test_button3 = Button(self.right_menu, text="right", padx=10, pady=5)
self.test_button3.grid(row=0, column=0)
编辑toggle_left_menu():
def toggle_left_menu(self, event=None):
if self.left_menu.winfo_viewable():
self.root.grid_columnconfigure(0, minsize=0)
self.left_menu.grid_remove()
else:
self.root.grid_columnconfigure(0, minsize=200)
self.left_menu.grid()
这对我有用,谢谢!
【问题讨论】:
-
你在 OSX 上运行吗?
-
@BryanOakley 不,我在 Windows 10 上运行
-
如果你把东西放在框架里,问题就会消失。
-
@acw1668 成功了,谢谢!但是,当您的框架中没有任何内容时,为什么它不起作用?