我是第一次创建一个小的wxPython实用程序,而且我遇到了问题。
我想将组件添加到已创建的框架中。为此,我正在销毁框架的旧面板,并创建一个包含所有新组件的新面板。
1:是否有更好的方法可以动态地向面板添加内容?
2:为什么,在下面的例子中,我得到一个奇怪的重绘错误,其中面板仅在左上角绘制,并且在调整大小时,面板是否正确绘制? (WinXP,Python 2.5,最新的wxPython)
感谢您的帮助!
import wx
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'TimeTablr')
#Variables
self.iCalFiles = ['Empty', 'Empty', 'Empty']
self.panel = wx.Panel(self, -1)
self.layoutElements()
def layoutElements(self):
self.panel.Destroy()
self.panel = wx.Panel(self, -1)
#Buttons
self.getFilesButton = wx.Button(self.panel, 1, 'Get Files')
self.calculateButton = wx.Button(self.panel, 2, 'Calculate')
self.quitButton = wx.Button(self.panel, 3, 'Quit Application')
#Binds
self.Bind(wx.EVT_BUTTON, self.Quit, id=3)
self.Bind(wx.EVT_BUTTON, self.getFiles, id=1)
#Layout Managers
vbox = wx.BoxSizer(wx.VERTICAL)
#Panel Contents
self.ctrlsToDescribe = []
self.fileNames = []
for iCalFile in self.iCalFiles:
self.ctrlsToDescribe.append(wx.TextCtrl(self.panel, -1))
self.fileNames.append(wx.StaticText(self.panel, -1, iCalFile))
#Add Components to Layout Managers
for i in range(0, len(self.ctrlsToDescribe)):
hboxtemp = wx.BoxSizer(wx.HORIZONTAL)
hboxtemp.AddStretchSpacer()
hboxtemp.Add(self.fileNames[i], 1, wx.EXPAND)
hboxtemp.AddStretchSpacer()
hboxtemp.Add(self.ctrlsToDescribe[i], 2, wx.EXPAND)
hboxtemp.AddStretchSpacer()
vbox.Add(hboxtemp)
finalHBox = wx.BoxSizer(wx.HORIZONTAL)
finalHBox.Add(self.getFilesButton)
finalHBox.Add(self.calculateButton)
finalHBox.Add(self.quitButton)
vbox.Add(finalHBox)
self.panel.SetSizer(vbox)
self.Show()
def Quit(self, event):
self.Destroy()
def getFiles(self, event):
self.iCalFiles = ['Example1','Example1','Example1','Example1','Example1','Example1']
self.layoutElements()
self.Update()
app = wx.App()
MainFrame()
app.MainLoop()
del app
答案 0 :(得分:1)
1)我相信Sizer会让你将元素插入到它们的现有顺序中。那可能会快一点。
2)我没有看到你在OSX上描述的行为,但是在猜测中,尝试在layoutElements中的self.Show()之前调用self.Layout()?
答案 1 :(得分:0)
我有类似的问题,面板会被挤压到右上角。我通过致电panel.Fit()
解决了这个问题。
在您的示例中,您应该在self.panel.Fit()
self.panel.SetSizer(vbox)