как сохранить тему tkinter при открытии верхнего уровня с другой темой

Swift

// corner radius
blueView.layer.cornerRadius = 10

// border
blueView.layer.borderWidth = 1.0
blueView.layer.borderColor = UIColor.black.cgColor

// shadow
blueView.layer.shadowColor = UIColor.black.cgColor
blueView.layer.shadowOffset = CGSize(width: 3, height: 3)
blueView.layer.shadowOpacity = 0.7
blueView.layer.shadowRadius = 4.0

Изучение параметров

Проблема 1: Тень усекается

Что делать, если есть подслои или подпункты (например, изображение), содержимое которых мы хотим скопировать в рамки нашего представления?

Мы можем выполнить это с помощью

blueView.layer.masksToBounds = true

(альтернативно blueView.clipsToBounds = true дает тот же результат .)

Но, oh no! Тень также была обрезана, потому что она находится за пределами границ! Что делать? Что делать?

Решение

Используйте отдельные виды для тени и границы. Основной вид прозрачен и имеет тень.

// add the shadow to the base view
baseView.backgroundColor = UIColor.clear
baseView.layer.shadowColor = UIColor.black.cgColor
baseView.layer.shadowOffset = CGSize(width: 3, height: 3)
baseView.layer.shadowOpacity = 0.7
baseView.layer.shadowRadius = 4.0

// add the border to subview
let borderView = UIView()
borderView.frame = baseView.bounds
borderView.layer.cornerRadius = 10
borderView.layer.borderColor = UIColor.black.cgColor
borderView.layer.borderWidth = 1.0
borderView.layer.masksToBounds = true
baseView.addSubview(borderView)

// add any other subcontent that you want clipped
let otherSubContent = UIImageView()
otherSubContent.image = UIImage(named: "lion")
otherSubContent.frame = borderView.bounds
borderView.addSubview(otherSubContent)

Это дает следующий результат:

] Задача 2: Плохая производительность

Добавление закругленных углов и теней может стать хитом производительности. Вы можете повысить производительность, используя предопределенный путь для тени, а также указав, что он растеризован. Следующий код можно добавить к приведенному выше примеру.

baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath
baseView.layer.shouldRasterize = true
baseView.layer.rasterizationScale = UIScreen.main.scale

Подробнее см. в этом сообщении . Здесь здесь и здесь .

Этот ответ был протестирован с помощью Swift 4 и Xcode 9.

0
задан stovfl 17 January 2019 в 15:32
поделиться

1 ответ

Прямо сейчас вы пытаетесь создать стиль при каждом нажатии кнопки, и это является причиной проблемы.

Вместо этого просто переместите создание темы в глобальное пространство имен, где его можно создать один раз, и это больше не будет проблемой.

import tkinter as tk
import tkinter.ttk as ttk


def test2():
    rt1 = tk.Toplevel()
    rt1.geometry("500x500")
    notebook = ttk.Notebook(rt1)
    f1 = tk.Frame(notebook, width=200, height=200)
    f2 = tk.Frame(notebook, width=200, height=200)
    notebook.add(f1, text="tab 1")
    notebook.add(f2, text="tab 2")
    notebook.grid(row=0, column=0, sticky="nw")

root = tk.Tk()
root.geometry("500x500")
tree = ttk.Treeview(root, column=("col1", "col2"))
tree.insert("", tk.END, values=("deee", "fjfj","fjjf", "jfjfjf"))
tree.pack()

s = ttk.Style()
s.theme_create("MyStyle", parent="alt", settings={
"TNotebook": {"configure": {"tabmargins": [2, 5, 2, 0]}},
"TNotebook.Tab": {"configure": {"padding": [50, 8] }}})
s.theme_use("MyStyle")

b3 = tk.Button(root, text="new", command=test2)
b3.place(x=200, y=200)
root.mainloop()
0
ответ дан Mike - SMT 17 January 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: