【问题标题】:Make the cell fit the text (and make it read-only)使单元格适合文本(并使其只读)
【发布时间】:2023-03-25 03:33:01
【问题描述】:

我开始使用 TkinterTable 并且正在逐步使用 Tkinter 功能,所以我很菜鸟。我正在尝试显示来自某些来源的一些数据,但我担心单元格似乎比文本短,我找不到使单元格适合文本大小的方法。这是我的代码:

from tkinter import *
from tkintertable import TableCanvas, TableModel

data = {'1': {'Source': 'OB', 'Campaign': 'X7765LKBTYYU-TAB-US', 'Impr.': 9457123, 'CTR': '0.12%', 'Spent': 45.78},
       '2': {'Source': 'OB', 'Campaign': 'X6159TNFYTHY-PHONE-US-A', 'Impr.': 5456953, 'CTR': '0.27%', 'Spent': 12.52},
       '3': {'Source': 'OB', 'Campaign': 'X7765LGKJHYRT-TAB-US', 'Impr.': 9457123, 'CTR': '0.12%', 'Spent': 45.78},
       '4': {'Source': 'OB', 'Campaign': 'X6159FTJKYUKKX-PHONE-US-A', 'Impr.': 5456953, 'CTR': '0.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()

顺便说一句,这不是我的主要问题,但如果您有快速解决方案,我们将不胜感激。您会注意到我在 TableCanvas 中设置了“editable=False”,但这似乎并没有使单元格成为只读,我仍然可以编辑它们。知道为什么吗?

谢谢你,

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案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 方法似乎无法正确处理长字符串(可能是特定于平台的?)。不用深入研究,最简单的方法是覆盖该方法:

    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,它应该可以按预期工作。

    【讨论】:

    • 感谢您的回答。事实上,“read_only”做到了。但是今天下午我看了一下“adjustColumnWidths”,但我不知道如何应用它。我尝试了几件事,但它一直告诉我“adjustColumnWidths”没有定义。对于可编辑的,它在文档中。
    • 看样子应该就是table.adjustColumnWidths()table.autoResizeColumns()
    • 我试过了,但它似乎没有用:table.adjustColumnWidths() table.autoResizeColumns() table.redraw()
    • 你就是男人。非常感谢。
    • 第二次看我意识到maxcellwidth 实际上是一个实现。如果您不喜欢这个限制,您可以按照上面的编辑将其注释掉,并相应地增加大小以获得更通用的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多