Как удалить существующий текст в Tkinter? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать функцию, которая изменяет слайды в анимированной презентации, используя операторы if, но когда предполагается, что слайд изменится, существующий виджет останется. Вот мой минимальный воспроизводимый пример (кстати, «description.insert» правильно отформатирован на моем компьютере, но не на моем телефоне):

from tkinter import *
import random
import time
tk = Tk()
canvas = Canvas(tk, width = 400, height = 400)
tk.title('Diffusion')
canvas.pack()
 
slide = 0
 
def changeSlide():
    global slide
    slide += 1
    #WRITE TEXT
    if slide == 1:
        description = Text(tk, bd=0, height=5, width = 50)
        description.insert(INSERT, 'Diffusion is the net movement of particles from an area of higher concentration to an area of lower concentration, which results in the concentration being even. Here is an example, with the particles represented by orange dots:')
        description.place(x=0, y=190)
    elif slide == 2:
        #DRAW PARTICLES  
        particle = canvas.create_oval(10, 10, 20, 20, fill = 'orange')
 
nexT = Button(tk, text = 'NEXT', command = changeSlide)
nexT.pack()
nexT.place(bordermode = 'inside', x = 350, y = 375)

1 Ответ

2 голосов
/ 24 октября 2019

Хотя, похоже, вы нашли способ решить проблему, вот другой, возможно, лучший, подход. Он создает отдельный tk.Frame с именем slide для хранения содержимого текущего слайда. Это позволяет относительно легко перебирать (просто) его содержимое - содержащиеся в нем «дочерние» виджеты - и уничтожать их.

Обратите внимание, как атрибут был добавлен в рамку слайда с именем num, чтобы указатькакой слайд отображался в последний раз. Преимущество такой работы заключается в том, что теперь вам не нужно объявлять ее global в функции slide_changer() для доступа и изменения ее значения, поскольку теперь она является частью самого фрейма slide.

Также обратите вниманиеиспользование аргумента ключевого слова wrap=tk.WORD при создании виджета tk.Text для описания, которое должно принудительно форматировать вставленный в него текст на всех ваших устройствах. Эта опция виджета описана в некоторой документации Tkinter о виджете Text и различных поддерживаемых им опциях.

import tkinter as tk
import time
import random

NUM_SLIDES = 2

root = tk.Tk()
root.title('Diffusion')

slide = tk.Frame(root, width=400, height=400)
slide.num = 0  # Add attribute to track slide being displayed.
slide.pack()

next_btn = tk.Button(root, text='NEXT')
next_btn.place(bordermode='inside', x=350, y=375)

def slide_changer():
    # Clear slide frame.
    for child in slide.winfo_children():
        child.destroy()

    slide.num += 1
    if slide.num > NUM_SLIDES:
        slide.num = 1  # Repeat starting at beginning.

    if slide.num == 1:  # Write text.
        description = tk.Text(slide, bd=0, height=5, width=50, wrap=tk.WORD)
        description.insert(tk.INSERT,
            'Diffusion is the net movement of particles from an area of higher '
            'concentration to an area of lower concentration, which results in '
            'the concentration being even. Here is an example, with the '
            'particles represented by orange dots:')
        description.place(x=0, y=190)

    elif slide.num == 2:  # Draw particles.
        canvas = tk.Canvas(slide, width=400, height=400)
        canvas.pack()
        particle = canvas.create_oval(10, 10, 20, 20, fill='orange')

next_btn.config(command=slide_changer)

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