微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何完全删除wxPython中的按钮?

如何解决如何完全删除wxPython中的按钮?

编辑:Windows,如果重要

我:对Python本身相当满意,但是我对UI的所有经验都是HTML / CSS / AJAX / PHP。大约24小时前开始教我自己wxPython的知识,请保持友善。

问题:

对于我的项目,我将需要根据正在检查的数据不断调整UI的内容。我在这个方向上取得了一些进展,但是在拆除按钮时遇到了麻烦。有两种方法可以解决此问题,我也不知道该怎么做。

方法1是删除按钮。这在下面的代码中表示出来,并且可以正常工作,但是按钮的位置曾经有个大洞。

方法2是擦除界面并从头开始重建它。对于这个特定的问题,这可能有些矫kill过正,但这是我需要为我的项目做的事情。没有代码发布,因为我尝试的所有操作都没有效果,UI变成了暗灰色,关闭了应用程序,或者没有效果,只是在UI的左上方显示一个小方块。

我感到我在这里缺少明显的东西,但是谷歌没有帮助;我显然没有对它表述正确,因为我所得到的就是如何像下面这样,或者与我的工作完全无关的情况。

import wx

class TinkerFrame( wx.Frame ):
    
    def __init__(self):
    
        super().__init__(parent=None,title='SandBox')
        
        self.panel = wx.Panel(self)
        self.sizer = wx.BoxSizer(wx.VERTICAL)  
        
        self.buttons  = {}
        
        self.buttons['one'] = wx.Button(self.panel,label='Press Me')
        self.buttons['one'].Bind( wx.EVT_BUTTON,self.buttonpressed1)
        
        self.buttons['two'] = wx.Button(self.panel,label='No,Press Me!')
        self.buttons['two'].Bind( wx.EVT_BUTTON,self.buttonpressed2) 
        
        self.buttons['three'] = wx.Button(self.panel,label='Don\'t Touch Me' )
        self.buttons['three'].Bind( wx.EVT_BUTTON,self.buttonpressed3)

        for thisbutton in self.buttons:
            self.sizer.Add( self.buttons[thisbutton],wx.ALL | wx.CENTER,5 )
            
        self.panel.SetSizer(self.sizer)
        self.Show()
        
    def buttonpressed1(self,event):
        print( 'Congrats.  You can press a button.  Mom would be so proud.' )
        
    def buttonpressed2(self,event):
        print( 'Oooooo,two buttons.  Careful not to overheat your cpu!' )
        
    def buttonpressed3(self,event):
        self.buttons['one'].SetLabel( 'OW' )
        self.buttons['one'].Bind( wx.EVT_BUTTON,self.buttonpressed4)
        
        self.buttons['two'].Hide()
        self.buttons['two'].Destroy()
        
        self.buttons['three'].SetLabel( 'hey!' )
        self.buttons['three'].Bind( wx.EVT_BUTTON,self.buttonpressed5)
        
    def buttonpressed4(self,event):
        print( 'You shouldn\'t oughta done that mister.' )
        
    def buttonpressed5(self,event):
        print( 'WHAT DID I SAY???' )
        
        
        
if __name__ == '__main__':
    app = wx.App()
    frame = TinkerFrame()
    app.MainLoop()

解决方法

在wxPython中,小部件布局将在resize事件时重置。您可以通过调整窗口大小然后重新调整大小来触发事件。

为按钮处理程序尝试以下代码:

def buttonPressed3(self,event):
    self.buttons['one'].SetLabel( 'OW' )
    self.buttons['one'].Bind( wx.EVT_BUTTON,self.buttonPressed4)
    
    self.buttons['two'].Hide()
    self.buttons['two'].Destroy()
    
    self.buttons['three'].SetLabel( 'HEY!' )
    self.buttons['three'].Bind( wx.EVT_BUTTON,self.buttonPressed5)
    
    sz = self.GetSize()
    self.SetSize((sz[0],sz[1]+1)) # shift height 1 pixel
    self.SetSize(sz)   # shift back
    if self.IsMaximized():
        self.Maximize(False)
        self.Maximize(True)
,

在buttonPressed3的末尾添加了以下内容。

self.sizer.Layout()

包含该建议的论坛帖子还指出,将需要self.Update()和/或self.Refresh()。 (在这种情况下,“自我”是wxFrame),这不是我的经验,但我提到它是因为在某些情况下可能需要它们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。