这是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"
,但我想在这里,所以标签小部件调整窗口大小,所以我卡住了。
问题是您正在阅读tkinter标签的文档,但您使用的是ttk标签。这就是为什么你不应该使用通配符导入 - 当两个模块导出具有相同名称的对象(例如:tkinter.Label
和ttk.Label
)时,很难知道代码中使用了哪一个。 ttk标签的默认值是左对齐,但tkinter标签是对齐的中心,导入的顺序意味着您正在使用ttk标签。
您的示例的快速修复是明确设置ttk标签的anchor
选项(例如:label.configure(anchor="center")
)。
您还应该修复导入,以便再次发生此问题。您应该明确地将模块作为一个单元导入,而不是进行通配符导入(例如:from tkinter import *
),可选地使用较短的名称。完成后,您需要在小部件前添加模块名称。
例如,给出这些import语句:
import tkinter as tk
from tkinter import ttk
...然后,您将使用ttk.Label(...)
创建一个ttk标签,并使用tk.Label(...)
创建一个tkinter标签,这使您的代码更容易理解,并消除所有歧义。
这是命名空间聚类的教科书示例。你正在使用以下行来聚类python的命名空间:
from tkinter import *
from tkinter.ttk import *
这意味着如果有一个与tkinter.ttk
类同名的tkinter
类,将使用ttk
,例如Button
和Label
。显然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()
第一种方式:
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)。