Замена содержимого виджетов Tkinter - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь разработать Twitter-подобный клиент, чтобы освоить tkinter.Я показываю 7 твитов на экран из твитов, хранящихся в базе данных sqlite.Одна строка имеет имя, отображаемое имя и дату создания в метках.Под этим текстовое поле с текстом твита.Когда пользователь нажимает кнопку «Далее» или «Предыдущий», я хочу отобразить следующие или предыдущие 7 твитов из файла.Не уверен, как очистить предыдущие и обновить с новыми данными.Это потому, что я хочу, чтобы создание виджета было динамическим, как в коде ниже.Таким образом, нет способа адресовать конкретному виджету мое имя.

 if tweetStr:
    while i <  listLen:   
        print(i)
        user_name = tweetStr[i]['name']
        screen_name = tweetStr[i]['screen_name']
        created = tweetStr[i]['created_at']
        tweet_text = (tweetStr[i]['short_text'] if not tweetStr[i]['long_text'] else tweetStr[i]['long_text'] )

        top_space = tk.Text(f, width= 100, height=1)
        top_space.grid(column = 0, row = start_row,columnspan=6, sticky="nsew")
        top_space.configure(background='lightblue')

        ttk.Label(f, text=user_name).grid(column=0, row=start_row+1,sticky='w')
        ttk.Label(f, text=screen_name).grid(column=1, row=start_row+1,sticky='w')
        ttk.Label(f, text=created).grid(column=2, row=start_row+1,sticky='w')

        t = tk.Text(f, width= 100, height=3, wrap='word')
        t.grid(column = 0, row = start_row+2,columnspan=6, sticky="nsew")
        #t.insert(INSERT, "Begin " + "This is a test " * 800 + " END" + '\n\n')
        t.insert(tk.INSERT, tweet_text)

        i += 1
        start_row += 6

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Решение оказалось довольно простым.

 for widget in f.winfo_children():
       if isinstance(widget, tk.Text):
            widget.delete('1.0', "end")
       elif isinstance(widget,ttk.Label):
            widget['text'] = ''    
0 голосов
/ 27 декабря 2018

Для текстового виджета используйте метод delete, чтобы удалить существующий текст, затем используйте insert, чтобы добавить новую информацию.Избегайте уничтожения и повторного создания виджетов постоянно.Создайте их один раз, затем обновите их содержимое, используя Text.insert и Label.configure.Я бы также избегал цикла while в пользу вызова метода с использованием after, пока вы не обработаете все.Жесткий цикл предотвращает обработку событий до тех пор, пока вы не завершите весь цикл, а использование after разбивает каждую итерацию цикла с обработкой событий.

...