首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython -- BoxSizers没有正确地放置东西

wxPython -- BoxSizers没有正确地放置东西
EN

Stack Overflow用户
提问于 2015-03-06 07:18:55
回答 2查看 67关注 0票数 0

我不知道我做错了什么。我刚从Tkinter跳到了wxPython,我正在努力找出BoxSizers。我想查查这个问题,但我甚至不知道该查什么。这个面板填充了一个框架的空间,它应该显示一行文字,在它下面有一个进度条,所有这些都应该占据面板底部的1/5左右,水平居中(最终我将在它后面添加一个背景图像)。但结果是,我只看到文本,只有大约40%从顶部向下,对齐窗口的左边边缘。下面是代码:

代码语言:javascript
复制
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和高度是父窗口的宽度和高度(当前为340x270)。在这种情况下,selectWindow是"configWindow“

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 17:08:52

运行这段代码时,gaugeWidthgaugeHeight都被设置为零,这就是为什么没有显示进度条的原因。这是因为你在这里做整数运算,所以1除以5等于0。与1/10相同。只需将这些行更改为:

代码语言:javascript
复制
gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]

然后计量器就会出现。下面是一些完全可运行的代码,稍微修改一下无法运行的原始代码:

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2015-03-06 18:21:56

结合上面的Mike的修正,我改变了间隔的方式,结果它的工作量减少了。当我发现没有必要的时候,我拿出了水平尺寸,除非我要把两样东西放在同一行上,我增加了伸展间隔,而不是巨大的边框。这是新代码,它看上去就像我想要的那样:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28893930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档