如何消除Tkinter/CustomTkinter中进度条与Entry组件的间距
问题:消除CustomTkinter中Entry与进度条的间距
我基于Tkinter和CustomTkinter修改了一个模板作为代码脚手架,原本计划添加表格,但首先需要完全消除Entry组件与进度条之间的间距。尝试调整sticky属性、内边距(pad)及行列参数后问题仍未解决。
原代码
import tkinter import tkinter.messagebox import customtkinter import CTkTable customtkinter.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light" customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue" class App(customtkinter.CTk): def __init__(self): super().__init__() # configure window self.title("GameBenchMark") self.geometry(f"{1100}x{580}") # configure grid layout (4x4) self.grid_columnconfigure(1, weight=1) self.grid_columnconfigure((2, 3), weight=0) self.grid_rowconfigure((0, 1, 2), weight=1) # create sidebar frame with widgets self.sidebar_frame = customtkinter.CTkFrame(self, width=140, corner_radius=0) self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew") self.sidebar_frame.grid_rowconfigure(4, weight=1) self.logo_label = customtkinter.CTkLabel(self.sidebar_frame, text="GameBenchMark", font=customtkinter.CTkFont(size=20, weight="bold")) self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10)) self.appearance_mode_label = customtkinter.CTkLabel(self.sidebar_frame, text="Appearance Mode:", anchor="w") self.appearance_mode_label.grid(row=5, column=0, padx=20, pady=(10, 0)) self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.sidebar_frame, values=["Light", "Dark", "System"], command=self.change_appearance_mode_event) self.appearance_mode_optionemenu.grid(row=6, column=0, padx=20, pady=(10, 10)) # create main entry and button self.entry = customtkinter.CTkEntry(self) self.entry.grid(row=0, column=1, columnspan=1, padx=(20, 0), pady=(20, 20), sticky="new") self.main_button_1 = customtkinter.CTkButton(master=self, text='Search', fg_color="transparent", border_width=2, text_color=("gray10", "#DCE4EE")) self.main_button_1.grid(row=0, column=3, padx=(20, 20), pady=(20, 20), sticky="nw") # create slider and progressbar frame self.slider_progressbar_frame = customtkinter.CTkFrame(self, fg_color="transparent") self.slider_progressbar_frame.grid(row=1, column=1, padx=(10,0), pady=(10,0), sticky="new") self.slider_progressbar_frame.grid_columnconfigure(0, weight=1) self.slider_progressbar_frame.grid_rowconfigure(4, weight=1) self.progressbar_1 = customtkinter.CTkProgressBar(self.slider_progressbar_frame) self.progressbar_1.grid(row=1, column=0, padx=(10, 0), pady=(10, 0), sticky="new") self.progressbar_2 = customtkinter.CTkProgressBar(self.slider_progressbar_frame) self.progressbar_2.grid(row=2, column=0, padx=(10,0), pady=(10, 0), sticky="new") self.appearance_mode_optionemenu.set("Dark") self.progressbar_1.configure(mode="indeterminnate") self.progressbar_1.start() def change_appearance_mode_event(self, new_appearance_mode: str): customtkinter.set_appearance_mode(new_appearance_mode) if __name__ == "__main__": app = App() app.mainloop()
界面效果

解决方法
间距问题由三个原因导致:
- Entry组件的底部内边距设置了20;
- 进度条所在Frame的顶部内边距设置了10;
- 主窗口给row0设置了
weight=1,导致该行自动拉伸产生额外空间。
修改后的代码如下:
import tkinter import tkinter.messagebox import customtkinter import CTkTable customtkinter.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light" customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue" class App(customtkinter.CTk): def __init__(self): super().__init__() # configure window self.title("GameBenchMark") self.geometry(f"{1100}x{580}") # configure grid layout (4x4) self.grid_columnconfigure(1, weight=1) self.grid_columnconfigure((2, 3), weight=0) # 仅给需要拉伸的行设置weight,row0和row1不需要,避免自动撑开间距 self.grid_rowconfigure((2, 3), weight=1) # create sidebar frame with widgets self.sidebar_frame = customtkinter.CTkFrame(self, width=140, corner_radius=0) self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew") self.sidebar_frame.grid_rowconfigure(4, weight=1) self.logo_label = customtkinter.CTkLabel(self.sidebar_frame, text="GameBenchMark", font=customtkinter.CTkFont(size=20, weight="bold")) self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10)) self.appearance_mode_label = customtkinter.CTkLabel(self.sidebar_frame, text="Appearance Mode:", anchor="w") self.appearance_mode_label.grid(row=5, column=0, padx=20, pady=(10, 0)) self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.sidebar_frame, values=["Light", "Dark", "System"], command=self.change_appearance_mode_event) self.appearance_mode_optionemenu.grid(row=6, column=0, padx=20, pady=(10, 10)) # create main entry and button self.entry = customtkinter.CTkEntry(self) # 去掉Entry底部内边距,pady改为(20, 0) self.entry.grid(row=0, column=1, columnspan=1, padx=(20, 0), pady=(20, 0), sticky="new") self.main_button_1 = customtkinter.CTkButton(master=self, text='Search', fg_color="transparent", border_width=2, text_color=("gray10", "#DCE4EE")) self.main_button_1.grid(row=0, column=3, padx=(20, 20), pady=(20, 20), sticky="nw") # create slider and progressbar frame self.slider_progressbar_frame = customtkinter.CTkFrame(self, fg_color="transparent") # 去掉Frame顶部内边距,pady改为(0, 0) self.slider_progressbar_frame.grid(row=1, column=1, padx=(10,0), pady=(0,0), sticky="new") self.slider_progressbar_frame.grid_columnconfigure(0, weight=1) # 移除不需要的row配置,避免Frame内产生额外空间 self.progressbar_1 = customtkinter.CTkProgressBar(self.slider_progressbar_frame) # 去掉进度条顶部内边距,pady改为(0, 0) self.progressbar_1.grid(row=1, column=0, padx=(10, 0), pady=(0, 0), sticky="new") self.progressbar_2 = customtkinter.CTkProgressBar(self.slider_progressbar_frame) # 调整进度条之间的间距,这里设置为0 self.progressbar_2.grid(row=2, column=0, padx=(10,0), pady=(0, 0), sticky="new") self.appearance_mode_optionemenu.set("Dark") self.progressbar_1.configure(mode="indeterminate") # 修正拼写错误:indeterminnate -> indeterminate self.progressbar_1.start() def change_appearance_mode_event(self, new_appearance_mode: str): customtkinter.set_appearance_mode(new_appearance_mode) if __name__ == "__main__": app = App() app.mainloop()
主要修改点:
- 主窗口的
grid_rowconfigure只给row2和row3设置weight=1,row0和row1不设置,避免自动拉伸; - Entry的
pady从(20,20)改为(20,0),移除底部内边距; - 进度条Frame的
pady从(10,0)改为(0,0),移除顶部内边距; - 进度条的
pady改为(0,0),消除进度条之间的间距; - 修正了进度条模式的拼写错误(
indeterminnate改为indeterminate)。
内容的提问来源于stack exchange,提问作者silentmort
相关产品推荐
相关产品推荐

