首页 > 解决方案 > 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()

标签: pythontkinter

解决方案


displaylines如果数据未显示,则无法计算,因为该值取决于各种因素,例如屏幕分辨率、实际字体(可能与请求的字体不同)、小部件的大小 once packplacegridand完成它的计算,等等。在窗口实际映射到屏幕之前,这些无法确定。

为了说明这一点,请top.update()在调用之前立即添加countit(),您会看到第一次正确打印了该值。

更好的解决方法是countit在窗口映射到屏幕之前不调用。例如,您可以在创建文本小部件后添加这行代码:

DE.bind("<Map>", lambda event: countit())

上面将countit()在小部件映射到屏幕后立即调用。


推荐阅读