TKinter GUI中部出现灰色覆盖层问题求助(类实现场景)
TKinter类实现GUI出现灰色覆盖行的问题排查
我首次尝试用类实现TKinter GUI,发现界面中部出现一条灰色覆盖行,能在它后方输入内容,但该元素影响观感。使用非类写法编写代码时无此问题,求问该问题的成因?
相关代码
class LabelInput(tk.Frame): def __init__(self, parent, label, var, input_class=ttk.Entry,input_args=None, label_args=None, **kwargs): super().__init__(parent, **kwargs) input_args = input_args or {} label_args = label_args or {} self.variable = var self.variable.label_widget = self if input_class in (ttk.Checkbutton, ttk.Button): input_args["text"] = label else: self.label = ttk.Label(self, text=label, **label_args) self.label.grid(row=0, column=0, sticky=(tk.W + tk.E)) if input_class in (ttk.Checkbutton, ttk.Button, ttk.Radiobutton): input_args["variable"] = self.variable else: input_args["textvariable"] = self.variable if input_class == ttk.Radiobutton: self.input = tk.Frame(self) for v in input_args.pop('values', []): button = ttk.Radiobutton(self.input, value=v, text=v, **input_args) button.pack(side=tk.LEFT, ipadx=10, ipady=2, expand=True, fill='x') else: self.input = input_class(self, **input_args) self.input.grid(row=1, column=0, sticky=(tk.W+tk.E)) self.columnconfigure(0, weight=1) def grid(self, sticky=(tk.E + tk.W), **kwargs): super().grid(sticky=sticky, **kwargs)
问题截图

问题成因及解决方法
问题根源在你重写的grid方法:你给LabelInput(继承自tk.Frame)的grid方法设置了默认sticky=(tk.E + tk.W),这会让该Frame实例在父容器中横向拉伸填满整个宽度。而LabelInput内部的标签和输入框仅占据自身所需空间,Frame的灰色背景就会暴露出来,形成那条影响观感的灰色行。非类写法中你大概率没给容器设置这种强制拉伸的sticky属性,所以没有出现该问题。
解决方式任选其一:
- 删除重写的
grid方法:让父容器在布局LabelInput实例时,根据需求手动指定sticky参数,避免Frame过度拉伸; - 调整默认sticky值:把
grid方法的默认sticky改为tk.W,限制Frame仅向左对齐,不横向填满父容器; - 统一背景色:给
LabelInput设置和父容器一致的背景色,隐藏灰色背景。
示例修改(调整默认sticky):
def grid(self, sticky=(tk.W), **kwargs): super().grid(sticky=sticky, **kwargs)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

