Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使单元格适合文本(并使其只读)_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 使单元格适合文本(并使其只读)

Python 使单元格适合文本(并使其只读),python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我开始使用TkinterTable,我正在逐步学习Tkinter的功能,所以我非常喜欢它。我试图显示一些来源的数据,但我担心的是单元格似乎比文本短,我无法找到使单元格适合文本大小的方法。这是我的密码: from tkinter import * from tkintertable import TableCanvas, TableModel data = {'1': {'Source': 'OB', 'Campaign': 'X7765LKBTYYU-TAB-US', 'Impr.': 945

我开始使用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”,但这似乎并没有使单元格成为只读的,我仍然可以编辑它们。知道为什么吗

谢谢,


快速查看源代码:

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
class CustomCanvas(TableCanvas):
def调整柱宽(自):
尝试:
fontsize=self.thefont[1]
除:
fontsize=self.fontsize
比例=8.5*浮动(字体大小)/12
对于范围内的列(self.cols):
colname=self.model.getColumnName(col)
如果self.model.columnwidths中的colname为:
w=self.model.columnwidths[colname]
其他:
w=自宽
maxlen=self.model.getLongesEntry(col)
大小=最大*刻度
如果尺寸小于w:
持续
#如果大小>=self.maxcellwidth:
#大小=self.maxcellwidth
self.model.columnwidths[colname]=size*1.2#我将计算更改为静态浮点
返回
然后使用
CustomCanvas
替换您的
TableCanvas


对于可编辑零件,不确定从何处获得将
editable
作为参数传递的想法。如果您使用的是
read_only=True
,它应该会像您预期的那样工作。

谢谢您的回答。事实上,“只读”做到了这一点。但是今天下午我看了“adjustColumnWidths”,但是我不知道如何应用它。我尝试了一些方法,但它一直告诉我“adjustColumnWidths”没有定义。对于可编辑的,它在文档中。从外观上看,应该只是
table.adjustColumnWidths()
table.autoResizeColumns()
。我试过了,但似乎不起作用:table.adjustColumnWidths()table.autoResizeColumns()table.redraw()你就是那个人。非常感谢。在第二次查看时,我意识到
maxcellwidth
实际上是一个实现。如果你不喜欢这个限制,你可以按上面编辑的那样注释掉它,并相应地增加大小,以获得更通用的搜索。