Почему эти стили tkinter не работают? - PullRequest
2 голосов
/ 11 октября 2019

* Чтобы избежать путаницы, я использую macOS Catalina, Python 3.7.4 и Tcl / Tk 8.6.9 *

У меня есть проект, который использует «черный» кактема от ThemedTK в ttkthemes. Я пытаюсь изменить стиль для кнопок.

Однако я не смог понять, как изменить тему, кроме метода 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()

Заранее благодарен за любую помощь.

Вот изображениео том, что я вижу на моем компьютере. Resulting windows

* * РЕДАКТИРОВАТЬ * * Прочитав ответ ниже, я разбил код на два файла, чтобы неесть два основных окна. Это изменило поведение Window2, но стиль по-прежнему не применяется. Затем я создал третье окно, используя только Tk и ttk, но стиль до сих пор не применяется.

Окно 1 (с установленным стилем темы tkthemed и 'black')

# test-ttk-button-style1.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("+0+0")

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

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)

window1.mainloop()

Thisрезультат на моем компьютере: Window 1 result

Окно 2 (tkthemed без набора стилей темы)

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

Результат на моем компьютере: Window 2 result Окно 3 (без всякого тхемеда)

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

Результат на моем компьютере: Window 3 result

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Второе окно использует системный виджет и имеет ограниченные параметры из-за Руководства по интерфейсу пользователя Apple (текст на кнопке не может быть выровнен по левому или правому краю).

Что касается виджета в стиле ttk, это вспомогательная функция tkinter, justify указывает поведение многострочных меток, anchor - это, вероятно, то, что вы хотите переместить однострочной метки в сторону.

anchor = Контролирует, где вНа кнопке должен быть расположен текст (или изображение). Используйте один из N, NE, E, SE, S, SW, W, NW или CENTER. По умолчанию это ЦЕНТР. (якорь / якорь)

justify = Определяет способ выравнивания нескольких строк текста. Используйте ВЛЕВО, ВПРАВО или ЦЕНТР. По умолчанию это ЦЕНТР. (оправдать / оправдать)

Источник: https://effbot.org/tkinterbook/button.htm

1 голос
/ 11 октября 2019

Вы создали два корневых окна (экземпляры tkinter.Tk), установите второе окно на виджет Toplevel:

window2 = tk.Toplevel()
...