所以,我正在创建一个博客,现在,我在设置部分,我有一个带有按钮的滑动面板,我希望它转到一个新窗口,我将在其中创建新的小部件等...,我已经完成了这种登录和注册的事情,问题是现在我不能使用 pack.forget(),它只是不起作用
class SlidePanel(customtkinter.CTkFrame):
def __init__(self, parent, start_pos, end_pos):
super().__init__(master=parent, fg_color="white")
# Attributes
self.start_pos = start_pos
self.end_pos = end_pos
self.width = abs(start_pos - end_pos)
# Animated attributes
self.pos = start_pos
self.in_start_pos = True
# Layout
self.place(relx=self.start_pos, rely=0.05, relwidth=0.25, relheight=0.9) # Adjust the width to 0.25
# Add buttons
self.add_buttons()
def add_buttons(self):
button_explore = customtkinter.CTkButton(self, text="Explore", command=self.on_explore)
button_profile = customtkinter.CTkButton(self, text="Profile", command=self.on_profile)
button_settings = customtkinter.CTkButton(self, text="Settings", command=self.on_settings)
button_explore.pack(expand=True, pady=7)
button_profile.pack(expand=True, pady=7)
button_settings.pack(expand=True, pady=7)
def on_explore(self):
print("Explore button clicked")
def on_profile(self):
print("Profile button clicked")
def on_settings(self):
open_settings_window()
def animate(self):
if self.in_start_pos:
self.animate_forward()
else:
self.animate_backward()
def animate_forward(self):
if self.pos < self.end_pos:
self.pos += 0.005 # Increase the step size for faster animation
self.place(relx=self.pos, rely=0.05, relwidth=0.25, relheight=0.9) # Adjust the width to 0.25
self.after(5, self.animate_forward)
else:
self.in_start_pos = False
def animate_backward(self):
if self.pos > self.start_pos:
self.pos -= 0.005 # Increase the step size for faster animation
self.place(relx=self.pos, rely=0.05, relwidth=0.25, relheight=0.9) # Adjust the width to 0.25
self.after(5, self.animate_backward)
else:
self.in_start_pos = True
def open_settings_window():
for widget in window.winfo_children():
widget.pack_forget()
window.title("Settings Hub") # Update title
# Create the new widgets for the settings page
label = customtkinter.CTkLabel(window, text="test",)
label.pack(pady=10)
我期待它有点刷新,我们会说,给我一个干净的窗口,带有新标题,里面有一个标签供测试
问题出在的
open_settings_window
函数试图在循环中使用
pack_forget()
的同时删除小部件。在 Tkinter 中(
customtkinter
是建立在 Tkinter 之上的),在迭代小部件集合的同时修改它可能会导致意外行为。
与其尝试一次性删除所有小部件,不如考虑为的设置页面创建一个单独的框架,并在打开设置窗口时隐藏主要内容框架并显示设置框架。
以下是如何修改代码以实现此目的的方法:
import customtkinter
class SlidePanel(customtkinter.CTkFrame):
# ...(代码与之前相同)...
def open_settings_window():
global content_frame # Make content_frame accessible
content_frame.pack_forget() # Hide the main content
settings_frame.pack(fill="both", expand=True) # Show the settings frame
# --- Main application ---
window = customtkinter.CTk()
window.geometry("800x600")
# Create a frame for the main content
content_frame = customtkinter.CTkFrame(window)
content_frame.pack(fill="both", expand=True)
# Create the settings frame but don't pack it yet
settings_frame = customtkinter.CTkFrame(window)
label = customtkinter.CTkLabel(settings_frame, text="test")
label.pack(pady=10)
slide_panel = SlidePanel(window, start_pos=-0.25, end_pos=0)
window.mainloop()
说明:
-
全局
content_frame
: 我们使content_frame
成为全局变量,以便可以在open_settings_window
中访问它。 -
content_frame
和settings_frame
: 我们创建了两个框架:一个用于应用程序的主要内容(content_frame
),另一个用于设置页面(settings_frame
)。 -
最初隐藏
settings_frame
: 我们创建了settings_frame
,但没有使用pack
将其添加到窗口中,因此它最初是隐藏的。 -
open_settings_window
中切换框架: 在此函数中,我们现在隐藏content_frame
并显示settings_frame
,从而有效地切换到设置页面。
通过这种方法,可以避免在迭代时从窗口中删除小部件的问题,并创建一个更清晰的应用程序布局。
标签:python,tkinter,customtkinter From: 78777527