Python 3+ Tkinter 居中标签文本

6

这是一个关于使用Python 3+在Windows操作系统中使用tkinter的问题。我知道如何居中Label文本(justify=CENTER),而且根据我搜索到的所有内容,Label文本默认为居中对齐。

可以有人查看我的下面的代码并告诉我我做错了什么吗?我已经在网上搜索了几个小时,但就是找不出我哪里做错了。

from tkinter import *
from tkinter.ttk import *


class MainApplication():

    def __init__(self, master):
        self.master = master
        self.master.title("OOP GUI Example")
        self.master.iconbitmap("Blank.ico")


        label = Label(self.master, text="Test Callback", )
        greet_button = Button(self.master, width=25, text="Greet", command=self.greet)
        close_button = Button(self.master, width=25, text="Close", command=self.close)

        Grid.columnconfigure(self.master, 0, weight=1)
        Grid.rowconfigure(self.master, (0,1,2), weight=1)

        label.grid(row=0, column=0, sticky="NSWE",padx=(10, 10), pady=(7.5, 0))
        greet_button.grid(row=1, column=0, sticky="NSWE", padx=(10, 10), pady=(10, 1.5))
        close_button.grid(row=2, column=0, sticky="NSWE", padx=(10, 10), pady=(1.5, 10))


    def greet(self):
        print("Greetings!")
        return


    def close(self):
        self.master.quit()
        return


root = Tk()
root.style = Style()
#  ('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
root.style.theme_use("clam")
gui = MainApplication(root)
root.mainloop()

这里的label.grid(row=0, column=0, sticky="NSWE",padx=(10, 10), pady=(7.5, 0))语句是使文本左对齐。特别是其中的sticky="NSWE",但我想让标签小部件随窗口大小调整,所以我无法更改。


似乎当使用.pack(fill='x', ...).grid(sticky='ew', ...)水平拉伸ttk.Label时,它并没有居中对齐。 - Nae
4个回答

17
问题在于您正在阅读 tkinter 标签的文档,但是您正在使用 ttk 标签。这就是为什么不应该使用通配符导入 - 当两个模块导出具有相同名称的对象时(例如:tkinter.Label 和 ttk.Label),很难知道代码中正在使用哪一个。ttk 标签的默认对齐方式为左对齐,但 tkinter 标签为居中对齐,并且您导入模块的顺序意味着您正在使用 ttk Label。
您的示例的快速解决方法是明确设置ttk标签的 anchor 选项(例如:label.configure(anchor="center"))。
您还应该修复您的导入问题,以便这种问题不再发生。而不是使用通配符导入(例如:from tkinter import *),您应该显式地将模块作为一个单元导入,可以选择一个更短的名称。一旦这样做,您需要在小部件前缀中添加模块的名称。
例如,给出以下导入语句:
import tkinter as tk
from tkinter import ttk

...然后您将使用ttk.Label(...)创建一个ttk标签,使用tk.Label(...)创建一个tkinter标签,这使得您的代码更易于理解,并消除了所有的歧义。


或者你可以将ttk导入为import tkinter.ttk as ttk - howdoicode

4
这是一个命名空间聚类的经典例子。您正在使用以下代码行对Python的命名空间进行聚类:
from tkinter import *
from tkinter.ttk import *

这意味着如果存在与 tkinter 类同名的 tkinter.ttk 类,将使用 ttk 类,例如 ButtonLabel。显然,ttk 并不一定具有 tkinter.Labeljustify 选项。只需简单地交换导入即可演示差异,例如:
from tkinter.ttk import *
from tkinter import *

尝试一下并查看结果。


下面是一个示例,其中文本居中对齐,没有聚集的名称空间,使用 tkinter.Label 作为 label

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

label = tk.Label(root, text="Test Callback")
btn = tk.Button(root, text="Text so long that root has to resize.")
btn.pack()
label.pack(fill='both', expand=True)

root.mainloop()

请看下面的示例居中对齐文本,其中未聚合任何命名空间,使用tkinter.ttk.Label作为label
import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

label = ttk.Label(root, text="Test Callback")
btn = tk.Button(root, text="Text so long that root has to resize.")
btn.pack()
label.pack(expand=True)

root.mainloop()

哦,我有点明白你的意思了,但我还没有完全理解。你能否详细说明一下为什么 tk.Label 不起作用,而 tkk.Label 却起作用呢?为什么 tk.Button 和其他所有东西都能正常工作呢? - probat
@jmm5351,我不明白,这难道不让你的问题变成了一个简单的“如何调整ttk.Label的文本格式”吗?如果您想使用蛤蜊主题,请使用部件的ttk版本;如果不使用,则使用常规版本。如果需要,您可以在最后一个示例中使用蛤蜊主题标签。 - Nae
这是否与导入语句中使用 * 并且我正在导入所有内容,解释器不知道选择哪个有关? - probat
我认为这可能与Grid有关,因为它是一个tkinter类,而不是tkinter.tkk类。 - probat
@jmm5351 或许在标签的 pack 中添加 fill='both' 时,可以得到与上面最后一个示例类似的结果。 - Nae
显示剩余3条评论

0

第一种方法:

from tkinter import *
import tkinter.ttk as ttk

第二种方法:

from tkinter import *
from tkinter import ttk

使用这两种方式,第一行导入了tk小部件,第二行导入了ttk小部件。第一种方式更清晰,但大多数教程使用第二种方式。

例如:

root = Tk()

button_1 = ttk.Button(root, text='Button 1').pack(padx=20, pady=10)
button_2 = Button(root, text='Button 2').pack(padx=20, pady=10)

root.mainloop()

如果你想使用 tkinter.ttk 中的 Button 控件,你需要写成 ttk.Button(例如 button_1)。 如果你想使用 tkinter 中的 Button 控件(旧版本),只需调用 Button(例如 button_2)。


-1
label=Label(root,text="Type your text here...",font="arial 13 bold")
label.place(x=70,y=60,anchor="center")

4
您的回答可以通过添加更多支持性信息来改进。请编辑以添加更多细节,例如引用或文献,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接