如何动态缩小 wxBitmapButton 的位图以适应?
How can I dynamically downscale the bitmap of a wxBitmapButton to fit?
假设我在同一水平 wxBoxSizer
中有一个 wxBitmapButton
和一个文本标签 wxButton
。分配给 wxBitmapButton
的位图对于按钮而言太大(并将其拉伸得更大)。
我希望缩小位图以使其完全适合按钮,不再拉伸按钮尺寸,同时按钮本身不小于 "standard" 按钮尺寸。
我希望这种缩小能够自动且动态地发生。我怎样才能做到这一点?
我正在使用来自 snapshots folder 的 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()
wxButton
不会为您做图像缩放,您需要自己调整位图的大小。这并不是非常困难,因为您可以为此使用 wxImage::Size()
或 wxImage::Resize()
,但是对于像您使用的那样带有直线的小图像,它可能会给出不理想的结果,这就是为什么它通常最好有一些预渲染的位图,然后从中选择最合适的。
无论如何,你还是需要知道尺寸才能使用。它通常应该由 wxArtProvider::GetSizeHint() 返回,虽然我承认我不确定在 macOS 下使用非默认 DPI 时它是否正常工作(但如果没有,它应该报告为错误并修复).
假设我在同一水平 wxBoxSizer
中有一个 wxBitmapButton
和一个文本标签 wxButton
。分配给 wxBitmapButton
的位图对于按钮而言太大(并将其拉伸得更大)。
我希望缩小位图以使其完全适合按钮,不再拉伸按钮尺寸,同时按钮本身不小于 "standard" 按钮尺寸。
我希望这种缩小能够自动且动态地发生。我怎样才能做到这一点?
我正在使用来自 snapshots folder 的 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()
wxButton
不会为您做图像缩放,您需要自己调整位图的大小。这并不是非常困难,因为您可以为此使用 wxImage::Size()
或 wxImage::Resize()
,但是对于像您使用的那样带有直线的小图像,它可能会给出不理想的结果,这就是为什么它通常最好有一些预渲染的位图,然后从中选择最合适的。
无论如何,你还是需要知道尺寸才能使用。它通常应该由 wxArtProvider::GetSizeHint() 返回,虽然我承认我不确定在 macOS 下使用非默认 DPI 时它是否正常工作(但如果没有,它应该报告为错误并修复).