2014-05-11 77 views
0

我有位图按钮的问题,我想破坏它,但它仍然显示后,我点击wbtn,它只是打印销毁。这里是代码:wxPython - 位图按钮不会被破坏

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

我觉得我破坏代码isn't错了,所以我真的鸵鸟政策知道为什么it's仍然显示,如果我在wbtn点击按钮和打印Deystroyed。请帮助别人!

回答

1

根据我对您的问题的理解,您希望在点击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_showing来确定何时销毁self.wstdwnbtn。您当前的逻辑如下:

如果self.shutdown_showing为True,然后销毁self.wstdwnbtn并设置self.shutdown_showing =假

如果self.shutdown_showing是假,那么你再创建一个 self.wstdwnbtn并设置self.shutdown_showing =真

所以,最初self.shutdown_showing = False,所以你只需创建self.wstdwnbtn。那么你设置self.shutdown_showing =真。所以,下次当您点击self.wbtn时,wstart()被调用。现在作为self.shutdown_showing =真,所以由于你的逻辑它破坏了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() 

我希望它有帮助。

+0

非常感谢您的回答,它对我有很大的帮助。如果代码就像这样,它的工作原理,但我有更多的导入位图的代码,如果我给代码,并点击它,我不能看到wstdwnbtn,但如果我点击第二次它打印销毁。所以wstdwnbtn在那里,但我看不到它。 – DRGY

+0

我已经回答了你的这个问题。如果您仍然有疑问,请提出一个新问题,或者请编辑您当前的问题,并附上正确的代码和详细信息。否则不可能知道你的问题是什么? –