كيف يمكنني الحصول على عرض WX.ListCtrl واسم العمود الخاص به؟

StackOverflow https://stackoverflow.com/questions/722298

سؤال

أنا أعمل في WX.Python وأريد الحصول على أعمدة My WX.ListCtrl لتغيير حجمها التلقائي ليكون في الحد الأدنى لعرض اسم العمود وغير ذلك تماما كأوسع عنصر أو اسم العمود. في البداية اعتقدت أن ListCtrlautowidthmixin قد يفعل ذلك، لكنه لا يكون الأمر كذلك، فقد علي فعل ذلك بنفسي (يرجى تصحيح لي إذا كان هناك طريقة مبنية للقيام بذلك !!!

كيف يمكنني معرفة مدى عرض ألقاب وعناصر قائمتي؟

هل كانت مفيدة؟

المحلول

نعم، عليك أن تجعل هذا بنفسك ل 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()

نصائح أخرى

بالإضافة إلى إجابة 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 حتى تتمكن من إرسال بريد إلكتروني مع الأسئلة.

هذا يعمل بالنسبة لي

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top