CheckboxTreeview() — масштабировать размер флажков, изменять цвета

#python #tkinter #checkbox #treeview

#python #tkinter #флажок #просмотр дерева

Вопрос:

CheckboxTreeview() для Tkinter в Python — замечательный класс. К сожалению, на HDPI-мониторах (например, на моем телевизоре 4K) флажок может быть трудно читаемым:

существующие флажки

Как можно упростить распознавание флажков на мониторах HDPI? Можно ли изменить цвета?

Ответ №1:

CheckboxTreeview () использует стандартные .png изображения размером 19×14 пикселей, которые могут казаться крошечными. Я создал функцию для создания масштабируемых флажков в зависимости от размера шрифта:

новые флажки

Примечание: я удалил выделение фона в старой программе, которая использовалась до обнаружения CheckboxTreeview ()

Код довольно прост, и комментарии включены для удобства использования:

 def make_checkboxes(hgt, outc, fillc, chkc):

    ''' Create CheckboxTreeview(); 'unchecked', 'checked' and 'tristate'
        Parms: height, outline color, fill color, checkmark color

        Returns list of three PhotoImages for parent. How to use 4K screen:

            MON_FONTSIZE = 12
            row_height=int(MON_FONTSIZE*2.2)
            style.configure("Treeview", font=(None, MON_FONTSIZE), 
                            rowheight=row_height)

            self.checkboxes = make_checkboxes(row_height-6, 'black', 
                                              'white', 'deepskyblue')
            self.cd_tree.tag_configure("unchecked", image=self.checkboxes[0])
            self.cd_tree.tag_configure("tristate", image=self.checkboxes[1])
            self.cd_tree.tag_configure("checked", image=self.checkboxes[2])

    '''
    from PIL import Image, ImageTk, ImageDraw       # Pillow image processing

    if hgt % 2 == 1: hgt = hgt   1                  # even number box height
    if hgt < 14: hgt = 14                           # minimum box height
    wid = hgt                                       # square: width = heidht
    wid_pad = int(wid * 10 / 20)                    # lead   trailing padding
    xo = int(wid_pad / 5)                           # x-offset after lead pad
    retn_images = []                                # list of three images

    image = Image.new("RGBA", (wid   wid_pad, hgt), (0, 0, 0, 0))
    draw = ImageDraw.Draw(image)                    # Create drawable image

    draw.rectangle([(xo, 0), (xo   wid, hgt-1)], fill=fillc, outline=outc)
    retn_images.append(ImageTk.PhotoImage(image))   # Unchecked
    draw.rectangle([(xo 3, 7), (xo   wid-3, hgt-8)], fill=chkc)
    retn_images.append(ImageTk.PhotoImage(image))   # Tristate
    draw.rectangle([(xo 3, 3), (xo   hgt-3, hgt-4)], fill=chkc)
    retn_images.append(ImageTk.PhotoImage(image))   # Checked

    return retn_images
  

Комментарии:

1. Хорошо, я немного расширил его, чтобы нарисовать что-то вроде реального значка с галочкой. Но это не вписывается в комментарий, поэтому я разместил его как новый ответ

Ответ №2:

В дополнение к данному ответу: это нарисует фактический «отмеченный» значок вместо прямоугольника. Окончательные размеры должны соответствовать размерам уже заданного ответа.

Это выглядело бы примерно так:

введите описание изображения здесь

РЕДАКТИРОВАТЬ: но вы, конечно, можете использовать любой цвет, который вам нравится

 scalingFactor = 10

imageChecked = Image.new("RGBA", ((wid   wid_pad) *scalingFactor, hgt *10), (0, 0, 0, 0))
drawChecked = ImageDraw.Draw(imageChecked) 
drawChecked.rectangle([(xo*scalingFactor, 0), ((xo   wid)*scalingFactor, (hgt-1)*scalingFactor)], fill=fillc, outline=outc)

startPoint = (xo*scalingFactor int(0.15*wid*scalingFactor), (0.6*hgt*scalingFactor))
middlePoint = (xo*scalingFactor int(0.5*wid*scalingFactor), (int(0.8*hgt*scalingFactor)))
endPoint =(xo*scalingFactor int(0.85*wid*scalingFactor), (int(0.1*hgt*scalingFactor)))

drawChecked.line([startPoint,middlePoint,endPoint], fill=chkc, width=int(hgt*scalingFactor/5), joint="curve")

imageChecked = imageChecked.resize((wid wid_pad, hgt), Image.ANTIALIAS)
  

Комментарии:

1. Неплохо. Но я думаю, что Google будет использовать синий фон с белой меткой.

2. @WinEunuuchs2Unix Конечно, вы можете использовать любую раскраску, какую захотите. Я думаю, это была вся идея вашего оригинального сообщения 🙂