Python3和Tkinter-无法分配27个字节
在我的一段代码中,我的脚本生成一个字符串,将其复制到scolled文本小部件中。如果字符串的大小不是很重,则此过程不会出现任何问题,但是当字符串很重时,脚本无法将其粘贴到滚动文本小部件中。发生这种情况时,脚本崩溃,终端中出现错误消息:Python3和Tkinter-无法分配27个字节,python,tkinter,Python,Tkinter,在我的一段代码中,我的脚本生成一个字符串,将其复制到scolled文本小部件中。如果字符串的大小不是很重,则此过程不会出现任何问题,但是当字符串很重时,脚本无法将其粘贴到滚动文本小部件中。发生这种情况时,脚本崩溃,终端中出现错误消息:无法分配27个字节(这不是异常事件) 在崩溃之前,我通过sys.getsizeof函数获得了字符串的字节大小,它是230031360字节(230MB) 在这些情况下,用户可以通过选择在文本文件中写入输出消息来解决问题,但是如果用户尝试在scolled text小部件
无法分配27个字节(这不是异常事件)
在崩溃之前,我通过sys.getsizeof
函数获得了字符串的字节大小,它是230031360字节(230MB)
在这些情况下,用户可以通过选择在文本文件中写入输出消息来解决问题,但是如果用户尝试在scolled text小部件中写入一个重字符串呢?在这个特定的例子中,我非常希望显示一个消息框,建议用户将输出写入文本文件,但是我如何理解脚本是否可以在滚动文本小部件中写入字符串?Python中字符串的字节限制是多少
更新:
我写了一个例子来告诉你问题发生在哪里。主窗口将在两分钟后崩溃,终端中显示错误消息,无法分配28个字节
:
from tkinter import *
from tkinter import ttk, scrolledtext
import ipaddress
def GiveMeHosts():
ls = []
for host in ipaddress.ip_network("10.0.0.0/8").hosts():
ls.append(str(host))
return ls
parent = Tk()
parent.geometry("400x350")
parent.title("The window will crash..")
MyWidget=scrolledtext.ScrolledText(parent, wrap=WORD, width=36, height=14, font=("Segoe UI", 9), state="normal")
MyWidget.pack()
parent.update()
# the string "hosts" is too long, and "MyWidget" can't manage it!
hosts = "\n".join(GiveMeHosts())
MyWidget.insert("1.0", hosts) # it makes the script to crash
parent.mainloop()
我运行了您的代码,虽然花了相当长的时间,但最终还是将所有IP地址都放在了滚动文本框中。没有错误,也没有崩溃。顺便问一下:无法分配28个字节
,这正是最后两个ip地址的大小?!?(10.255.255.253 10.255.255.254)
我更进一步。实际上是两步。尝试运行相同的代码,但将返回值相乘ls*=5
。结果仍然有效,没有崩溃。同时,ls
的大小为1790312344字节(1.67 GB)
然而,在ls*=10
时,ls
现在的大小为2545286976字节(2.37 GB)
,它最终通过以下回溯崩溃:
Traceback (most recent call last):
File "F:\pybin\StackOverflow\so.py", line 28, in <module>
MyWidget.insert("1.0", hosts) # it makes the script to crash
File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 3266, in insert
self.tk.call((self._w, 'insert', index, chars) + args)
OverflowError: string is too long
回溯(最近一次呼叫最后一次):
文件“F:\pybin\StackOverflow\so.py”,第28行,在
MyWidget.insert(“1.0”,hosts)#它使脚本崩溃
文件“C:\Program Files\Python36\lib\tkinter\\uuuuu init\uuuuu.py”,第3266行,插入
self.tk.call((self._w,'insert',index,chars)+args)
溢出错误:字符串太长
总的来说,似乎确实存在一个限制,但这个限制很可能取决于系统。至少,这是我从中得出的结论。首先,Python中的字符串实际上没有大小限制,当然这取决于您的系统RAM大小。其次,sys.getsizeof(astring)
没有给出以字节为单位的字符串大小,而是给出str对象的大小(包括开销)。不幸的是,我无法(很快)发现tkinter是否有限制,如果有,它们是什么,但这肯定不会让我感到惊讶。再见,罗纳德。您知道是否有办法处理无法分配xxx字节的错误吗?如果我不能理解滚动文本小部件的内存限制是多少,至少我希望处理错误并避免脚本崩溃。有可能吗?您是否有生成错误的一小段代码?现在,虽然我的第一个想法是一些导入的函数已经处理了一个错误并产生了这个消息,但我并没有真正的线索。你觉得怎么样?我运行了你的代码,虽然花了相当长的时间,但最终还是把所有的IP地址都放到了滚动文本框中。没有错误!顺便问一下:无法分配28个字节
,这不正是最后两个ip地址的大小吗?!?(10.255.255.253 10.255.255.254
)我真的不明白为什么会出现异常错误而不是崩溃。。我们有不同的行为。你的python版本是什么?我使用Python3.8.2(tags/v3.8.2:7b3ab59,2020年2月25日,22:45:29)我刚刚安装了Python3的最后一个版本,但我有同样的问题。我碰巧使用了3.6.4版。我还在带有Mac OSX Mojave(4个vCPU和3 GB RAM)的虚拟机上尝试了该脚本。未检测到任何问题,脚本正常运行。。那么问题是什么呢?为什么在我安装了W10的电脑中,脚本无法工作?无法分配xxx字节是什么意思?在MacOSX中,我有最新版本的Python(3.8.3)。