帧切换在Tkinter中无法正常工作

问题描述

每个人 起始页正常。 但是,我使用change_img()将框架更改为Pageone。 Pageone没有出现在屏幕上。 通过单击打印框右上角的正方形,可以放大整个屏幕。 Pageone出现在底部

我不知道为什么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,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.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,text="This is page two").pac`enter code here`k(side="top",fill="x",pady=10)
        tk.Button(self,StartPage)).pack()

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

解决方法

这是因为self.Canvas1不是StartPage的子代,而是rootStartApp)窗口的子代。因此,即使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`