【发布时间】:2019-12-17 20:23:20
【问题描述】:
我需要创建一个多窗口 GUI,我找到了一个视频 (https://youtu.be/jBUpjijYtCk),它显示了 tk raise 的多帧功能。但是,当我按下“访问第 1 页”按钮时,我遇到了一个错误,所有标签甚至“ADICIONAR”按钮都消失了,但条目没有,我应该怎么做才能使其正常工作?
我正在写的代码发生在 StartPage 类上。
Client 类并不重要,它只是我创建的用于存储数据的类。
from tkinter import *
from client import Client
LARGE_FONT = ("Verdana", 16)
MEDIUM_FONT = ("VERDANA", 12)
clients = []
class Sea(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
container = Frame(self)
self.geometry("800x500")
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
label = Label(self, text="Adicionar cliente", font=LARGE_FONT)
label.place(x=50, y=100)
label = Label(self, text="Nome", font=MEDIUM_FONT)
label.place(x=10, y=160)
self.name_entry = Entry(width=30)
self.name_entry.place(x=100, y=162)
label = Label(self, text="GSM", font=MEDIUM_FONT)
label.place(x=10, y=200)
self.gsm_entry = Entry(width=30)
self.gsm_entry.place(x=100, y=202)
label = Label(self, text="Email", font=MEDIUM_FONT)
label.place(x=10, y=240)
self.email_entry = Entry(width=30)
self.email_entry.place(x=100, y=242)
label = Label(self, text="Local", font=MEDIUM_FONT)
label.place(x=10, y=280)
self.local_entry = Entry(width=30)
self.local_entry.place(x=100, y=282)
label = Label(self, text="Produto", font=MEDIUM_FONT)
label.place(x=10, y=320)
self.product_entry = Entry(width=30)
self.product_entry.place(x=100, y=322)
add_button = Button(self, text="ADICIONAR", command=self.adicionar)
add_button.place(x=100, y=360)
self.button = Button(self, text="Visit Page 1",
command=lambda:controller.show_frame(PageOne))
self.button.place(x=500, y=20)
def adicionar(self):
if(self.name_entry.get()=="" or self.gsm_entry.get()=="" or self.local_entry.get()=="" or self.product_entry.get()==""):
return
clients.append(Client(self.name_entry.get(), self.gsm_entry.get(), self.local_entry.get(), self.gsm_entry.get()))
print(clients)
class PageOne(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
label = Label(self, text="Page One", font=LARGE_FONT)
label.pack(pady=10, padx=10)
button = Button(self, text="Start Page",
command=lambda:controller.show_frame(StartPage))
button.pack()
app = Sea()
app.mainloop()
【问题讨论】: