【问题标题】:Clearing wxPython frame on a button click单击按钮清除 wxPython 框架
【发布时间】:2012-08-07 15:35:50
【问题描述】:

在 Arch 上使用 wxPython 2.8(工作正常,但我认为不应该......)和在 Mac OS X 上使用 wxPython 2.9,都是 Python 2.7。我的代码包括根据当前状态在不同屏幕之间切换。在状态(屏幕)之间的每次切换时,我都会清除我的主 Sizer 并在我的主框架上调用 DestroyChildren(),然后用其他组件填充它们。

所以基本上我认为我有外部线程试图更改主线程中的 wx 组件。我猜这不是 wxPython 中的最佳实践,那么我该如何修改呢?

将事件附加到按钮

self.login_button.Bind(wx.EVT_BUTTON, self.login_button_click)

登录事件做事并调用更新(模型状态在这里改变)

def login_button_click(self,event):

    ...
    # CHANGE THE self.model.current_state
    ...

    self.update(None)

更新清除框架,检查状态并调用构建器方法

def update(self, o):
    self.box.Clear() #clear the main sizer
    self.frame.DestroyChildren() #delete all children, THIS IS WHERE THE CODE SEGFAULTS


    print "STATE: "+self.model.current_state

    if self.model.current_state == self.model....
        ...
    elif self.model.current_state == self.model....
        ...

我曾尝试使用 wx.CallAfter,这导致所有组件在事件结束时都被删除,甚至是新建的组件。

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    您实际上是在使用线程模块还是与线程相关的任何东西?你真的不应该需要那些来删除 wxPython 中的小部件。我不确定您为什么首先要销毁所有小部件。为什么不直接隐藏主框架并显示带有所有新小部件的子框架?或者使用两个面板。一个面板被破坏,另一个面板与其他小部件被放置在它的位置?我的blog 上有一个后者的例子。

    【讨论】:

    • 我发生的一件奇怪的事情是 frame.Layout() 不起作用?为了让面板正确显示,我需要调整框架的大小。我在顶层框架上调用 Layout() 方法。
    • 您可能需要在包含面板的 sizer 上调用 Layout()。
    • 厌倦了 self.sizer.Layout() 和 self.Layout() 的组合,结果相同。调用 .Layout() 是否强制所有 chidl 元素的 re-Layout() 顺便说一句?还是我应该尝试在较低级别调用 Layout?
    • 通常你只需在顶部容器上调用它,它就会布置孩子。如果您可以生成一个简单的可运行示例,那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2017-09-21
    • 2019-12-17
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多