我有一个用户可以用来导出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)