python - Python3/Tkinter 文本“显示线”行为问题
问题描述
我试图在预先填充数据时计算文本框中使用的实际行数,并在提交表单时再次计算。
使用下面的代码,它在启动时错误地将行数显示为字符(93),但是当您按下计数按钮时,它会显示正确的行数(4)......来自相同的代码执行。我错过了什么?(我是在这里发帖的新手,放轻松.....)
import tkinter
text="adfa asdfkljds ;das asdjfkds fkldjasf dsf;dlsjfdkls jdkls fjd;lsfjd;ls fjd;lsafj ;dlsfj;asdlf"
def countit():
print(DE.count('1.0', 'end', 'displaylines')[0])
top = tkinter.Tk()
DE = tkinter.Text(top, height=5, width=30, wrap="word")
DE.pack()
DEButton = tkinter.Button(top, text="count", command=countit)
DEButton.pack() # WHEN BUTTON IS PRESSED, CORRECT NUMBER IS DISPLAYED
DE.insert("1.0", text)
countit() # FIRST RUN, INCORRECT NUMBER DISPLAYED
top.mainloop()
解决方案
displaylines
如果数据未显示,则无法计算,因为该值取决于各种因素,例如屏幕分辨率、实际字体(可能与请求的字体不同)、小部件的大小 once pack
、place
或grid
and完成它的计算,等等。在窗口实际映射到屏幕之前,这些无法确定。
为了说明这一点,请top.update()
在调用之前立即添加countit()
,您会看到第一次正确打印了该值。
更好的解决方法是countit
在窗口映射到屏幕之前不调用。例如,您可以在创建文本小部件后添加这行代码:
DE.bind("<Map>", lambda event: countit())
上面将countit()
在小部件映射到屏幕后立即调用。
推荐阅读
- php - 使用传入对象更新时出现重复条目错误
- apache-camel - 使用并行处理的路由异常
- javascript - 服务器/客户端如何知道对方已断开连接
- google-cloud-vision - 如何强制谷歌云视觉使用特定的字符集?
- json - 在 Python Jupyter 笔记本中通过烧瓶传递参数以进行数学运算
- c# - 如何将 ExpressionTree 的结果包装在容器类中?
- go - 拦截 Go 中的错误和恐慌
- reactjs - React comonentDidUpdate 的无限循环
- android - Android 8.0 如何实现 Miracast 发件人应用?
- ftp - 通过 FTPS 与 SFTP 进行通信