首页 > 解决方案 > 如何正确地从 pack() 切换到 place()

问题描述

我将我的 tkinter gui 分成不同的类,并希望在主屏幕中使用按钮将它们连接起来,就像 Steven M. Vascellaro 在这里所做的那样:在 tkinter 中的两个帧之间切换

import tkinter.ttk as ttk
#from alexa_site_2 import Frame_alexa
from globals import Globals
from tkinter import PhotoImage
import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.geometry('{}x{}'.format(1024, 600))
        self.configure(bg="white")
        for i in range(len(Globals.image_files)):
            image_box = PhotoImage(file=Globals.image_files[i])
            Globals.list_images.append(image_box)
        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.place(x=110,y=0)
        print("switch frame function")

class StartPage(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        #self.place(x=0,y=0)
        ttk.Label(self, text="This is the start page").pack()
        ttk.Button(self, text="Open page one",
                  command=lambda: master.switch_frame(PageOne)).pack()
        ttk.Button(self, text="Open page two",
                  command=lambda: master.switch_frame(PageTwo)).pack()
    ttk.Button(self, text="Open page two",
      command=lambda: master.switch_frame(Frame_alexa)).pack()

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

class PageTwo(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        ttk.Label(self, text="This is page two").place(x=40,y=10)
        ttk.Button(self, text="Return to start page",
              command=lambda: master.switch_frame(StartPage)).place(x=0,y=0)

if __name__ == "__main__":

    app = SampleApp()
    app.mainloop()

当我尝试连接我自己的课程时,我得到一个白色窗口。您可以在 pageOne 中看到它在工作,在 PageTwo 中看到我的问题。我不打算混合 place() 和 pack()。我只需要 place() 和你的帮助。

标签: python-3.xuser-interfacetkinterttk

解决方案


推荐阅读