这是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"
,但我想在这里,所以标签小部件随窗口调整大小,所以我被卡住了。
答案 0 :(得分:4)
问题是您正在阅读tkinter标签的文档,但您使用的是ttk标签。这就是为什么你不应该使用通配符导入 - 当两个模块导出具有相同名称的对象(例如:tkinter.Label
和ttk.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
类的名称相同,则会使用ttk
,Button
和Label
{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)即可。