Python 为什么不';这些tkinter样式不起作用吗?

Python 为什么不';这些tkinter样式不起作用吗?,python,tkinter,tkinter-macos,Python,Tkinter,Tkinter Macos,*为了消除任何混淆,我使用macOS Catalina、Python 3.7.4和Tcl/Tk 8.6.9* 我有一个在TTK主题中使用“黑色”作为主题的项目。我正在尝试修改按钮的样式 但是,除了set_theme_advanced()方法之外,我还没有弄清楚如何修改主题,该方法只会更改我正在阅读的内容的颜色。我想将按钮文本更改为在主题内居中。但是,在对此进行故障排除的过程中,我发现我无法在下面的示例代码中修改按钮文本在任一窗口中的位置(对齐) 如果查看此示例代码,您将看到在第一个窗口中,文本在

*为了消除任何混淆,我使用macOS Catalina、Python 3.7.4和Tcl/Tk 8.6.9*

我有一个在TTK主题中使用“黑色”作为主题的项目。我正在尝试修改按钮的样式

但是,除了set_theme_advanced()方法之外,我还没有弄清楚如何修改主题,该方法只会更改我正在阅读的内容的颜色。我想将按钮文本更改为在主题内居中。但是,在对此进行故障排除的过程中,我发现我无法在下面的示例代码中修改按钮文本在任一窗口中的位置(对齐)

如果查看此示例代码,您将看到在第一个窗口中,文本在按钮上左对齐,但颜色正确,但在第二个窗口中(使用Tk),文本在所有按钮上居中对齐,而不着色。两个窗口都没有响应对齐样式,Tk窗口似乎没有响应任何自定义样式

# test-ttk-button-style.py

import tkinter as tk
from tkinter import ttk, NSEW
from ttkthemes import themed_tk as tkt

window1 = tkt.ThemedTk()
window1.get_themes()
window1.set_theme("black")
window1.title("First Window")
window1.geometry("+20+70")

window2 = tk.Tk()
window2.title("Second Window")
window2.geometry("+400+70")

ttkStyle = ttk.Style()
ttkStyle.configure("left.TButton", justify="left", background="green", foreground="white", font="Helvetica 12 bold")
ttkStyle.configure("right.TButton", justify="right", background="blue", foreground="white", font="Helvetica 12 bold")
ttkStyle.configure("center.TButton", justify="center", background="red", foreground="white", font="Helvetica 12 bold")

w1content = ttk.Frame(window1, padding=(12,12,12,12))
w1content.grid(row=0, column=0, sticky=NSEW)
w1btn1 = tkt.ttk.Button(w1content, text="First Button in Window 1", style="left.TButton")
w1btn1.grid(row=0, column=0, padx=30, pady=30)
w1btn2 = tkt.ttk.Button(w1content, text="Second Button in Window 1", width=25, style="right.TButton")
w1btn2.grid(row=1, column=0, padx=30, pady=30)
w1btn3 = tkt.ttk.Button(w1content, text="Third Button in Window 1", width=25, style="center.TButton")
w1btn3.grid(row=2, column=0, padx=30, pady=30)
w1btn4 = tkt.ttk.Button(w1content, text="Fourth Button in Window 1", width=25)
w1btn4.grid(row=3, column=0, padx=30, pady=30)

w2content = ttk.Frame(window2, padding=(12,12,12,12))
w2content.grid(row=0, column=0, sticky=NSEW)
w2btn1 = tkt.ttk.Button(w2content, text="First Button in Window 2", style="left.TButton")
w2btn1.grid(row=0, column=0, padx=30, pady=30)
w2btn2 = tkt.ttk.Button(w2content, text="Second Button in Window 2", width=25, style="right.TButton")
w2btn2.grid(row=1, column=0, padx=30, pady=30)
w2btn3 = tkt.ttk.Button(w2content, text="Third Button in Window 2", width=25, style="center.TButton")
w2btn3.grid(row=2, column=0, padx=30, pady=30)
w2btn4 = tkt.ttk.Button(w2content, text="Fourth Button in Window 2", width=25)
w2btn4.grid(row=3, column=0, padx=30, pady=30)

window1.mainloop()
提前感谢您的帮助

这是一张我在电脑上看到的照片。

**编辑** 在阅读了下面的答案后,我将代码分解为两个文件,这样就不会有两个主窗口。这确实改变了Window2的行为方式,但仍然没有应用样式。然后,我仅使用Tk和ttk创建了第三个窗口,但仍然没有应用该样式

窗口1(带有主题主题和“黑色”主题样式集)

这是我计算机上的结果:

窗口2(主题化,无主题样式集)

在我的计算机上显示的结果: 窗口3(不带任何标签)

在我的计算机上的结果:

您已经创建了两个根窗口(tkinter.Tk的实例),将第二个窗口设置为
顶级
小部件:

window2 = tk.Toplevel()

第二个窗口使用system widget,并且由于苹果的人机界面指南(按钮上的文本不能左对齐或右对齐),其选项受到限制

关于ttk风格的小部件,这是tkinter的一个子功能,
justify
指定多行标签的行为,
anchor
可能是您想要将一行标签移到一侧的内容

锚定= 控制文本(或图像)在按钮中的位置。使用N、NE、E、SE、S、SW、W、NW或CENTER中的一个。默认值为中间值。(锚/锚)

证明= 定义如何对齐多行文本。使用LEFT、RIGHT或CENTER。默认值为中间值。(证明/证明)


来源:

在windows2中,如果您没有使用ThemedTk(),可以使用
ttkStyle.theme\u使用('alt')
以显示结果

看起来是这样的

ttkStyle=ttk.Style()
ttkStyle.theme\u使用('alt')

参考资料:

除了制作两个带有“黑色”主题的窗口外,这没有什么区别。除了颜色,现在还没有任何样式。好吧,我回去把它们分成两个独立的文件。我将更新上面的示例代码。样式仍然没有按我希望的方式工作。我注意到一件奇怪的事情,如果我在window1样式中将'justify='更改为'anchor=',文本就会在按钮上居中,除了第四个按钮。将另外两个窗口上的“justify=”更改为“anchor=”并不会改变任何东西。是的,一旦我将“justify=”更改为“anchor=”并从tkinter添加到E,W,CENTER中,它对主题按钮(窗口1)起作用。现在我需要弄清楚为什么它在非主题的TK按钮上不起作用。但是,这解决了我的基本问题。非常感谢。我回答的第一句话可能会给你一个提示。是的,我是在评论之后得到的。谢谢现在,我要去看看当按钮是图像时,如何根据其状态(正常、禁用、活动、单击/按下)设置按钮样式。:)
# test-ttk-button-style2.py

import tkinter as tk
from tkinter import ttk, NSEW
from ttkthemes import themed_tk as tkt

window2 = tk.Tk()
window2.title("Second Window")

ttkStyle = ttk.Style()
ttkStyle.configure("left.TButton", justify="left", background="green", foreground="white", font="Helvetica 12 bold")
ttkStyle.configure("right.TButton", justify="right", background="blue", foreground="white", font="Helvetica 20 bold")
ttkStyle.configure("center.TButton", justify="center", background="red", foreground="white", font="Helvetica 32 bold")

w2content = ttk.Frame(window2, padding=(12,12,12,12))
w2content.grid(row=0, column=0, sticky=NSEW)
w2btn1 = tkt.ttk.Button(w2content, text="First Button in Window 2", style="left.TButton")
w2btn1.grid(row=0, column=0, padx=30, pady=30)
w2btn2 = tkt.ttk.Button(w2content, text="Second Button in Window 2", width=25, style="right.TButton")
w2btn2.grid(row=1, column=0, padx=30, pady=30)
w2btn3 = tkt.ttk.Button(w2content, text="Third Button in Window 2", width=25, style="center.TButton")
w2btn3.grid(row=2, column=0, padx=30, pady=30)
w2btn4 = tkt.ttk.Button(w2content, text="Fourth Button in Window 2", width=25)
w2btn4.grid(row=3, column=0, padx=30, pady=30)

window2.mainloop()
#test-ttk-button-style3.py

import tkinter as tk
from tkinter import ttk, NSEW

window3 = tk.Tk()
window3.title("Third Window")

ttkStyle = ttk.Style()
ttkStyle.configure("left.TButton", justify="left", background="green", foreground="white", font="Helvetica 12 bold")
ttkStyle.configure("right.TButton", justify="right", background="blue", foreground="white", font="Helvetica 20 bold")
ttkStyle.configure("center.TButton", justify="center", background="red", foreground="white", font="Helvetica 32 bold")

w3content = ttk.Frame(window3, padding=(12,12,12,12))
w3content.grid(row=0, column=0, sticky=NSEW)
w3btn1 = ttk.Button(w3content, text="First Button in Window 3", style="left.TButton")
w3btn1.grid(row=0, column=0, padx=30, pady=30)
w3btn2 = ttk.Button(w3content, text="Second Button in Window 3", width=25, style="right.TButton")
w3btn2.grid(row=1, column=0, padx=30, pady=30)
w3btn3 = ttk.Button(w3content, text="Third Button in Window 3", width=25, style="center.TButton")
w3btn3.grid(row=2, column=0, padx=30, pady=30)
w3btn4 = ttk.Button(w3content, text="Fourth Button in Window 3", width=25)
w3btn4.grid(row=3, column=0, padx=30, pady=30)

window3.mainloop()
window2 = tk.Toplevel()