想在wxPython中创建一个具有背景图片和按钮的GUI界面,但是不知道如何找到一个可以包含图像和按钮的容器。
-
现有的代码中,按钮没有正确放置,无论设置什么位置和大小,它总是出现在同一个地方。
-
想去除窗口的默认最大化、最小化和还原按钮,只保留一个关闭按钮。
2、解决方案
-
使用wx.Panel作为容器,将背景图片作为其背景,然后在上面添加按钮。
-
使用wx.GridSizer或wx.FlexGridSizer作为按钮布局管理器,可以控制按钮的位置和大小。
-
使用wx.Frame.SetMenuBar()方法设置一个空菜单栏,即可去除窗口的默认最大化、最小化和还原按钮。
-
代码示例如下:
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
# 创建一个网格布局管理器,4行2列
grid_sizer = wx.GridSizer(4, 2, 5, 5)
# 创建按钮并添加到布局管理器中
button1 = wx.Button(self, label='Button1')
grid_sizer.Add(button1, 0, wx.ALL, 5)
button2 = wx.Button(self, label='Button2')
grid_sizer.Add(button2, 0, wx.ALL, 5)
button3 = wx.Button(self, label='Button3')
grid_sizer.Add(button3, 0, wx.ALL, 5)
button4 = wx.Button(self, label='Button4')
grid_sizer.Add(button4, 0, wx.ALL, 5)
# 将布局管理器添加到面板中
self.SetSizer(grid_sizer)
# 绑定背景擦除事件,在其中绘制背景图片
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
#----------------------------------------------------------------------
def OnEraseBackground(self, evt):
"""
Add a picture to the background
"""
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap("admin.png")
dc.DrawBitmap(bmp, 0, 0)
########################################################################
class MainFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, size=(320, 243))
panel = MainPanel(self)
self.Center()
# 设置一个空菜单栏,去除窗口的默认最大化、最小化和还原按钮
self.SetMenuBar(wx.MenuBar())
########################################################################
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()
- 这样就可以创建一个具有背景图片和按钮的GUI界面,并且去除窗口的默认最大化、最小化和还原按钮。