Переключение кадров не работает нормально в Tkinter

#python #tkinter #frame

#python #tkinter #фрейм

Вопрос:

Каждая начальная страница работает нормально. Тем не менее, я изменил фрейм на Pageone с помощью change_img() . Страница не отображалась на экране. Я увеличил весь экран, щелкнув квадрат в правом верхнем углу печатной рамки. Внизу отображается страница.

Я не знаю, почему текст и кнопки Pageone не отображаются в верхней части фрейма, пожалуйста, помогите.

 import sys
import serial
import threading
import queue
import tkinter as tk
#import tkinter
import tkinter.ttk as ttk
import time
import tkinter.messagebox
from PIL import ImageTk, Image

class StartApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(None, StartPage)

        self.geometry("1500x950 100 100")

        self.resizable(width=True, height=True)  
        
    def switch_frame(self, Canvas, frame_class):
        if Canvas is not None:
            Canvas.delete("all") 
        new_frame = frame_class(self)
        if self._frame is not None:
            print( '{} destory'.format(self._frame))
            self._frame.destroy()
        self._frame = new_frame
        print(new_frame)
        self._frame.pack()


class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.no= 10
        self.is_charged= False

        #self.img = ImageTk.PhotoImage(Image.open("images/10_image.png"))

        #n can't be zero, recommend 0.25-4
        n = 3
        self.image = Image.open("images/10_image.png")
        [imageSizeWidth, imageSizeHeight] = self.image.size
        newImageSizeWidth = int(imageSizeWidth * n)

        if 1:
            newImageSizeHeight = int(imageSizeHeight*n) 
        else:
            newImageSizeHeight = int(imageSizeHeight/n) 

        self.image = self.image.resize((newImageSizeWidth, newImageSizeHeight), Image.ANTIALIAS)
        self.img = ImageTk.PhotoImage(self.image)

        self.Canvas1 = tk.Canvas(width = 1500, height = 950)
        #self.Canvas1.config(bg="blue")
        self.Canvas1.pack()
        self.Canvas1.create_image(1500/2,950/2,image = self.img)
        # Canvas1.config(bg="blue",width = newImageSizeWidth, height = newImageSizeHeight)
        #Canvas1.config(bg="blue")
        #Canvas1.pack(side="left", anchor="ne")

        # images
        self.my_images = []
        self.my_images.append(tk.PhotoImage(file = "images/10_image.png"))
        self.my_images.append(tk.PhotoImage(file = "images/11_image.png"))
        self.my_images.append(tk.PhotoImage(file = "images/12_image.png"))
        self.my_image_number = 0

        # set first image on canvas
        self.image_on_canvas = self.Canvas1.create_image(0, 0, anchor = "nw", image = self.my_images[self.my_image_number])
        self.after(500, self.change_img)

    def change_img(self):
        # next image
        self.my_image_number  = 1
        # return to first image
        if self.my_image_number == len(self.my_images):
            self.my_image_number = 0
            self.master.switch_frame(self.Canvas1, PageOne) 
        # change image
        else:
            self.Canvas1.itemconfig(self.image_on_canvas, image = self.my_images[self.my_image_number])
            self.after(500, self.change_img)


class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="This is page one").pack(side="top")
        tk.Button(self, text="Return to start page",
                  command=lambda: master.switch_frame(None, StartPage)).pack()

class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="This is page two").pac`enter code here`k(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
                  command=lambda: master.switch_frame(None, StartPage)).pack()

if __name__ == "__main__":
    root= StartApp()
    root.mainloop()
  

Ответ №1:

Это потому self.Canvas1 , что не является дочерним элементом StartPage , это дочернее root StartApp окно () . Так что даже StartPage если он уничтожен, self.Canvas1 он все еще там.

Измените следующую строку в StartPage.__init__() :

 self.Canvas1 = tk.Canvas(width = 1500, height = 950) # child of `root`
  

Для

 self.Canvas1 = tk.Canvas(self, width = 1500, height = 950) # child of `StartPage`