Python-wxpython代码段中关于子窗口布局和消息传递问题

发布于 2017-01-03 15:23:22 字数 757 浏览 1523 评论 2

import wx
class InsertFrame(wx.Frame):
def __init__(self,parent):
MyFame=wx.Frame.__init__(self,parent,title="Frame With Button",pos=(125,100),size=(50,50))
panel=wx.Panel(self)
button=wx.Button(panel,label="close",pos=(125,10),size=(50,50))
self.Bind(wx.EVT_BUTTON,self.OnCloseMe,button)
self.Bind(wx.EVT_CLOSE,self.OnCloseWindow)
def OnCloseMe(self,event):
print "window closed"
self.Close(True)
def OnCloseWindow(self,event):
self.Destroy()

if __name__=="__main__":
app=wx.PySimpleApp()
frame=InsertFrame(parent=None)
frame.Show(True)
app.MainLoop()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-03-30 18:09:42

关于1和3,使用源码补充一下
1、

class Panel(_core.Window):
"""Proxy of C++ Panel class"""
thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
__repr__ = _swig_repr
def __init__(self, *args, **kwargs):
"""
__init__(self, Window parent, int id=-1, Point pos=DefaultPosition,
Size size=DefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER,
String name=PanelNameStr) -> Panel
"""
_windows_.Panel_swiginit(self,_windows_.new_Panel(*args, **kwargs))
self._setOORInfo(self)

请注意上述代码中__init__的注释,panel初始化时的第一个参数就是parent,也就是父窗口,
frame与window的继承关系:
class Frame(TopLevelWindow)
class TopLevelWindow(_core.Window)
3、

  def Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY):
"""
Bind an event to an event handler.

:param event: One of the EVT_* objects that specifies the
type of event to bind,

:param handler: A callable object to be invoked when the
event is delivered to self. Pass None to
disconnect an event handler.

:param source: Sometimes the event originates from a
different window than self, but you still
want to catch it in self. (For example, a
button event delivered to a frame.) By
passing the source of the event, the event
handling system is able to differentiate
between the same event type from different
controls.

:param id: Used to spcify the event source by ID instead
of instance.

:param id2: Used when it is desirable to bind a handler
to a range of IDs, such as with EVT_MENU_RANGE.
"""

在po主的代码中,
self.Bind(wx.EVT_BUTTON,self.OnCloseMe,button)
这一句很好的解释了bind的工作原理,OnCloseMe被绑定到了按钮到button上
关于事件可以参考WxPythonInAction第三章在事件驱动环境中开发

虐人心 2017-02-17 08:58:42

1.不需要想通常的UI工具包那样通过显式调用一个增加的方法来向双亲中插入一个子窗口,wxpython中,只需在子窗口被创建时指定父窗口;此时子窗口被隐式的加入到父对象中了,wxpython中,若只有一个子窗口的框架被创建,那么子窗口被自动重新调整尺寸,去填满该框架的客户区域;这个自动调整尺寸将覆盖关于这个子窗口的任何位置和尺寸信息,尽管子窗口的信息已被指定,但是将被忽略
2.显式指定子窗口的位置和大小,带来的问题:效率和布局;解决的方案:使用称为sizers的对象管理子窗口布局
3.在wxpython中对应不同事件有不同的事件标识,后台识别发生什么样的事件,以及是对哪个控件进行操作的;然后通过绑定的函数,执行预期的操作

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文