<?xml version="1.0"?>
<!-- generated by wxGlade 1.0.4 on Sun Apr 23 13:12:59 2023 -->
<application class="MyApp" encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="1" name="app" option="0" overwrite="1" path="./wxglade_out.py" source_extension=".cpp" top_window="View" use_gettext="0" use_new_namespace="1">
<object class="View" name="View" base="EditFrame">
<extracode>from pubsub import pub\nfrom mvc_example import Env, install_package, interp\n\nclass Controller(object):\n def __init__(self):\n pub.subscribe(self.read, "Controller")\n def read(self, x, env):\n pub.sendMessage("Model.eval", x = x, env = env)\n\nclass Model(object):\n def __init__(self):\n pub.subscribe(self.eval, "Model")\n def eval(self, x, env):\n pub.sendMessage("View.setProperty", env = interp(x, env))</extracode>
<extracode_pre>self.env = Env(install_package())</extracode_pre>
<extracode_post>pub.subscribe(self.setProperty, "View")</extracode_post>
<size>400, 300</size>
<title>ModelViewController</title>
<style>wxDEFAULT_FRAME_STYLE</style>
<object class="wxGridSizer" name="grid_sizer_1" base="EditGridSizer">
<rows>2</rows>
<cols>2</cols>
<vgap>0</vgap>
<hgap>0</hgap>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<flag>wxALIGN_CENTER</flag>
<object class="wxStaticText" name="text" base="EditStaticText">
<label>My Money</label>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<flag>wxALIGN_CENTER</flag>
<object class="wxButton" name="add" base="EditButton">
<events>
<handler event="EVT_BUTTON">lambda event: pub.sendMessage("Controller.read", x = self.add.GetLabel(), env = self.env)</handler>
</events>
<label>Add Money</label>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<flag>wxALIGN_CENTER</flag>
<object class="wxTextCtrl" name="ctrl" base="EditTextCtrl">
<disabled>1</disabled>
<value>""</value>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<flag>wxALIGN_CENTER</flag>
<object class="wxButton" name="remove" base="EditButton">
<events>
<handler event="EVT_BUTTON">lambda event: pub.sendMessage("Controller.read", x = self.remove.GetLabel(), env = self.env)</handler>
</events>
<label>Remove Money</label>
</object>
</object>
</object>
</object>
</application>
PD94bWwgdmVyc2lvbj0iMS4wIj8+CjwhLS0gZ2VuZXJhdGVkIGJ5IHd4R2xhZGUgMS4wLjQgb24gU3VuIEFwciAyMyAxMzoxMjo1OSAyMDIzIC0tPgoKPGFwcGxpY2F0aW9uIGNsYXNzPSJNeUFwcCIgZW5jb2Rpbmc9IlVURi04IiBmb3JfdmVyc2lvbj0iMy4wIiBoZWFkZXJfZXh0ZW5zaW9uPSIuaCIgaW5kZW50X2Ftb3VudD0iNCIgaW5kZW50X3N5bWJvbD0ic3BhY2UiIGlzX3RlbXBsYXRlPSIwIiBsYW5ndWFnZT0icHl0aG9uIiBtYXJrX2Jsb2Nrcz0iMSIgbmFtZT0iYXBwIiBvcHRpb249IjAiIG92ZXJ3cml0ZT0iMSIgcGF0aD0iLi93eGdsYWRlX291dC5weSIgc291cmNlX2V4dGVuc2lvbj0iLmNwcCIgdG9wX3dpbmRvdz0iVmlldyIgdXNlX2dldHRleHQ9IjAiIHVzZV9uZXdfbmFtZXNwYWNlPSIxIj4KICAgIDxvYmplY3QgY2xhc3M9IlZpZXciIG5hbWU9IlZpZXciIGJhc2U9IkVkaXRGcmFtZSI+CiAgICAgICAgPGV4dHJhY29kZT5mcm9tIHB1YnN1YiBpbXBvcnQgcHViXG5mcm9tIG12Y19leGFtcGxlIGltcG9ydCBFbnYsIGluc3RhbGxfcGFja2FnZSwgaW50ZXJwXG5cbmNsYXNzIENvbnRyb2xsZXIob2JqZWN0KTpcbiAgICBkZWYgX19pbml0X18oc2VsZik6XG4gICAgICAgIHB1Yi5zdWJzY3JpYmUoc2VsZi5yZWFkLCAiQ29udHJvbGxlciIpXG4gICAgZGVmIHJlYWQoc2VsZiwgeCwgZW52KTpcbiAgICAgICAgcHViLnNlbmRNZXNzYWdlKCJNb2RlbC5ldmFsIiwgeCA9IHgsIGVudiA9IGVudilcblxuY2xhc3MgTW9kZWwob2JqZWN0KTpcbiAgICBkZWYgX19pbml0X18oc2VsZik6XG4gICAgICAgIHB1Yi5zdWJzY3JpYmUoc2VsZi5ldmFsLCAiTW9kZWwiKVxuICAgIGRlZiBldmFsKHNlbGYsIHgsIGVudik6XG4gICAgICAgIHB1Yi5zZW5kTWVzc2FnZSgiVmlldy5zZXRQcm9wZXJ0eSIsIGVudiA9IGludGVycCh4LCBlbnYpKTwvZXh0cmFjb2RlPgogICAgICAgIDxleHRyYWNvZGVfcHJlPnNlbGYuZW52ID0gRW52KGluc3RhbGxfcGFja2FnZSgpKTwvZXh0cmFjb2RlX3ByZT4KICAgICAgICA8ZXh0cmFjb2RlX3Bvc3Q+cHViLnN1YnNjcmliZShzZWxmLnNldFByb3BlcnR5LCAiVmlldyIpPC9leHRyYWNvZGVfcG9zdD4KICAgICAgICA8c2l6ZT40MDAsIDMwMDwvc2l6ZT4KICAgICAgICA8dGl0bGU+TW9kZWxWaWV3Q29udHJvbGxlcjwvdGl0bGU+CiAgICAgICAgPHN0eWxlPnd4REVGQVVMVF9GUkFNRV9TVFlMRTwvc3R5bGU+CiAgICAgICAgPG9iamVjdCBjbGFzcz0id3hHcmlkU2l6ZXIiIG5hbWU9ImdyaWRfc2l6ZXJfMSIgYmFzZT0iRWRpdEdyaWRTaXplciI+CiAgICAgICAgICAgIDxyb3dzPjI8L3Jvd3M+CiAgICAgICAgICAgIDxjb2xzPjI8L2NvbHM+CiAgICAgICAgICAgIDx2Z2FwPjA8L3ZnYXA+CiAgICAgICAgICAgIDxoZ2FwPjA8L2hnYXA+CiAgICAgICAgICAgIDxvYmplY3QgY2xhc3M9InNpemVyaXRlbSI+CiAgICAgICAgICAgICAgICA8b3B0aW9uPjA8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxib3JkZXI+MDwvYm9yZGVyPgogICAgICAgICAgICAgICAgPGZsYWc+d3hBTElHTl9DRU5URVI8L2ZsYWc+CiAgICAgICAgICAgICAgICA8b2JqZWN0IGNsYXNzPSJ3eFN0YXRpY1RleHQiIG5hbWU9InRleHQiIGJhc2U9IkVkaXRTdGF0aWNUZXh0Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TXkgTW9uZXk8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9vYmplY3Q+CiAgICAgICAgICAgIDwvb2JqZWN0PgogICAgICAgICAgICA8b2JqZWN0IGNsYXNzPSJzaXplcml0ZW0iPgogICAgICAgICAgICAgICAgPG9wdGlvbj4wPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8Ym9yZGVyPjA8L2JvcmRlcj4KICAgICAgICAgICAgICAgIDxmbGFnPnd4QUxJR05fQ0VOVEVSPC9mbGFnPgogICAgICAgICAgICAgICAgPG9iamVjdCBjbGFzcz0id3hCdXR0b24iIG5hbWU9ImFkZCIgYmFzZT0iRWRpdEJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgPGV2ZW50cz4KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgZXZlbnQ9IkVWVF9CVVRUT04iPmxhbWJkYSBldmVudDogcHViLnNlbmRNZXNzYWdlKCJDb250cm9sbGVyLnJlYWQiLCB4ID0gc2VsZi5hZGQuR2V0TGFiZWwoKSwgZW52ID0gc2VsZi5lbnYpPC9oYW5kbGVyPgogICAgICAgICAgICAgICAgICAgIDwvZXZlbnRzPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5BZGQgTW9uZXk8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9vYmplY3Q+CiAgICAgICAgICAgIDwvb2JqZWN0PgogICAgICAgICAgICA8b2JqZWN0IGNsYXNzPSJzaXplcml0ZW0iPgogICAgICAgICAgICAgICAgPG9wdGlvbj4wPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8Ym9yZGVyPjA8L2JvcmRlcj4KICAgICAgICAgICAgICAgIDxmbGFnPnd4QUxJR05fQ0VOVEVSPC9mbGFnPgogICAgICAgICAgICAgICAgPG9iamVjdCBjbGFzcz0id3hUZXh0Q3RybCIgbmFtZT0iY3RybCIgYmFzZT0iRWRpdFRleHRDdHJsIj4KICAgICAgICAgICAgICAgICAgICA8ZGlzYWJsZWQ+MTwvZGlzYWJsZWQ+CiAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiIiPC92YWx1ZT4KICAgICAgICAgICAgICAgIDwvb2JqZWN0PgogICAgICAgICAgICA8L29iamVjdD4KICAgICAgICAgICAgPG9iamVjdCBjbGFzcz0ic2l6ZXJpdGVtIj4KICAgICAgICAgICAgICAgIDxvcHRpb24+MDwvb3B0aW9uPgogICAgICAgICAgICAgICAgPGJvcmRlcj4wPC9ib3JkZXI+CiAgICAgICAgICAgICAgICA8ZmxhZz53eEFMSUdOX0NFTlRFUjwvZmxhZz4KICAgICAgICAgICAgICAgIDxvYmplY3QgY2xhc3M9Ind4QnV0dG9uIiBuYW1lPSJyZW1vdmUiIGJhc2U9IkVkaXRCdXR0b24iPgogICAgICAgICAgICAgICAgICAgIDxldmVudHM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyIGV2ZW50PSJFVlRfQlVUVE9OIj5sYW1iZGEgZXZlbnQ6IHB1Yi5zZW5kTWVzc2FnZSgiQ29udHJvbGxlci5yZWFkIiwgeCA9IHNlbGYucmVtb3ZlLkdldExhYmVsKCksIGVudiA9IHNlbGYuZW52KTwvaGFuZGxlcj4KICAgICAgICAgICAgICAgICAgICA8L2V2ZW50cz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+UmVtb3ZlIE1vbmV5PC9sYWJlbD4KICAgICAgICAgICAgICAgIDwvb2JqZWN0PgogICAgICAgICAgICA8L29iamVjdD4KICAgICAgICA8L29iamVjdD4KICAgIDwvb2JqZWN0Pgo8L2FwcGxpY2F0aW9uPg==