Python 3+ Tkinter中心标签文本

时间:2018-01-17 17:08:01

标签: python-3.x tkinter label

这是Windows操作系统上Python 3+的tkinter问题。所以我知道如何将标签文本(justify=CENTER)置于中心位置,而且我知道所有我搜索过的标签文本默认都是合理的中心。

有人可以查看下面的代码,请告诉我我做错了什么。我已经在网上搜索了几个小时,我无法看到我做错了什么。

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",但我想在这里,所以标签小部件随窗口调整大小,所以我被卡住了。

3 个答案:

答案 0 :(得分:4)

问题是您正在阅读tkinter标签的文档,但您使用的是ttk标签。这就是为什么你不应该使用通配符导入 - 当两个模块导出具有相同名称的对象(例如:tkinter.Labelttk.Label)时,很难知道代码中使用了哪一个。 ttk标签的默认值是左对齐,但tkinter标签是对齐的中心,导入的顺序意味着您使用的是ttk标签。

您示例的快速修复是明确设置ttk标签的anchor选项(例如:label.configure(anchor="center"))。

您还应修复导入,以免再次发生此问题。您应该明确地将模块作为一个单元导入,而不是进行通配符导入(例如:from tkinter import *),可选地使用较短的名称。完成后,您需要在小部件前添加模块名称。

例如,给出这些导入语句:

import tkinter as tk
from tkinter import ttk

...然后,您将使用ttk.Label(...)创建ttk标签,并使用tk.Label(...)创建tkinter标签,这样可以更轻松地理解代码,并消除所有歧义。

答案 1 :(得分:2)

这是命名空间群集的教科书示例。您正在使用以下行来聚类python的命名空间:

from tkinter import *
from tkinter.ttk import *

这意味着,如果某个tkinter.ttk类的名称与tkinter类的名称相同,则会使用ttkButtonLabel {1}}。显然ttk不一定有tkinter.Label justify选项。一个简单的头寸交换足以证明差异将进口交换到:

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()

答案 2 :(得分: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)即可。