Tkinter, как размер шрифтов и сохранить выравнивание - PullRequest
0 голосов
/ 10 ноября 2019

Я пишу приложение, которое должно быть масштабируемым. Используя системные шрифты по умолчанию, «TkDefaultFont и TkTextFont», я увеличиваю их размеры и получаю результаты, которые мне нужны. Проблема в том, что после определения размера выравнивание между меткой поля и виджетом поля сбрасывается. Я попытался применить update_idletasks (), но он ничего не делает. Перемещение мыши над виджетом устраняет проблему, как показано на видео. Если вы запустили приведенный ниже пример, перейдите в спинбокс размера и измените размер, чтобы увидеть проблему.

Моя система разработки - Linux, Desktop KDE, я не знаю, является ли это проблемой ОС.

Ссылка на короткое видео об этой проблеме. Видео проблемы выравнивания.

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(99, weight=1)


frame = ttk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)

cbo = ttk.Combobox(frame)
cbo.config(
    values=('Test 1', 'Test 2', 'Test 3')
)
cbo.set(value='Test 1')

ent_var = tk.StringVar()
ent = ttk.Entry(frame, textvariable=ent_var)
ent_var.set('Test')


lb_size = ttk.Label(frame, text='size')
spn = ttk.Spinbox(frame,  values=tuple(range(1, 101)))

font1 = tkfont.nametofont('TkDefaultFont')
font2 = tkfont.nametofont('TkTextFont')

lbl_field_name = tk.Label(frame, text='Field Name')
lbl_field_name.grid()


def size(e):
    cfg = font1.actual()
    cfg['size'] = e.widget.get()
    font1.configure(**cfg)
    font2.configure(**cfg)


spn.bind('<<Increment>>', size)
spn.bind('<<Decrement>>', size)


cbo.grid(row=0, column=1, sticky=tk.NSEW)
ent.grid(row=0, column=2, sticky=tk.NSEW)
lb_size.grid(row=0, column=3, sticky=tk.NSEW)
spn.grid(row=0, column=4, sticky=tk.NSEW)
frame.grid(sticky=tk.NSEW)

root.mainloop()

1 Ответ

1 голос
/ 14 ноября 2019

Единственный способ избежать этой проблемы, который я нашел, - это изменить шрифт для метода каждой записи configure(). Я предполагаю, что более простой способ будет поместить все записи в список, см. Код ниже.

Я также заметил, что size() использует предыдущее значение spinbox, а не значение после увеличения / уменьшения. Чтобы избежать этого, я предлагаю вам использовать опцию command spinbox вместо привязок к <<Increment>> и <<Decrement>> (см. Код ниже).

Наконец, вам не нужно извлекатьЦелые настройки шрифта, чтобы обновить размер, вы можете просто сделать font1.configure(size=<newsize>).

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(99, weight=1)


frame = ttk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)

entries = []  # list of all entries

cbo = ttk.Combobox(frame)
cbo.config(
    values=('Test 1', 'Test 2', 'Test 3')
)
cbo.set(value='Test 1')
entries.append(cbo)

ent_var = tk.StringVar()
ent = ttk.Entry(frame, textvariable=ent_var)
ent_var.set('Test')
entries.append(ent)


def size():
    size = spn.get()  # get current spinbox's value
    font1.configure(size=size)
    font2.configure(size=size)
    for e in entries:  # update font in all entries
        e.configure(font=font2)


lb_size = ttk.Label(frame, text='size')
# use the command option to update the font size
spn = ttk.Spinbox(frame, command=size, values=tuple(range(1, 101)))  

font1 = tkfont.nametofont('TkDefaultFont')
font2 = tkfont.nametofont('TkTextFont')

lbl_field_name = ttk.Label(frame, text='Field Name')
lbl_field_name.grid()

cbo.grid(row=0, column=1, sticky=tk.NSEW)
ent.grid(row=0, column=2, sticky=tk.NSEW)
lb_size.grid(row=0, column=3, sticky=tk.NSEW)
spn.grid(row=0, column=4, sticky=tk.NSEW)
frame.grid(sticky=tk.NSEW)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...