修改wx Python的agw LabelBook的左标签样式的最小宽度?

时间:2015-01-06 00:45:20

标签: python wxpython wxwidgets

我正在尝试使用wx Python的AGW LabelBook(使用wxPython 2.8.11.0,Python 2.7.1 +,Ubuntu 11.04),这样选项卡(列表)是左对齐的;这里我有一些简短的文本,我期望tablist区域的宽度会相应缩短;但我得到了这个:

test.png

在那个鼠标位置,我得到一个sizer指针 - 我可以将它向右拖动以增加tablist区域的宽度,就像我想要的那样;但我不能向左拖动它,以使宽度更短。我也尝试使用INB_FIT_LABELTEXT,但它似乎没有改变任何东西......

是否有可能以某种方式指示LabelBook将左侧选项卡区域的最小宽度设置为文本的近似宽度(例如,在绘制的红线处指示)?

这是我用来生成屏幕截图的代码:

import wx
import wx.lib.agw
import wx.lib.agw.labelbook as LB
from wx.lib.agw.fmresources import *

class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, -1, "Labelbook test")

    self.tlbook = LB.LabelBook(self, -1, size=(400, 200), style = wx.NB_LEFT, agwStyle = INB_LEFT | INB_FIT_LABELTEXT | INB_FIT_BUTTON | INB_SHOW_ONLY_TEXT | INB_USE_PIN_BUTTON)
    sizer_1 = wx.BoxSizer(wx.VERTICAL)
    self.tlbook_panel_1 = wx.Panel(self.tlbook)
    self.tlbook_panel_2 = wx.Panel(self.tlbook)
    self.tlbook.AddPage(self.tlbook_panel_1, "Test 1")
    self.tlbook.AddPage(self.tlbook_panel_2, "Test 2")
    sizer_1.Add(self.tlbook, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_1)
    sizer_1.Fit(self)
    self.SetSize((450, 250))
    self.Layout()

app = wx.App(0)

frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()

app.MainLoop()

1 个答案:

答案 0 :(得分:0)

好的,我想我明白了:

test.png

...事实上,标签区域的宽度在LabelBook的源代码中被硬编码为100像素,但不是全部在同一个类中 - 所以如果想要离开源代码,则需要进行一些monkeypatching完整。这是代码:

import wx
import wx.lib.agw
import wx.lib.agw.labelbook as LB
#~ from wx.lib.agw.labelbook import * # for INB_BOLD_TAB_SELECTION = 16384? nope
INB_BOLD_TAB_SELECTION = 16384
from wx.lib.agw.fmresources import *

WIDTHLIMITPIX=20

class OLabelContainer(LB.LabelContainer): # overloaded version
  def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelContainer"):
    super(OLabelContainer, self).__init__(parent, id, pos, size, style, agwStyle, name)
  def Resize(self, event): # copy from wx/lib/agw/labelbook.py
    # Resize our size
    self._tabAreaSize = self.GetSize()
    newWidth = self._tabAreaSize.x
    x = event.GetX()
    if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT):
      newWidth -= event.GetX()
    else:
      newWidth = x
    # hack: was 100 here
    if newWidth < WIDTHLIMITPIX: #100: # Dont allow width to be lower than that
      newWidth = WIDTHLIMITPIX #100
    self.SetSizeHints(newWidth, self._tabAreaSize.y)
    # Update the tab new area width
    self._nTabAreaWidth = newWidth
    self.GetParent().Freeze()
    self.GetParent().GetSizer().Layout()
    self.GetParent().Thaw()

LB.LabelContainer = OLabelContainer # do monkeypatch old class

class MyLabelBook(LB.LabelBook):
  def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelBook"):
    super(MyLabelBook, self).__init__(parent, id, pos, size, style, agwStyle, name)
    self._fontSizeMultiple = 1.0
    self._fontBold = False
    print(self._pages) # is OLabelContainer, OK
  def GetFontBold(self):    # copy from wx/lib/agw/labelbook.py
      return self._fontBold
  def ResizeTabArea(self):  # copy from wx/lib/agw/labelbook.py
    agwStyle = self.GetAGWWindowStyleFlag()
    if agwStyle & INB_FIT_LABELTEXT == 0:
      return
    if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
      dc = wx.MemoryDC()
      dc.SelectObject(wx.EmptyBitmap(1, 1))
      font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
      font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple)
      if self.GetFontBold() or agwStyle & INB_BOLD_TAB_SELECTION:
        font.SetWeight(wx.FONTWEIGHT_BOLD)
      dc.SetFont(font)
      maxW = 0
      for page in xrange(self.GetPageCount()):
        caption = self._pages.GetPageText(page)
        w, h = dc.GetTextExtent(caption)
        maxW = max(maxW, w)
      maxW += 24 #TODO this is 6*4 6 is nPadding from drawlabel
      if not agwStyle & INB_SHOW_ONLY_TEXT:
        maxW += self._pages._nImgSize * 2
      maxW = max(maxW, WIDTHLIMITPIX) # hack: was 100 here
      self._pages.SetSizeHints(maxW, -1)
      self._pages._nTabAreaWidth = maxW


class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, -1, "Labelbook test")

    self.tlbook = MyLabelBook(self, -1, size=(400, 200), style = wx.NB_LEFT, agwStyle = INB_LEFT | INB_FIT_LABELTEXT | INB_FIT_BUTTON | INB_SHOW_ONLY_TEXT | INB_USE_PIN_BUTTON)
    sizer_1 = wx.BoxSizer(wx.VERTICAL)
    self.tlbook_panel_1 = wx.Panel(self.tlbook)
    self.tlbook_panel_2 = wx.Panel(self.tlbook)
    self.tlbook.AddPage(self.tlbook_panel_1, "Test 1")
    self.tlbook.AddPage(self.tlbook_panel_2, "Test 2")
    sizer_1.Add(self.tlbook, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_1)
    sizer_1.Fit(self)
    self.SetSize((450, 250))
    self.Layout()

app = wx.App(0)

frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()

app.MainLoop()