我即将开始制作一个python(2.7)应用程序 - 使用wx,但我仍然面前有一些理论墙,让我对实际成功持怀疑态度。
以下是几个问题: 1)我的应用程序将有许多小部件(按钮,条目,标签,组合框) - 当用户调用某些事件时,大多数将被添加(单击添加按钮将创建其他标签,条目,组合框和按钮)。我的问题是,如何跟踪这个动态内容,我肯定希望有一个删除选项。我最好的猜测是列表,但是我仍然不确定如何处理类似于组合框的东西+我有点失去了如何删除一组小部件。
2)小部件放置的哪种做法最适合固定尺寸的框架/面板?手动设置xypos会不会很好?即使考虑我在1)中的问题 - 主要感兴趣的是如果框架中间的东西被删除,如何处理布局 - 孔不会很好。
非常感谢
答案 0 :(得分:0)
如果您要添加和删除小部件,我会学习大小调整器。如果您要添加一行小部件,那么将所有这些小部件放在他们自己的大小调整器中。这是添加小部件行的示例:
import wx
########################################################################
class MyPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
self.id = 1
self.row_dict = {}
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
addBtn = wx.Button(self, label="Add")
addBtn.Bind(wx.EVT_BUTTON, self.onAdd)
self.mainSizer.Add(addBtn, 0, wx.ALL|wx.CENTER, 5)
self.SetSizer(self.mainSizer)
#----------------------------------------------------------------------
def onAdd(self, event):
"""
Add row of widgets
"""
sizer = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(self, label="Test")
removeBtn = wx.Button(self, label="Remove row", name=str(self.id))
removeBtn.Bind(wx.EVT_BUTTON, self.onRemove)
self.row_dict[str(self.id)] = sizer
self.id += 1
sizer.Add(label, 0, wx.ALL, 5)
sizer.Add(removeBtn, 0, wx.ALL, 5)
self.mainSizer.Add(sizer)
self.mainSizer.Layout()
#----------------------------------------------------------------------
def onRemove(self, event):
"""
Remove row
"""
btn = event.GetEventObject()
name = btn.GetName()
print name
print "removing => ", self.row_dict[name]
sizer = self.row_dict[name]
for child in sizer.GetChildren():
widget = child.GetWindow()
print widget
sizer.Remove(widget)
#self.mainSizer.Remove(self.row_dict[name])
self.mainSizer.Layout()
self.Layout()
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Add Widgets")
panel = MyPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
app.MainLoop()
我无法让remove方法正常工作,但add方法效果很好。希望这将有助于您至少开始。