Проблемы с поведением в Python3 / Tkinter "displaylines" - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь подсчитать фактические строки, используемые в текстовом поле, когда оно предварительно заполнено данными, и снова при отправке формы.

При использовании приведенного ниже кода он некорректно показывает количество строк в виде символов (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()

1 Ответ

0 голосов
/ 01 июля 2018

displaylines невозможно рассчитать, если данные не отображаются, поскольку значение зависит от различных факторов, таких как разрешение экрана, фактический шрифт (который может отличаться от запрошенного шрифта), размер виджет один раз pack, place или grid и все его расчеты и так далее. Они не могут быть определены до тех пор, пока окно не будет отображено на экране.

Чтобы проиллюстрировать эту точку, добавьте top.update() непосредственно перед вызовом countit(), и вы увидите, что значение правильно печатается в первый раз.

Лучшим решением будет не вызывать countit, пока окно не будет отображено на экране. Например, вы можете добавить эту строку кода после создания текстового виджета:

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

Вышеуказанный вызов вызовет countit() сразу после того, как виджет будет отображен на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...