【问题标题】:Setting up Sizers in wxPython在 wxPython 中设置 Sizer
【发布时间】:2021-06-09 01:44:49
【问题描述】:

我在使用 sizers 设置布局时遇到问题。将有 7 个“胶囊”,其中包含用于信息的 wx.StaticTex、用于用户输入的 wx.TextCtrl 和用于视觉效果的右侧图标。如果我想更详细一点,我想为 StaticText 留出“更多空间”,或者我可以选择更小的字体:

这就是我现在得到的:

这是我的代码:

import wx

class ParametersWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(ParametersWindow, self).__init__(*args, **kwargs)

        self.SetSize((400, 600))
        self.SetTitle(f'{SOFTWARE_NAME}')
        self.Center()

        self.Bind(wx.EVT_CLOSE, self.OnCloseApp)
        self.setupTextFields()

def setupTextFields(self):
    """ Constroi as caixinhas de texto. """

    self.textBoxesRefs = []

    vWrapperBox = wx.BoxSizer(wx.VERTICAL)

    for i in range(0, 7):
        text = self.getTextCtrl()
        text.Bind(wx.EVT_TEXT, self.OnKeyTyped)
        self.textBoxesRefs.append(text)

        vBox = self.getVerticalBox()
        vBox.Add(self.getStaticText(self.getLabel(i)))
        vBox.Add(text, flag=wx.EXPAND | wx.ALL)

        hBox = self.getHorizontalBox()
        hBox.Add(vBox, flag=wx.EXPAND | wx.ALL)

        image = wx.StaticBitmap(self, wx.ID_ANY)
        image.SetBitmap(wx.Bitmap('icons/test.png'))
        hBox.Add(image, flag=wx.EXPAND | wx.ALL)

        vWrapperBox.Add(hBox, flag=wx.EXPAND | wx.ALL)

    self.SetSizerAndFit(vWrapperBox)

def getVerticalBox(self):
    """ Retorna a referencia de uma wx.BoxSizer(wx.VERTICAL). """

    return wx.BoxSizer(wx.VERTICAL)

def getHorizontalBox(self):
    """ Retorna a referencia de uma wx.BoxSizer(wx.HORIZONTAL). """

    return wx.BoxSizer(wx.HORIZONTAL)

def getStaticText(self, label):
    """ Retorna a referencia de uma wx.StaticText(). """

    return wx.StaticText(self, label = label)

def getTextCtrl(self):
    """ Retorna a referencia de um wx.TextCtrl. """

    return wx.TextCtrl(self)

def getBitmap(self, path):
    """ Retorna a referencia de um wx.Bitmap(). """

    return wx.Bitmap(path)

它是“可保存的”吗?

谢谢!

【问题讨论】:

  • 你有什么问题?看起来你有一些有用的东西。您是在问如何使所有行的大小相同?
  • @TimRoberts 是的,很抱歉造成混乱。在我的脑海中,图像会在最右边,而 staticText 和 textCtrl 的大小都是一样的。
  • 我想也许您正在寻找的是wxFlexGridSizer?假设我正确理解了您的问题...这是 C++ 链接,但我认为让 Python 版本正常工作很容易。您还可以为 wxTextBox 传递一个恒定的宽度大小吗?
  • 谢谢,@segmentation_fault。将sizer放在东西上为我完成了交易。 :)

标签: python user-interface wxwidgets


【解决方案1】:

我想我现在达到了最好的结果。将尺码放在“东西”上是关键!

PS:我去掉了不必要的代码。

def setupTextFields(self):
    """ Constroi as caixinhas de texto. """

    self.textBoxesRefs = []

    vWrapperBox = wx.BoxSizer(wx.VERTICAL)

    for i in range(0, 7):
        text = self.getTextCtrl()
        text.Bind(wx.EVT_TEXT, self.OnKeyTyped)
        self.textBoxesRefs.append(text)

        vBox = self.getVerticalBox()
        vBox.Add(self.getStaticText(self.getLabel(i)))
        vBox.Add(text)
        vBox.SetMinSize(300, 40)

        hBox = self.getHorizontalBox()
        hBox.Add(vBox, flag=wx.ALL, border=5)

        image = wx.StaticBitmap(self, wx.ID_ANY)
        image.SetBitmap(wx.Bitmap('icons/test.png'))
        hBox.Add(image)
        vWrapperBox.Add(hBox)

    self.SetSizerAndFit(vWrapperBox)

def getTextCtrl(self):
    """ Retorna a referencia de um wx.TextCtrl. """

    return wx.TextCtrl(self, size=(100, 20))

可以更好吗?当然!

但就目前而言,这就足够了。 谢谢大家。

【讨论】:

  • 通过在添加到sizer时使用“拉伸比”参数,可以使文本框拉伸整个宽度。这对我来说会更好看,但这是个人喜好。
  • @Tim 看起来真的更好看。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多