Обновите метку, пока приложение работает без кнопки на Tkinter

#python #tkinter

Вопрос:

Я хочу создать метку, которая будет подсчитывать, сколько раз пользователь вводил определенное слово(в данном случае «1r#») в прокручиваемом тексте без необходимости нажимать кнопку для обновления метки. Могу ли я сделать петлю? Если да, то как я мог это сделать?

 from tkinter import *
from tkinter import scrolledtext

root = Tk()

dataFrame = Frame(root)
recFrame = Frame(root)

dataLabel = Label(root, text="Dados").grid(column=0, row=0)
dataInput = scrolledtext.ScrolledText(root, width=3, height=10)
dataInput.grid(column=0, row=1)

dataFrame.grid(column=0)

# Counts how many times the text appears
dataText = dataInput.get("1.0", "end-1c")
label = Label(recFrame, text=dataText)
labelCount = label['text'].count("1r#")


recPeTitle = Label(recFrame, text="P", width=3)
recPeTitle.grid(column=0,row=1)

# Here is where I want to "print" the count on a Label
recPe1 = Label(recFrame, text=labelCount)
recPe1.grid(column=0, row=2)

recFrame.grid(column=1, row=1, sticky=NW)

root.mainloop()
 

Каждое слово, которое программа будет искать, состоит из трех символов, если это поможет.

Ответ №1:

Вам не нужна еще одна петля. Просто свяжитесь <KeyPress> с функцией, а затем обновите счетчик.

Смотрите пример ниже:

 from tkinter import *
from tkinter import scrolledtext


def update(event):
    dataText = dataInput.get("1.0", "end-1c")
    
    labelCount = dataText.count("1r#")
    recPe1.config(text=labelCount)
    

root = Tk()

dataFrame = Frame(root)
recFrame = Frame(root)

dataLabel = Label(root, text="Dados").grid(column=0, row=0)

dataInput = scrolledtext.ScrolledText(root, width=3, height=10)
dataInput.bind("<KeyPress>", update)
dataInput.grid(column=0, row=1)

dataFrame.grid(column=0)

recPeTitle = Label(recFrame, text="P", width=3)
recPeTitle.grid(column=0,row=1)

# Here is where I want to "print" the count on a Label
recPe1 = Label(recFrame, text='0')
recPe1.grid(column=0, row=2)

recFrame.grid(column=1, row=1, sticky=NW)

root.mainloop()
 

Комментарии:

1. спасибо, но если мне нужно обновить более одной метки, нужно ли мне одно количество меток для каждой отдельной метки или есть способ обновить весь кадр?

2. @dkol если все ваши метки должны быть одинаковыми, то нет необходимости в нескольких метках, которые вы можете использовать одинаково. Если у вас есть что-то еще, что нужно обновить, поместите это в функцию обновления, и она обновит все.