wxPython——BoxSizers 没有正确放置东西
wxPython -- BoxSizers not placing things correctly
我不知道我做错了什么。我刚刚从 Tkinter 跳转到 wxPython,我正在尝试找出 BoxSizers。我会查找这个问题,但我什至不知道要查找什么。这个面板正在填充一个框架的 space,它应该显示一行文本,下面有一个进度条,这一切都应该占据面板底部的 1/5 左右,水平居中(最终我'要在它后面添加一个背景图像)。但是发生的事情是,我只看到了文本,而且从顶部向下大约只有 40%,与 window 的左边缘对齐。这是代码:
class KhPanel(wx.Panel):
def __init__(self, parent, configSet, selectWindow):
wx.Panel.__init__(self, parent=parent)
self.frame = parent
self.configSet = configSet
whichWindow = getattr(self, selectWindow)
whichWindow()
def configWindow(self):
gaugeWidth = (1/5)*self.configSet["width"]
gaugeHeight = (1/10)*self.configSet["height"]
gaugeMax = 100
topBuffer = (8/10)*self.configSet["height"]
itemSep = (1/16)*self.configSet["height"]
vSizer = wx.BoxSizer(wx.VERTICAL)
textSizer = wx.BoxSizer(wx.HORIZONTAL)
progressSizer = wx.BoxSizer(wx.HORIZONTAL)
configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
vSizer.Add(progressSizer, 1, wx.TOP, itemSep)
self.SetSizer(vSizer)
vSizer.Fit(self)
return
如果您需要此信息,configSet.width 和高度是父级 window 的宽度和高度(当前为 340 x 270)。在这种情况下,selectWindow 是 "configWindow"
运行 这段代码,gaugeWidth
和 gaugeHeight
都设置为零,这就是进度条不显示的原因。这是因为您在这里进行整数数学运算,因此 1 除以 5 为 0。与 1/10 相同。只需将这些行更改为:
gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
然后仪表就会出现。这是一些完全可运行的代码,从无法运行的原始代码稍作修改:
import wx
class KhPanel(wx.Panel):
def __init__(self, parent, configSet):
wx.Panel.__init__(self, parent=parent)
self.frame = parent
self.configSet = configSet
self.configWindow()
def configWindow(self):
gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
gaugeMax = 100
topBuffer = (8/10)*self.configSet["height"]
itemSep = (1/16)*self.configSet["height"]
vSizer = wx.BoxSizer(wx.VERTICAL)
textSizer = wx.BoxSizer(wx.HORIZONTAL)
progressSizer = wx.BoxSizer(wx.HORIZONTAL)
configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
vSizer.Add(progressSizer, 1, wx.TOP, itemSep)
self.SetSizer(vSizer)
vSizer.Fit(self)
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test")
config = {'width':340, 'height':270}
panel = KhPanel(self, config)
self.Show()
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
app.MainLoop()
结合上面 Mike Driscoll 的更正,我改变了我 spaced 它的方式,结果是工作量减少了。我取出了水平尺寸器,因为我发现不需要它们,除非我要在同一行上 space 两个东西,并且我添加了拉伸 spacers 而不是巨大的边框。这是新代码,它看起来正是我想要的:
def configWindow(self):
gaugeWidth = (4/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
gaugeMax = 100
vSizer = wx.BoxSizer(wx.VERTICAL)
configText = wx.StaticText(self, label="STUFF")
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
vSizer.AddStretchSpacer(7)
vSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
vSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 0)
vSizer.AddStretchSpacer(1)
self.SetSizer(vSizer)
return
我不知道我做错了什么。我刚刚从 Tkinter 跳转到 wxPython,我正在尝试找出 BoxSizers。我会查找这个问题,但我什至不知道要查找什么。这个面板正在填充一个框架的 space,它应该显示一行文本,下面有一个进度条,这一切都应该占据面板底部的 1/5 左右,水平居中(最终我'要在它后面添加一个背景图像)。但是发生的事情是,我只看到了文本,而且从顶部向下大约只有 40%,与 window 的左边缘对齐。这是代码:
class KhPanel(wx.Panel):
def __init__(self, parent, configSet, selectWindow):
wx.Panel.__init__(self, parent=parent)
self.frame = parent
self.configSet = configSet
whichWindow = getattr(self, selectWindow)
whichWindow()
def configWindow(self):
gaugeWidth = (1/5)*self.configSet["width"]
gaugeHeight = (1/10)*self.configSet["height"]
gaugeMax = 100
topBuffer = (8/10)*self.configSet["height"]
itemSep = (1/16)*self.configSet["height"]
vSizer = wx.BoxSizer(wx.VERTICAL)
textSizer = wx.BoxSizer(wx.HORIZONTAL)
progressSizer = wx.BoxSizer(wx.HORIZONTAL)
configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
vSizer.Add(progressSizer, 1, wx.TOP, itemSep)
self.SetSizer(vSizer)
vSizer.Fit(self)
return
如果您需要此信息,configSet.width 和高度是父级 window 的宽度和高度(当前为 340 x 270)。在这种情况下,selectWindow 是 "configWindow"
运行 这段代码,gaugeWidth
和 gaugeHeight
都设置为零,这就是进度条不显示的原因。这是因为您在这里进行整数数学运算,因此 1 除以 5 为 0。与 1/10 相同。只需将这些行更改为:
gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
然后仪表就会出现。这是一些完全可运行的代码,从无法运行的原始代码稍作修改:
import wx
class KhPanel(wx.Panel):
def __init__(self, parent, configSet):
wx.Panel.__init__(self, parent=parent)
self.frame = parent
self.configSet = configSet
self.configWindow()
def configWindow(self):
gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
gaugeMax = 100
topBuffer = (8/10)*self.configSet["height"]
itemSep = (1/16)*self.configSet["height"]
vSizer = wx.BoxSizer(wx.VERTICAL)
textSizer = wx.BoxSizer(wx.HORIZONTAL)
progressSizer = wx.BoxSizer(wx.HORIZONTAL)
configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
vSizer.Add(progressSizer, 1, wx.TOP, itemSep)
self.SetSizer(vSizer)
vSizer.Fit(self)
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test")
config = {'width':340, 'height':270}
panel = KhPanel(self, config)
self.Show()
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
app.MainLoop()
结合上面 Mike Driscoll 的更正,我改变了我 spaced 它的方式,结果是工作量减少了。我取出了水平尺寸器,因为我发现不需要它们,除非我要在同一行上 space 两个东西,并且我添加了拉伸 spacers 而不是巨大的边框。这是新代码,它看起来正是我想要的:
def configWindow(self):
gaugeWidth = (4/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]
gaugeMax = 100
vSizer = wx.BoxSizer(wx.VERTICAL)
configText = wx.StaticText(self, label="STUFF")
configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))
vSizer.AddStretchSpacer(7)
vSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
vSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 0)
vSizer.AddStretchSpacer(1)
self.SetSizer(vSizer)
return