Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython--Boxsizer没有正确放置东西_Python_User Interface_Wxpython_Boxsizer - Fatal编程技术网

wxPython--Boxsizer没有正确放置东西

wxPython--Boxsizer没有正确放置东西,python,user-interface,wxpython,boxsizer,Python,User Interface,Wxpython,Boxsizer,我不知道我做错了什么。我刚从Tkinter跳到wxPython,我想弄清楚BoxSizers。我会查这个问题,但我甚至不知道该查什么。这个面板填充了一个框架的空间,它应该显示一行文本,下面有一个进度条,所有这些都应该占据面板底部的1/5左右,水平居中(最终我要在它后面添加一个背景图像)。但实际情况是,我只看到文本,从顶部向下只看到大约40%,与窗口的左边缘对齐。代码如下: class KhPanel(wx.Panel): def __init__(self, parent, configSet

我不知道我做错了什么。我刚从Tkinter跳到wxPython,我想弄清楚BoxSizers。我会查这个问题,但我甚至不知道该查什么。这个面板填充了一个框架的空间,它应该显示一行文本,下面有一个进度条,所有这些都应该占据面板底部的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)。在本例中,选择Window是“configWindow”

运行此代码时,
gaugeWidth
GaugeHight
都被设置为零,这就是进度条不显示的原因。这是因为你在做整数运算,所以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的修正,我改变了间隔的方式,结果减少了工作量。我拿出了水平尺寸器,因为我发现它们不需要,除非我要在同一行上隔开两个东西,我添加了拉伸间隔器,而不是巨大的边框。这是新代码,它看起来正是我想要的:

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

你说得对,这就是问题所在。我对topBuffer和itemSep也做了同样的操作,现在它们也开始工作了,尽管我仍然有一些调整,因为progressbar最终位于顶部,我不确定为什么,小部件没有水平居中,这是我认为ALIGN_CENTER所做的。啊,好吧,我可以拿着这些小题大做。为什么Python需要在整数的末尾加上.0?0是否告诉它答案将是浮点?调试规则#1:测试变量——第500次的经验教训。谢谢是的,它告诉Python使用浮点除法。您可以使用来自uuu future\uuuu import division的
启用默认浮点除法。您可能会发现本文对于集中小部件很有用-