#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`