【问题标题】:wxPython: Data binding with controlswxPython:与控件的数据绑定
【发布时间】:2015-03-10 12:17:53
【问题描述】:

如何将 MyModel 中的 self.text 值数据绑定到 wx.Frame 中的控件?

当文本控件更改文本时,我希望标签以及其他文本控件的内容自动更改。 (如果可能的话,最好不用写任何代码)

注意:这是一个虚拟示例,用于说明一般问题,随着更多字段添加到视图和模型中,该问题可能会变得更加复杂

import wx

class MyModel(object):
    def __init__(self):
        self.text = "hello"

class MyRegion(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="My Region")
        self.model = MyModel()

        self.label = wx.StaticText(self, label=self.model.text)
        self.textbox = wx.TextCtrl(self, value=self.model.text)
        self.textbox2 = wx.TextCtrl(self, value=self.model.text)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.label, 0, wx.ALL, 5)
        sizer.Add(self.textbox, 0, wx.ALL, 5)
        sizer.Add(self.textbox2, 0, wx.ALL, 5)
        self.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    frame = MyRegion(None)
    frame.Show()
    app.MainLoop()
  • 是否有一种以数据/模型为中心的方法,而不是必须将视图事件绑定到代码,以便代码更新模型,然后触发更多代码来更新其余部分?
  • 如果没有,那么有哪些机制/推荐的方法可用于在模型更新后触发视图更新?

【问题讨论】:

    标签: python-2.7 wxpython wxwidgets


    【解决方案1】:

    为您要更改其文本的控件定义wxEVT_UPDATE_UI event 的处理程序,并从中调用event.SetText()。这允许您以声明方式指定控件应具有的文本,而无需在其他内容发生更改时更新它——相反,它将始终是最新的。

    【讨论】:

    • 数据在后台进程通过定时器更新的场景呢?有没有办法为此触发更新?
    • 更新后调用wxWakeUpIdle()触发UI刷新(从空闲时间处理完成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多