Button wxPython-位图按钮赢得´;不可毁灭

Button wxPython-位图按钮赢得´;不可毁灭,button,bitmap,wxpython,destroy,Button,Bitmap,Wxpython,Destroy,我对位图按钮有问题,我想对它进行编辑,但在我点击wbtn后它仍然显示,它只是打印出来。以下是代码: 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.Cent

我对位图按钮有问题,我想对它进行编辑,但在我点击wbtn后它仍然显示,它只是打印出来。以下是代码:

    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()

我认为我的销毁代码没有错,所以我真的不知道为什么当我点击wbtn时,它仍然显示按钮和打印命令。请救人

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

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

self.wstdwnbtn = wx.StaticBitmap(self.wbtn, -1, self.shutdownbtn)
因为在你的代码里

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

不能单击
self.wstdwnbtn
。在您的案例中,单击self.wstdwnbtn不会生成“退出”。但是我的朋友我也解决了这个问题

我在你的代码中发现了另一个逻辑问题。您正在使用显示的变量
self.shutdown\u来确定何时销毁
self.wstdwnbtn
。您当前的逻辑如下:

如果显示的
self.shutdown\u
为真,则销毁
self.wstdwnbtn
并将显示的
self.shutdown\u设置为假

如果显示的
self.shutdown\u
为False,则再次创建
self.wstdwnbtn
并设置显示的
self.shutdown\u
=True

因此,最初显示的
self.shutdown\u
=False,因此您只需创建
self.wstdwnbtn
。然后您将
self.shutdown\u设置为True。因此,下次单击
self.wbtn
时,将调用
wstart()
。现在,由于显示的
self.shutdown\u
=True,因此根据您的逻辑,它将销毁
self.wstdwnbtn
,并将显示的
self.shutdown\u设置为False。在下一行中,如果不是self.wstdwnbtn,则显示:
,因此,
self.shutdown\u显示
=False,您将立即再次创建一个
self.wstdwnbtn
,因此您永远不会看到
self.wstdwnbtn
被销毁

解决方案

我想你是想用这句话。我已经修复了所有这些问题的代码。现在您将看到如何销毁并再次创建
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()

我希望这会有帮助。

非常感谢您的回答,这对我帮助很大。如果代码就是这样,它就可以工作,但我有更多导入位图的代码,如果我在那里给出代码并单击wbtn,我就看不到wstdwnbtn,但如果我第二次单击它,它就会打印出来。所以wstdwnbtn在那里,但我看不到。我已经回答了您的这个特殊问题。如果您仍有疑问,请提出新问题或使用正确的代码和详细信息编辑当前问题。否则就不可能知道你的问题是什么?