Как я могу динамически уменьшить растровое изображение wxBitmapButton, чтобы соответствовать? - PullRequest
0 голосов
/ 03 апреля 2020

Допустим, у меня есть wxBitmapButton и текстовая метка wxButton в той же горизонтали wxBoxSizer. Растровое изображение, присвоенное wxBitmapButton, слишком велико для кнопки (и растягивает ее больше).

What I have

Я хочу, чтобы растровое изображение было уменьшено, чтобы оно точно соответствовало кнопке больше не растягивает размер кнопки, в то время как сама кнопка не меньше стандартного размера кнопки.

What I want

Я хочу, чтобы это уменьшение происходило автоматически и динамически. Как я могу выполнить sh это?

Я использую macOS Catalina 10.15.4, Python 3.8.2 и wx Python 4.1.0a1 из папки snapshots . У меня обычный монитор DPI (хотя я бы хотел, чтобы мой код выполнялся как на мониторах с высоким DPI, так и на обычных мониторах).


Минимальный пример:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from base64 import b64decode  
from wx import *


class TestFrame(Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self._sizer = BoxSizer(HORIZONTAL)


        button1 = BitmapButton(self)  # I want button1 to be the same size as the other buttons in the sizer, and for the bitmap to downscale to fit

        data = b64decode(''.join([  # 64x64 px PNG
            'iVBORw0KGgoAAAANSUhEUgAAAEAAAABA',
            'CAMAAACdt4HsAAAANlBMVEUAAAAAAAAA',
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3',
            'dmhyAAAAEXRSTlMArNkZmwdF04UT9+zS',
            'pndhKrYPNwAAAABsSURBVFjD7ZZJCoAw',
            'EAQ1Olnc5/+fVfAaJFAHCXTdqyCZSw9C',
            '9IDFaMQvyT1NIJD9IYDC7rBwOi3MKqig',
            'wh+FksdvwltYr7pvmzeyWDUQvZkDB/AT',
            '6CfSM8qXLx/4cOLQkUVnHh2aeOoK0QE3',
            'Edkb36fiI5sAAAAASUVORK5CYII='
        ]))

        bmp = Bitmap.NewFromPNGData(data, len(data))
        button1.SetBitmap(bmp)

        # If uncommented, this bit of code will simulate the effect I want
        # img = bmp.ConvertToImage()
        # scaled = img.Scale(17, 17, IMAGE_QUALITY_HIGH)
        # button1.SetBitmap(scaled.ConvertToBitmap())


        button2 = Button(self, label='MyButton')
        button3 = Button(self, label='MyButton')
        button4 = Button(self, label='MyButton')


        self._sizer.Add(button1, 0, ALL, 5)
        self._sizer.Add(button2, 0, ALL, 5)
        self._sizer.Add(button3, 0, ALL, 5)
        self._sizer.Add(button4, 0, ALL, 5)


        self.SetSizer(self._sizer)


def main():
    app = App()

    frm = TestFrame(None)

    frm.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 03 апреля 2020

wxButton не будет выполнять масштабирование изображения для вас, вам нужно изменить размер растрового изображения самостоятельно. Это не очень сложно, так как вы можете просто использовать wxImage::Size() или wxImage::Resize() для этого, но это может дать неидеальные результаты для небольших изображений с прямыми линиями, как те, которые вы используете, поэтому обычно лучше иметь несколько предварительно обработанных растровых изображений и выберите вместо них наиболее подходящее.

В любом случае вам все равно нужно знать размер для использования. Обычно он должен возвращаться wxArtProvider :: GetSizeHint () , хотя я признаю, что не уверен, правильно ли он работает при использовании DPI по умолчанию не в MacOS (но если нет, то быть зарегистрировано как ошибка и исправлено).

...