【问题标题】:Tkinter frame tkraise Entry bugTkinter 框架 tkraise 入口错误
【发布时间】: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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您没有将 Frame 实例传递给您的 Entry 类,因此您没有将它们放入您的框架中。将self 参数传递给您的每个Entry 实例,它将起作用:

    self.name_entry = Entry(self, width=30)
    

    对所有条目都这样做。

    【讨论】:

      【解决方案2】:

      您的Entry 小部件未创建为您的起始页框架的子级。所以只需在每个 Entry 命令的开头添加(self,...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 2014-06-12
        相关资源
        最近更新 更多