【问题标题】:wxPython - Bitmap button won´t be destroyedwxPython - 位图按钮不会被破坏
【发布时间】:2014-05-11 09:24:44
【问题描述】:

我的位图按钮有问题,我想销毁它,但在我点击 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,它仍然显示按钮并打印 Deystroyed。请帮助别人!

【问题讨论】:

    标签: button bitmap wxpython destroy


    【解决方案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 = False

    如果 self.shutdown_showing 为 False,那么您将再次创建一个 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()
    

    希望对你有帮助。

    【讨论】:

    • 非常感谢您的回答,对我帮助很大。如果代码就是这样,它可以工作,但我有更多导入位图的代码,如果我在那里提供代码并单击 wbtn,我看不到 wstdwnbtn,但如果我第二次单击它会打印 Destroyed。所以 wstdwnbtn 在那里,但我看不到它。
    • 我已经回答了您的这个特殊问题。如果您仍有疑问,请提出新问题或使用正确的代码和详细信息编辑您当前的问题。否则无法知道您的问题是什么?
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    相关资源
    最近更新 更多