wxPython StaticText转义嵌套BoxSizer

问题描述 投票:1回答:1

全披露:我是wxpython的新手(大约3天),我不太了解boxsizer的优点。

我正在编写GUI来显示照片和有关此照片的一些相关详细信息。我正在使用框大小调整器在主选项卡上水平显示3个“部分”。最左边的项目是图像预览,中间的项目显示一些信息,最右边的项目具有StaticText标题和两个单选按钮。以某种方式,StaticText似乎正在逃避其BoxSizer。我给不同的部分上了颜色,以使其更加明显:escaped panel item

这是代码的相关部分:

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.loadContents()

    def loadContents(self):
        self.loadPreview()
        self.loadImageInfo()
        self.loadColorOptions()

        row0 = wx.BoxSizer(wx.HORIZONTAL)
        row0.Add(self.preview, 1, wx.LEFT, 5)
        row0.Add(self.imageInfo, 1, wx.EXPAND , 5)
        row0.Add(self.colorPanel, 1, wx.EXPAND, 5)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(row0)
        self.SetSizer(sizer)

    def loadColorOptions(self):
        panel = wx.Panel(self)
        panel.SetBackgroundColour((230,230,230))
        self.title = wx.StaticText(self, label="Options", style=wx.TE_READONLY | wx.TE_MULTILINE)
        self.radioButtonColor = wx.RadioButton(panel, label="Color", style=wx.RB_GROUP)
        self.radioButtonGray = wx.RadioButton(panel, label="Grayscale")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.title, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.radioButtonColor, 0, wx.ALL, 5)
        sizer.Add(self.radioButtonGray, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

        self.colorPanel = panel

以及全文:

import wx 
from wx.lib.wordwrap import wordwrap
import os

from mock_utils import *

ICON_STR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'flower.ico')
INITIAL_SIZE_X = 1000
INITIAL_SIZE_Y = 700
SCALE_RATIO = 100
PREVIEW_SIZE = [4*SCALE_RATIO, 3*SCALE_RATIO] # 4:3
TITLE="Photo GUI"

class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.loadContents()

    def loadContents(self):
        self.loadPreview()
        self.loadImageInfo()
        self.loadColorOptions()

        row0 = wx.BoxSizer(wx.HORIZONTAL)
        row0.Add(self.preview, 1, wx.LEFT, 5)
        row0.Add(self.imageInfo, 1, wx.EXPAND , 5)
        row0.Add(self.colorPanel, 1, wx.EXPAND, 5)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(row0)
        self.SetSizer(sizer)

    def loadColorOptions(self):
        panel = wx.Panel(self)
        panel.SetBackgroundColour((230,230,230))
        self.title = wx.StaticText(self, label="Options", style=wx.TE_READONLY | wx.TE_MULTILINE)
        self.radioButtonColor = wx.RadioButton(panel, label="Color", style=wx.RB_GROUP)
        self.radioButtonGray = wx.RadioButton(panel, label="Grayscale")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.title, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.radioButtonColor, 0, wx.ALL, 5)
        sizer.Add(self.radioButtonGray, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

        self.colorPanel = panel

    def loadPreview(self):
        fname = getImage()
        self.imageInfo = getImageInfo(fname)
        if fname is not None:
            img = wx.Image(fname, wx.BITMAP_TYPE_ANY)
            img = img.Scale(PREVIEW_SIZE[0],PREVIEW_SIZE[1], wx.IMAGE_QUALITY_HIGH)
        else:
            img = wx.Image(PREVIEW_SIZE)

        self.preview = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(img))

    def loadImageInfo(self):
        imgInfo = wx.StaticText(self, style=wx.TE_READONLY | wx.TE_MULTILINE)
        infoStr = wordwrap("Filename:\n" + "\t" + self.imageInfo.get("name") + \
                "\nSettings:\n" + "\t" + "Exposure: " + self.imageInfo.get("exposure") + \
                           "\n" + "\t" + "Focus: " + self.imageInfo.get("focus"), 350, wx.ClientDC(self))

        imgInfo.SetLabel(infoStr)
        imgInfo.SetBackgroundColour("yellow")
        self.imageInfo = imgInfo

class Panel2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)

class PhotoGuiFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, title=TITLE, size=(INITIAL_SIZE_X,INITIAL_SIZE_Y))
        self.SetIcon(wx.Icon(ICON_STR, wx.BITMAP_TYPE_ICO, 16, 16))
        self.Center() # center gui on screen

        self.loadPanels()

    def loadPanels(self):

        p = wx.Panel(self)
        dock = wx.Notebook(p)
        main_panel = MainPanel(dock)
        panel2 = Panel2(dock)

        dock.AddPage(main_panel, "Tab1")
        dock.AddPage(panel2, "Tab2")

        sizer = wx.BoxSizer()
        sizer.Add(dock, 1, wx.EXPAND)
        p.SetSizer(sizer)


if __name__ == "__main__":
    app = wx.App()
    frame = PhotoGuiFrame().Show()
    app.MainLoop()

还有一个基本的mock_utils.py,如果您需要一个最小的“有效”示例(将显示一个空白框而不是加载图像):

pth1 = "/home/wxnewbie/Desktop/gui/test/images/img"

def getImage():
    return None

def getImageInfo(fname):
    return {"name": pth1+"2.tif", "exposure":"1.5ms", "focus":"automatic"}

我完全不知道为什么StaticText逃避BoxSizer。我唯一能想到的是,我需要摆脱它所附接的面板(在这种情况下,我是否要返回sizer本身?)。但是随后我遇到了大小调整器中的项完全消失的麻烦,所以我认为我只是缺少一些有关大小调整器应该如何工作的基本信息。

wxpython boxsizer
1个回答
0
投票

这是一个经典的监督问题。您将self.title放置在面板中的self中。

这应该可以解决问题。

self.title = wx.StaticText(panel, label="Options", style=wx.TE_READONLY | wx.TE_MULTILINE)

© www.soinside.com 2019 - 2024. All rights reserved.