【问题标题】:wxPython -- BoxSizers not placing things correctlywxPython -- BoxSizers 没有正确放置东西
【发布时间】:2015-03-06 07:18:55
【问题描述】:

我不知道我做错了什么。我刚刚从 Tkinter 跳到 wxPython,我正在尝试找出 BoxSizer。我会查这个问题,但我什至不知道该查什么。这个面板填充了 Frame 的空间,它应该显示一行文本,下面有一个进度条,并且应该占据面板底部 1/5 左右,水平居中(最终我要在其后面添加背景图像)。但发生的情况是我只看到文本,并且从顶部向下仅约 40%,与窗口的左边缘对齐。代码如下:

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 和 height 是父窗口的宽度和高度(当前为 340 x 270)。而selectWindow,在这种情况下,是“configWindow”

【问题讨论】:

    标签: python user-interface wxpython boxsizer


    【解决方案1】:

    运行此代码,gaugeWidthgaugeHeight 都设置为零,这就是进度条不显示的原因。这是因为您在这里进行整数数学运算,因此 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()
    

    【讨论】:

    • 你是对的,这就是问题所在。我对 topBuffer 和 itemSep 做了同样的事情,现在它们也在工作,虽然我仍然有一些调整,因为进度条最终在顶部,我不知道为什么并且小部件没有水平居中,这是我的想法ALIGN_CENTER 做到了。啊,好吧,我可以对这些大惊小怪。为什么 Python 在这样的整数末尾需要 .0? .0 是否告诉它答案将是一个浮点数?调试规则#1:测试你的变量——第 500 次吸取的教训。谢谢!
    • 是的,它告诉 Python 使用浮点除法。您可以使用from __future__ import division - stackoverflow.com/questions/1267869/… 默认启用浮点除法。您可能会发现这篇文章对于居中小部件很有用 - blog.pythonlibrary.org/2015/02/19/…
    【解决方案2】:

    结合上面 Mike Driscoll 的修正,我改变了间隔的方式,结果证明工作量更少。我取出了水平尺寸器,因为我发现它们是不需要的,除非我要在同一行上放置两个东西,并且我添加了拉伸垫片而不是巨大的边框。这是新代码,它看起来正是我想要的:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2015-02-01
      • 2014-11-23
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多