1

我有一个允许用户动态创建字段的脚本。其中一个字段是打开用户输入对话框的按钮,另外两个是文本输入。对于这两个文本输入,检索用户输入非常简单,可以通过在 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']

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

4

2 回答 2

0

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"]

我希望所有的漫谈都是有道理的。

于 2013-11-01T19:21:53.070 回答
0
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()
于 2020-08-16T22:16:17.713 回答