使用Tkinter通过Django测量字体时TclError超出堆栈空间错误

时间:2014-11-13 00:12:30

标签: python django fonts tkinter width

我有一个用户可以用来导出Excel表格的网络界面。我的服务器端代码是用Python / Django编写的。由于我不能在没有服务器实际打开Excel并在那里运行它的情况下自动更新列,我决定计算列应该的宽度,然后根据使用XlsxWriter的计算调整它们的大小。这样做很漂亮,除了一件事:每隔一段时间,我的导出例程会抛出一个TclError,说“堆栈空间不足(无限循环?)”。这是引起问题的一行:

length = font.measure(s)

在tkFont.py中导致问题的行是:

return int(self._call("font", "measure", self.name, text))

我一直在玩Tk初始化的地方,现在我把它放在根urls.py

除此之外,我所做的只是定义粗体字体和普通字体,然后用它们来测量字符串的宽度(以像素为单位)。

我读到Tkinter不是线程安全的,所以我试图确保Tkinter方法无法同时运行,所以我在settings.py中将一个布尔值初始化为True,称为CANUSETK,我用它来阻止措施方法在被设置为false时被调用。这只是最近的一次尝试,试图让血腥的东西随意停止崩溃。

相关代码:

在urls.py中:

settings.TKROOT = tk.Tk()
settings.BOLDFONT = tkFont.Font(family="arial", size=10, weight="bold")
settings.NORMALFONT = tkFont.Font(family="arial", size=10)

在XlsxWriter文件中,该文件包含用于在将数据写入工作表时跟踪列宽的类(这些方法不在类本身中):

def measure(font, s): #The font passed here is either the bold or the normal font set up in createFonts()
    while not settings.CANUSETK:
        pass
    settings.CANUSETK = False
    length = font.measure(s)
    settings.CANUSETK = True
    return length

def createFonts():
    while not settings.CANUSETK:
        pass
    settings.CANUSETK = False
    boldFont = settings.BOLDFONT #tkFont.Font(family="arial", size=10, weight="bold")
    normalFont = settings.NORMALFONT #tkFont.Font(family="arial", size=10)
    settings.CANUSETK = True

    return (normalFont, boldFont)

0 个答案:

没有答案