tkintertable: сделать ячейку подходящей для текста (и сделать ее доступной только для чтения)

Я начал использовать TkinterTable, и я пошаговый в функциональности Tkinter, так что я очень нуб. Я пытаюсь отобразить некоторые данные из некоторых источников, но меня беспокоит то, что ячейки кажутся короче текста, и я не могу найти способ, чтобы ячейки соответствовали размеру текста. Вот мой код:

from tkinter import *
from tkintertable import TableCanvas, TableModel

data = {Ƈ': {'Source': 'OB', 'Campaign': 'X7765LKBTYYU-TAB-US', 'Impr.': 9457123, 'CTR': Ɔ.12%', 'Spent': 45.78},
       ƈ': {'Source': 'OB', 'Campaign': 'X6159TNFYTHY-PHONE-US-A', 'Impr.': 5456953, 'CTR': Ɔ.27%', 'Spent': 12.52},
       Ɖ': {'Source': 'OB', 'Campaign': 'X7765LGKJHYRT-TAB-US', 'Impr.': 9457123, 'CTR': Ɔ.12%', 'Spent': 45.78},
       Ɗ': {'Source': 'OB', 'Campaign': 'X6159FTJKYUKKX-PHONE-US-A', 'Impr.': 5456953, 'CTR': Ɔ.27%', 'Spent': 12.52}
       } 

root= Tk()
tframe = Frame(root)
tframe.pack()
model = TableModel()
table = TableCanvas(tframe, model=model, data=data, editable=False, width=800, height=300)
table.show()
root.mainloop()

Кстати, не моя главная проблема, но если у вас есть быстрое решение, это будет оценено. Вы заметите, что у меня есть «editable = False» в TableCanvas, но это не делает ячейку доступной только для чтения, я все еще могу редактировать их. Есть идеи почему?

Спасибо,

введите описание изображения здесь

Всего 1 ответ


Беглый взгляд на источник py:

class TableCanvas(Canvas):
    """A tkinter class for providing table functionality"""

    def __init__(self, parent=None, model=None, data=None, read_only=False,
                 width=None, height=None,
                 rows=10, cols=5, **kwargs):
    ...

    def adjustColumnWidths(self):
        """Optimally adjust col widths to accomodate the longest entry
            in each column - usually only called  on first redraw"""

        ...

    def autoResizeColumns(self):
        """Automatically set nice column widths and draw"""

        ...

По первому вопросу, похоже, что метод adjustColumnWidths длинные строки (может быть, adjustColumnWidths платформы?). Не углубляясь в это, проще всего переписать метод:

class CustomCanvas(TableCanvas):
    def adjustColumnWidths(self):
        try:
            fontsize = self.thefont[1]
        except:
            fontsize = self.fontsize
        scale = 8.5 * float(fontsize)/12
        for col in range(self.cols):
            colname = self.model.getColumnName(col)
            if colname in self.model.columnwidths:
                w = self.model.columnwidths[colname]
            else:
                w = self.cellwidth
            maxlen = self.model.getlongestEntry(col)
            size = maxlen * scale
            if size < w:
                continue
            #if size >= self.maxcellwidth:
            #    size = self.maxcellwidth
            self.model.columnwidths[colname] = size*1.2 #I changed the calculation to a static float
        return

А затем используйте CustomCanvas в качестве замены вашего TableCanvas .

Для редактируемой части, не уверен, откуда у вас идея передать editable в качестве параметра. Если вы используете read_only=True он должен работать так, как вы ожидали.


Есть идеи?

10000