私はwx.Pythonで作業しており、wx.ListCtrlの列のサイズを自動変更します。つまり、最小で列名の幅にし、それ以外の場合は最も幅の広い要素またはその列名と同じ幅にします。最初はListCtrlAutoWidthMixinがこれを行うかもしれないと思っていましたが、そうではないので、自分で行う必要があるようです(これを行う方法が組み込まれている場合は、修正してください!!!)
リストのタイトルと要素がどのくらいの幅でレンダリングされるかを知るにはどうすればよいですか?
jakeparsの回答に加えて、これは、ヘッダーが大きいかどうか、または列で最もスペースを占めるアイテムかどうかを確認する必要があります。エレガントではありませんが、機能しています...
import wx
class Frame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.list = wx.ListCtrl(self, style=wx.LC_REPORT)
items = ['A', 'b', 'something really REALLY long']
self.list.InsertColumn(0, "AAAAAAAAAAAAAAAAAAAAAAAA")
for item in items:
self.list.InsertStringItem(0, item)
self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
a = self.list.GetColumnWidth(0)
print "a " + str(a)
self.list.SetColumnWidth(0,wx.LIST_AUTOSIZE_USEHEADER)
b = self.list.GetColumnWidth(0)
print "b " + str(b)
if a>b:
print "a is bigger"
self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
app = wx.App(False)
frm = Frame(None, title="ListCtrl test")
frm.Show()
app.MainLoop()
wx.ListCtrlに関連する多くの頭痛の種を避けたい場合は、ObjectListViewの使用に切り替える必要があります(コード例のための優れたクックブックとフォーラムがあります)。これは非常に優れており、非常に強力で柔軟性があり、コーディングが簡単なため、非常に基本的なListCtrl以外にも使用する傾向があります。これに関連するwxPyWikiページ(サンプルコードを含む)があります。開発者はwxPythonメーリングリストにも参加しているので、質問をメールで送信できます。
はい、これはwx.ListCtrl用に自分で作成する必要がありますが、正しく実行するのが簡単(またはエレガント)かどうかはわかりません。
wx.Gridの使用を検討してください。これは、作業を開始するための小さな例です。
import wx, wx.grid
class GridData(wx.grid.PyGridTableBase):
_cols = "This is a long column name,b,c".split(",")
_data = [
"1 2 3".split(),
"4,5,And here is a long cell value".split(","),
"7 8 9".split()
]
def GetColLabelValue(self, col):
return self._cols[col]
def GetNumberRows(self):
return len(self._data)
def GetNumberCols(self):
return len(self._cols)
def GetValue(self, row, col):
return self._data[row][col]
class Test(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
grid = wx.grid.Grid(self)
grid.SetTable(GridData())
grid.EnableEditing(False)
grid.SetSelectionMode(wx.grid.Grid.SelectRows)
grid.SetRowLabelSize(0)
grid.AutoSizeColumns()
app = wx.PySimpleApp()
app.TopWindow = Test()
app.TopWindow.Show()
app.MainLoop()
これは私のために働く
import wx
class Frame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.list = wx.ListCtrl(self, style=wx.LC_REPORT)
items = ['A', 'b', 'something really REALLY long']
self.list.InsertColumn(0, "AA")
for item in items:
self.list.InsertStringItem(0, item)
self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
app = wx.App(False)
frm = Frame(None, title="ListCtrl test")
frm.Show()
app.MainLoop()