ttk.Label通过Style配置文本对齐不生效,如何修复?
ttk.Label通过Style配置文本对齐不生效,如何修复?
你遇到的这个情况其实是tkinter里一个容易踩的小坑——虽然文档明确说justify可以通过样式设置,但直接在Style里配置后没生效,大概率是因为你单独给Label指定了font参数,这会干扰样式里文本对齐属性的应用。
你看,你的代码里把字体question直接写在了ttk.Label的参数里,而没有放到Style中。当tkinter看到Label有单独指定的font时,会优先使用这个font来渲染文本,同时可能忽略样式中设置的justify属性;而像background这种不涉及文本渲染的属性则不受影响,所以才会出现只有对齐不生效的情况。
这里有两种靠谱的修复方法:
方法一:把字体也纳入Style统一配置
这种方法更符合你“减少重复代码”的需求,把所有样式相关的属性(包括字体、对齐、背景)都集中在Style里,Label只需要引用样式即可:
import tkinter as tk from tkinter import ttk from tkinter import font app = tk.Tk() width = 605 height = 200 x = int((app.winfo_screenwidth() / 2) - (width / 2)) y = int((app.winfo_screenheight() / 2) - (height / 2)) app.geometry(f'{width}x{height}+{x}+{y}') app.resizable(width=False, height=False) # 创建字体对象 question_font = font.Font(family='Tahoma', size=14, weight='bold') # 统一在Style里配置所有样式属性 style = ttk.Style() style.configure('question.TLabel', justify=tk.CENTER, background='#ffffff', border=0, font=question_font) # Label仅指定样式和文本,无需单独传font参数 ttk.Label(app, style='question.TLabel', text='When the view in the widget’s window change,\n' 'the widget will generate a Tcl command' '\nbased on the scrollcommand.' ).place(x=90, y=35) app.mainloop()
方法二:保留单独的font参数,同时直接给Label加justify
如果因为某些原因必须单独指定font,那可以把justify也直接写在Label的参数里——这也是你已经发现的可行方案,只是没办法完全通过Style统一管理:
# 样式里保留其他属性,去掉justify ttk.Style().configure('question.TLabel', background='#ffffff', border=0) question = font.Font(family='Tahoma', size=14, weight='bold') # Label里同时指定font和justify ttk.Label(app, style='question.TLabel', text='When the view in the widget’s window change,\n' 'the widget will generate a Tcl command' '\nbased on the scrollcommand.', font=question, justify=tk.CENTER).place(x=90, y=35)
另外补充一点:如果你用place布局,最好确保Label的宽度足够容纳居中对齐的文本(比如可以给Label指定width参数,或者在Style里设置wraplength),否则如果Label宽度刚好和最长文本行一样,居中对齐的效果也看不出来。
备注:内容来源于stack exchange,提问作者KLYSTRON
相关产品推荐
相关产品推荐

