Хотя, похоже, вы нашли способ решить проблему, вот другой, возможно, лучший, подход. Он создает отдельный 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()