首页 > 解决方案 > 如何动态缩小 wxBitmapButton 的位图以适应?

问题描述

假设我在同一水平上有一个wxBitmapButton和一个文本标签。分配给 的位图对于按钮来说太大(并将其拉伸得更大)。wxButtonwxBoxSizerwxBitmapButton

我有的

我希望缩小位图以使其完全适合按钮,不再拉伸按钮大小,而按钮本身不小于“标准”按钮大小。

我想要的是

我希望这种缩减能够自动且动态地发生。我怎样才能做到这一点?

我正在使用来自快照文件夹的 macOS Catalina 10.15.4、Python 3.8.2 和 wxPython 4.1.0a1 。我有一个普通的 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()

标签: wxwidgetswxpython

解决方案


wxButton不会为您进行图像缩放,您需要自己调整位图的大小。这并不是很困难,因为您可以只使用wxImage::Size()or wxImage::Resize(),但是对于像您使用的那样带有直线的小图像,它可能会给出不理想的结果,这就是为什么通常最好有一些预渲染位图和而是选择其中最合适的。

无论如何,您仍然需要知道要使用的尺寸。它通常应该由wxArtProvider::GetSizeHint()返回,尽管我承认我不确定在 macOS 下使用非默认 DPI 时它是否正常工作(但如果没有,它应该被报告为错误和固定的)。


推荐阅读