wxPython - 不会销毁位图按钮

时间:2014-05-11 09:24:45

标签: button bitmap wxpython destroy

我有位图按钮的问题,我想要它,但它仍然显示我点击wbtn后,它只是打印Destroyed。这是代码:

    import wx

class GameFrame(wx.Frame):

def __init__(self,parent,id):

    self.shutdown_showing = False

    wx.Frame.__init__(self, parent, id, "Project - Map", size=(860, 640))
    wx.Frame.CenterOnScreen(self)
    self.SetBackgroundColour("green")

    self.wndwsbtn = wx.Bitmap("Images/wlogo.png")
    self.wbtn = wx.StaticBitmap(self, -1, self.wndwsbtn)
    self.wbtn.SetPosition((2, 585))
    self.wbtn.Bind(wx.EVT_LEFT_DOWN, self.wstart)
    self.wbtn.SetToolTip(wx.ToolTip("Start"))

def wstart(self, event):

    if self.shutdown_showing:
        self.shutdownbtn.Destroy()
        self.Layout()
        print "Destroyed"
        self.shutdown_showing = False

    if not self.shutdown_showing:
        self.shutdownbtn = wx.Bitmap("Images/wstdwn.png")
        self.wstdwnbtn = wx.StaticBitmap(self, -1, self.shutdownbtn)
        self.wstdwnbtn.SetPosition((0, 550))
        self.wstdwnbtn.Bind(wx.EVT_LEFT_DOWN, self.wexit)
        self.wstdwnbtn.SetToolTip(wx.ToolTip("Exit to main menu."))
        self.shutdown_showing = True

def wexit(self, event):
    print "Exit"

if __name__=='__main__':
    app=wx.App(redirect=False)
    frame=GameFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

我认为我的破坏代码没有错,所以我真的不知道为什么它仍然显示按钮并打印Deystroyed如果我点击wbtn。请帮助别人!

1 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您希望在点击self.wstdwnbtn时销毁/删除wbtn

我的方法是在self.wstdwnbtn上创建wbtn。这可以通过以下行完成:

self.wstdwnbtn = wx.StaticBitmap(self.wbtn, -1, self.shutdownbtn)

因为在你的代码中

self.wstdwnbtn = wx.StaticBitmap(self.wbtn, -1, self.shutdownbtn)

您无法点击self.wstdwnbtn。点击self.wstdwnbtn并未生成'退出'在你的情况下。但我也解决了这个问题。

此外,我在您的代码中发现了另一个逻辑问题。您正在使用变量self.shutdown_showing来确定何时销毁self.wstdwnbtn。您当前的逻辑如下:

  

如果self.shutdown_showing为True,则销毁self.wstdwnbtn并设置self.shutdown_showing = False

     

如果self.shutdown_showing为假,那么您将再次创建一个   self.wstdwnbtn并设置self.shutdown_showing = True

因此,最初self.shutdown_showing = False,因此您只需创建self.wstdwnbtn。然后你设置self.shutdown_showing = True。因此,下次点击self.wbtn时会调用wstart()。现在self.shutdown_showing = True,所以由于你的逻辑,它会破坏self.wstdwnbtn并设置self.shutdown_showing = False。在下一行,您有if not self.shutdown_showing:,因此self.shutdown_showing = False,您会立即再次创建self.wstdwnbtn,因此您永远不会看到self.wstdwnbtn被销毁。

<强>解决方案

我认为您想使用if-Else声明。我修复了所有这些问题的代码。现在,您将看到self.wstdwnbtn如何被销毁并再次创建。

import wx

class GameFrame(wx.Frame):

    def __init__(self,parent,id):

        self.shutdown_showing = False
        wx.Frame.__init__(self, parent, id, "Project - Map", size=(860, 640))
        wx.Frame.CenterOnScreen(self)
        self.SetBackgroundColour("green")
        self.wndwsbtn = wx.Bitmap("Your Image")
        self.wbtn = wx.StaticBitmap(self, -1, self.wndwsbtn)
        self.wbtn.SetPosition((2, 585))
        self.wbtn.Bind(wx.EVT_LEFT_DOWN, self.wstart)
        self.wbtn.SetToolTip(wx.ToolTip("Start"))

    def wstart(self, event):
        if self.shutdown_showing:
            self.wstdwnbtn.Destroy()# Destroy self.wstdwnbtn
            self.Layout()
            print "Destroyed"
            self.shutdown_showing = False
        # if not self.shutdown_showing: This was wrong.
        else:
            self.shutdownbtn = wx.Bitmap("Your image")
            # Create self.wstdwnbtn on self.wbtn instead.
            self.wstdwnbtn = wx.StaticBitmap(self.wbtn, -1, self.shutdownbtn)
            self.wstdwnbtn.SetPosition((0, 550))
            self.wstdwnbtn.Bind(wx.EVT_LEFT_DOWN, self.wexit)
            self.wstdwnbtn.SetToolTip(wx.ToolTip("Exit to main menu."))
            self.shutdown_showing = True

    def wexit(self, event):
        print "Exit"

if __name__=='__main__':
    app=wx.App(redirect=False)
    frame=GameFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

我希望它有所帮助。