wxpython中的多行复选框

2024-09-28 03:14:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用wxpython(2.8)和python2.5。 是否可以强制wx.wx复选框在多个 线? 我希望能做同样的事wx.StaticText.Wrap(宽度)

参见所附示例:thewx.复选框宽200像素,但是 标签不适合此空间。在

非常感谢任何帮助! 谢谢 毛罗

#example starts here

import wx


class MyFrame(wx.Frame):
   def __init__(self):
       wx.Frame.__init__(self,  None, title="Hello World", size=
(300,200))

       self.panel = wx.Panel(self,  -1)
       myVSizer = wx.BoxSizer(wx.VERTICAL)

       #instantiating a checkbox 200 px wide. but the label is too
long
       cb = wx.CheckBox(self.panel,  -1,  label="This is a very very
long label for 200 pixel wide cb!",  size =wx.Size(200, -1))

       myVSizer.Add( cb, 1)

       self.panel.SetSizer(myVSizer)
       myVSizer.Layout()


app = wx.App(redirect=True)
top = MyFrame()
top.Show()
app.MainLoop()

Tags: selfsizeinitisframelabellong复选框
3条回答

像这样的怎么样?弯曲! (我把它变成了一个单选按钮,以显示它的行为仍然像一个)

import wx
import textwrap

class MultilineRadioButton(wx.RadioButton):
        def __init__(self, parent, id=-1, label=wx.EmptyString, wrap=10, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name=wx.RadioButtonNameStr):
            wx.RadioButton.__init__(self,parent,id,'',pos,size,style,validator,name)
            self._label = label
            self._wrap = wrap
            lines = self._label.split('\n')
            self._wrappedLabel = []
            for line in lines:
                self._wrappedLabel.extend(textwrap.wrap(line,self._wrap))

            self._textHOffset = 20
            dc = wx.ClientDC(self)
            font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
            dc.SetFont(font)
            maxWidth = 0
            totalHeight = 0
            lineHeight = 0
            for line in self._wrappedLabel:
                width, height = dc.GetTextExtent(line)
                maxWidth = max(maxWidth,width)
                lineHeight = height
                totalHeight += lineHeight 

            self._textHeight = totalHeight

            self.SetInitialSize(wx.Size(self._textHOffset + maxWidth,totalHeight))
            self.Bind(wx.EVT_PAINT, self.OnPaint)

        def OnPaint(self, event):
            dc = wx.PaintDC(self)
            self.Draw(dc)
            self.RefreshRect(wx.Rect(0,0,self._textHOffset,self.GetSize().height))
            event.Skip()

        def Draw(self, dc):
            dc.Clear()
            font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
            dc.SetFont(font)
            height = self.GetSize().height
            if height > self._textHeight:
                offset = height / 2 - self._textHeight / 2
            else:
                offset = 0
            for line in self._wrappedLabel:
                width, height = dc.GetTextExtent(line)
                dc.DrawText(line,self._textHOffset,offset)
                offset += height


class HFrame(wx.Frame):
   def __init__(self,pos=wx.DefaultPosition):
       wx.Frame.__init__(self,None,title="Hello World",size=wx.Size(600,400),pos=pos)

       self.panel = wx.Panel(self,-1)
       sizer = wx.BoxSizer(wx.HORIZONTAL)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       self.panel.SetSizer(sizer)
       sizer.Layout()


class VFrame(wx.Frame):
   def __init__(self,pos=wx.DefaultPosition):
       wx.Frame.__init__(self,None,title="Hello World",size=wx.Size(600,400),pos=pos)

       self.panel = wx.Panel(self,-1)
       sizer = wx.BoxSizer(wx.VERTICAL)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       cb = RadioButton(self.panel,-1,label="This is a very very long label for the control!",wrap=10)
       sizer.Add(cb,1)

       self.panel.SetSizer(sizer)
       sizer.Layout()


app = wx.App(redirect=False)
htop = HFrame(pos=wx.Point(0,50))
htop.Show()
vtop = VFrame(pos=wx.Point(650,50))
vtop.Show()
app.MainLoop()

不要使用文本的复选框,而是使用静态文本的无标签复选框来获得所需的效果

import wx


class MyFrame(wx.Frame):
   def __init__(self):
      wx.Frame.__init__(self,  None, title="Hello World", size=(300,200))

      self.panel = wx.Panel(self,  -1)
      myVSizer = wx.BoxSizer(wx.VERTICAL)

      # use checkbox + static text to wrap the text
      myHSizer = wx.BoxSizer(wx.HORIZONTAL)
      cb = wx.CheckBox(self.panel,  -1,  label="")
      label = wx.StaticText(self.panel, label="This is a very very long label for 100 pixel wide cb!", size=(100,-1))
      label.Wrap(100)
      myHSizer.Add(cb, border=5, flag=wx.ALL)
      myHSizer.Add(label, border=5, flag=wx.ALL)

      myVSizer.Add(myHSizer)

      self.panel.SetSizer(myVSizer)
      myVSizer.Layout()


app = wx.App(redirect=True)
top = MyFrame()
top.Show()
app.MainLoop()

这增加了一个好处,即使用不同的布局,您可以使文本居中到复选框,或在左侧或右侧或任何其他位置

将标签更改为

label="This is a very very\n long label for 200\n pixel wide cb!"

应该这么做。在

也就是说,输入显式的\n字符。在

alt text

相关问题 更多 >

    热门问题