gpt4 book ai didi

python - wxPython框架上的背景图像

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:47 24 4
gpt4 key购买 nike

MMGP 已回答,但不会让我认为他是对的 ;-) 所以我至少会在这里提及他。(我终于相信他了……8-)

His linked discussion在双缓冲上提供了一个基本代码,可以进行以下修改:

从第 106 行开始插入(覆盖现有代码,直到到达此处显示的最后一行):

    # Here's the actual drawing code.
cliWidth, cliHeight = self.GetClientSize()
bmp=wx.Bitmap("Logo16x9.png")
bmpWide = bmp.GetWidth()
bmpHeight = bmp.GetHeight()
img = bmp.ConvertToImage()
scaleFactor = cliWidth/bmpWide
bmp = wx.BitmapFromImage(img.Scale(int(bmpWide * scaleFactor), int(bmpHeight * scaleFactor)))
bmpWide = bmp.GetWidth()
bmpHeight = bmp.GetHeight()
xPos = (cliWidth - (bmpWide))/2
yPos = (cliHeight - (bmpHeight))/2
# altered by me
dc.DrawBitmap(bmp, xPos, yPos)


class TestFrame(wx.Frame):

我一整天都在为此苦苦思索。

我是使用 wxPython 模块绘制图形的新手,当我需要在框架上绘制背景图像时,我找到了 this code如果图像是窗口的完整大小,则效果很好。

但是,我需要将公司 Logo 作为背景,并通过调整大小使其保持居中。在当前形式中,调整大小会导致一个小国家大小的图形伪像随任何调整大小事件出现在屏幕上。

Logo 图片文件(在代码的第 43 行使用)是一张 400x300 (WxH) 的图片。

我正在寻找一种方法:动态调整图像大小以匹配 wx.GetClientSize(),或避免/移除工件的方法。最好不涉及 PIL 或 ImageMagick。应用程序必须仅在本地级别运行,并且与系统无关(Win、Lin 和 Mac),所有这些都不涉及网络事件或映射的驱动器。

Python 2.7 和 wxPython 2.8

我正在使用的代码(带有我的修改注释)如下:

import wx

########################################################################
class MainPanel(wx.Panel):
""""""

#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.frame = parent

sizer = wx.BoxSizer(wx.VERTICAL)
hSizer = wx.BoxSizer(wx.HORIZONTAL)

for num in range(4):
label = "Button %s" % num
btn = wx.Button(self, label=label)
sizer.Add(btn, 0, wx.ALL, 5)
hSizer.Add((1,1), 1, wx.EXPAND)
hSizer.Add(sizer, 0, wx.TOP, 100)
hSizer.Add((1,1), 0, wx.ALL, 75)
self.SetSizer(hSizer)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

#----------------------------------------------------------------------
def OnEraseBackground(self, evt):
"""
Add a picture to the background
"""
# yanked from ColourDB.py
dc = evt.GetDC()
# Added by me
cliWidth, cliHeight = self.GetClientSize()

if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
# use a 400x300 image
bmp = wx.Bitmap("Logo4x3.png")
# added by me
xPos = (cliWidth - 400)/2
yPos = (cliHeight - 300)/2
# altered by me
dc.DrawBitmap(bmp, xPos, yPos)
#dc.DrawBitmap(bmp, 0, 0)

########################################################################
class MainFrame(wx.Frame):
""""""

#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, size=(600,450))
panel = MainPanel(self)
self.Center()

########################################################################
class Main(wx.App):
""""""

#----------------------------------------------------------------------
def __init__(self, redirect=False, filename=None):
"""Constructor"""
wx.App.__init__(self, redirect, filename)
dlg = MainFrame()
dlg.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
app = Main()
app.MainLoop()

更新:最新失败 - 修改第 37 至 52 行

if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
# use a 400x300 image
bmp = wx.Bitmap("Logo4x3.png")
img = bmp.ConvertToImage()
scaleFactor = cliWidth/400
bmp = wx.BitmapFromImage(img.Scale(int(400*scaleFactor),int(300*scaleFactor)))
# added by me
#xPos = (cliWidth - 400)/2
#yPos = (cliHeight - 300)/2
# altered by me
#dc.DrawBitmap(bmp, xPos, yPos)
dc.DrawBitmap(bmp, 0, 0)

又一次尝试,又一次失败。屏幕输出没有区别。此外,有关双缓冲的引用文档并未解决此问题,但确实会遇到相同的结果。此代码修改了原始代码的第 36 行到第 57 行。

brsh = wx.Brush('#000000')


if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.SetBackground(brsh)
dc.SetDeviceOrigin(0,0)
dc.DestroyClippingRegion()
dc.Clear()
# use a 400x300 image
bmp = wx.Bitmap("Logo4x3.png")
img = bmp.ConvertToImage()
scaleFactor = cliWidth/400
bmp = wx.BitmapFromImage(img.Scale(int(400*scaleFactor),int(300*scaleFactor)))
# added by me
#xPos = (cliWidth - 400)/2
#yPos = (cliHeight - 300)/2
# altered by me
#dc.DrawBitmap(bmp, xPos, yPos)
dc.DrawBitmap(bmp, 0, 0)

最佳答案

根据我建议使用双缓冲绘图的评论,但我在编辑后的帖子中没有看到。此外,在使用 self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 时,我遇到了几个绘图问题。但是这条线可能对我以外的其他系统有帮助,所以我想保留它。因此,为了处理这种情况,这里有一个更新的代码,它使用双缓冲绘图并且在这里工作正常:

import wx

class MainPanel(wx.Panel):
def __init__(self, parent, bg_img='Logo4x3.png'):
wx.Panel.__init__(self, parent=parent)
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.bg = wx.Bitmap(bg_img)
self._width, self._height = self.bg.GetSize()

sizer = wx.BoxSizer(wx.VERTICAL)
hSizer = wx.BoxSizer(wx.HORIZONTAL)

for num in range(4):
btn = wx.Button(self, label="Button %s" % num)
sizer.Add(btn, 0, wx.ALL, 5)
hSizer.Add((1,1), 1, wx.EXPAND)
hSizer.Add(sizer, 0, wx.TOP, 100)
hSizer.Add((1,1), 0, wx.ALL, 75)
self.SetSizer(hSizer)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

def OnSize(self, size):
self.Layout()
self.Refresh()

def OnEraseBackground(self, evt):
pass

def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self)
self.Draw(dc)

def Draw(self, dc):
cliWidth, cliHeight = self.GetClientSize()
if not cliWidth or not cliHeight:
return
dc.Clear()
xPos = (cliWidth - self._width)/2
yPos = (cliHeight - self._height)/2
dc.DrawBitmap(self.bg, xPos, yPos)

app = wx.App()
frame = wx.Frame(None, size=(400,300))
panel = MainPanel(frame)
frame.Show()
app.MainLoop()

OnEraseBackground 方法有意为空。

关于python - wxPython框架上的背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com