【问题标题】:How Do I Get A Bound Function Object from a wxPython Widget?如何从 wxPython 小部件中获取绑定函数对象?
【发布时间】:2013-11-01 18:28:43
【问题描述】:

我有一个允许用户动态创建字段的脚本。其中一个字段是用于打开用户输入对话框的按钮,另外两个是文本输入。对于这两个文本输入,检索用户输入非常简单,可以通过在 sizer 中创建所有 sizer 对象的列表,然后获取每个对象的小部件对象,然后获取其值,如下所示。

for sizerItem in sizer.GetChildren():
    userInput = sizerItem.GetWindow().GetValue()

但是,如果小部件是一个按钮,这将失效,因为该按钮没有任何价值。所以我需要的是像GetWindow() 这样的东西,它将返回小部件对象所绑定的函数。那么

exampleBtn = wx.Button(panel, -1, "Do Stuff")
self.Bind(wx.EVT_BUTTON, self.exampleFunc, exampleBtn)  #with exampleFunc defined elsewhere

print exampleBtn.GetFunctions()

会返回:

['exampleFunc object']

编辑:所以这里是对这里发生的事情的更恰当的解释。有一“行”小部件包含两个文本输入和一个按钮。按钮绑定到一个函数,该函数创建一个对话框,用户从该对话框的列表中选择项目。用户可以随意添加/删除这些小部件行(零行是可能的)。所以需要发生的是每行中的按钮允许独立于其他行选择项目。这已经通过文本输入完成。

【问题讨论】:

  • 用户从对话框中选择项目后应该发生什么?这些选择是否进入按钮所在行中的文本控件?
  • 不,选择与文本控件输入之一(集中为列表)一起进入单独的字典,其中一个文本控件是键。但是,我设法解决了问题。不过感谢您的帮助!

标签: python-2.7 wxpython


【解决方案1】:

似乎没有内置于 wxPython 中的方法来执行此操作。但是,当您创建按钮时,您可以创建一个数据结构来方便地保存该信息。可能是这样的:

self.handlers = {}
self.count  = 0

暂时忽略计数。然后在创建小部件的方法中,你会做

self.handlers[exampleBtn: [] ]
self.handlers[exampleBtn].append(self.exampleFunc)

但是,当我创建用于键的按钮而不是按钮对象本身时,我可能会使用唯一的名称。所以当你创建按钮时,你会做这样的事情:

exampleBtn = wx.Button(self, label="Test", name="btn%s" % self.count)
self.count += 1

然后您可以像这样创建处理程序字典:

self.handlers[exampleBtn.GetName(): [] ]
self.handlers[exampleBtn.GetName()].append(self.exampleFunc)

通过这种方式,您可以使用

检查它所附加的功能
self.handlers["btn0"]

我希望所有这些漫无边际的事情都是有意义的。

【讨论】:

  • 那么你的意思是self.handlers 将是使用其相应功能对象创建的所有按钮的字典。这是有道理的,但是既然按钮很多,而且函数定义只有一个,那么这个字典里的所有函数对象会不会都一样呢?
  • 是的。如果您想做相反的事情并让处理程序告诉您哪个按钮调用了它,那么您可能会发现这篇文章很有帮助:blog.pythonlibrary.org/2011/09/20/…
  • 那么这不好。如果所有函数对象都相同,则无法检索每个唯一案例的数据。
  • 也许我不明白你的意思,但你说你能够检索已经使用该功能的信息。如果您想将按钮与文本小部件相关联,那么您可以给它们类似的名称,或者将所有小部件放在某种元组列表或列表列表中。然后当按钮调用该函数时,您在列表中查找其他两个小部件并调用它们各自的 GetValue() 方法。
  • 不,我认为问题在于我没有充分解释。我更新了问题以获得更完整的解释,让我知道这是否有意义或者您是否需要更多详细信息
【解决方案2】:
import wx

class MyDialog(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Get widget value", pos=wx.DefaultPosition,
                           size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE)

        self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)

        v_box = wx.BoxSizer(wx.VERTICAL)
        self.panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(200, 300), wx.TAB_TRAVERSAL)

        self.sizer_of_button_validator_and_chek_boxes = wx.BoxSizer(wx.VERTICAL)

        self.button_validator = wx.Button(self.panel, wx.ID_ANY, u"call_validation", wx.DefaultPosition, wx.DefaultSize,
                                          0)
        self.button_validator.Bind(wx.EVT_BUTTON, self.call_validation)
        self.sizer_of_button_validator_and_chek_boxes.Add(self.button_validator, 0, wx.ALL, 5)


        lista = range(0, 5)
        for number in lista:
            name = 'check_box_' + str(number)
            self.check_box = wx.CheckBox(self.panel, wx.ID_ANY, u"Check Me!", wx.DefaultPosition, wx.DefaultSize,
                                         name=name)
            self.sizer_of_button_validator_and_chek_boxes.Add(self.check_box, 0, wx.ALL, 5)
            print(self.check_box.GetName())


        self.panel.SetSizer(self.sizer_of_button_validator_and_chek_boxes)
        self.panel.Layout()
        self.sizer_of_button_validator_and_chek_boxes.Fit(self.panel)
        v_box.Add(self.panel, 1, wx.EXPAND | wx.ALL, 5)

        self.SetSizer(v_box)
        self.Layout()
        v_box.Fit(self)

        self.Centre(wx.BOTH)

    def call_validation(self,event):
        children = self.sizer_of_button_validator_and_chek_boxes.GetChildren()
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.CheckBox):
                print(widget.GetName(),widget.GetValue())

if __name__ == "__main__":
    app = wx.App()
    frame = MyDialog(None)
    frame.Show()
    app.MainLoop()

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多