(tkinter) 为什么我的变量没有使用标签显示?

(tkinter) Why aren't my variables being displayed using labels?

我正在尝试编写一个程序,该程序在一个页面上获取用户信息,例如他们的姓名和内容,然后在另一页面上显示这些条目。我正在使用 Tkinter,但我无法让他们的条目显示在另一页上。这是程序:

import tkinter as tk
from tkinter import ttk

#PROFILE VARS
FirstName = ('none')

#INITIALIZING
class MegaQuiz(tk.Tk): 

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "THE MEGA POP QUIZ")

        container = tk.Frame(self)
        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 (ProfilePage, MainPage):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("ProfilePage")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

#PROFILE PAGE
class ProfilePage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        global FirstName

        #Profile Title
        profile_title = tk.Label(self, text="Create A Profile Yo")
        profile_title.grid(column=0, row=2)

        #FIRST NAME
        Q1_title = tk.Label(self, text="First Name:")
        Q1_title.grid(column=0, row=1)

        FirstNameEntry = tk.Entry(self)
        FirstNameEntry.grid(column=2, row=4)
        FirstName = str(FirstNameEntry.get())


        #NEXT BUTTON
        Button1 = tk.Button(self, text="NEXT",
                        command = lambda: controller.show_frame("MainPage"))
        Button1.grid(column=10, row=10)

#MAIN MENU PAGE
class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        #Play BUTTON
        PlayBTN = tk.Button(self, text="PLAY", width=40)
        PlayBTN.grid(column=0, row=20, sticky="nesw")

        #ProfileDisplay
        FirstNameDis = tk.Label(self, text=('FirstName: ' + FirstName))
        FirstNameDis.grid(column=0, row=0, sticky="w")

#RUNNING PROGRAM
app = MegaQuiz()
app.mainloop()

问题是它显示"FirstName: ",但不显示变量FirstName,只是一片空白,求助。

解决此问题的最快方法是将 FirstName 变量作为 class 属性移至 MegaQuiz,然后从那里使用它。我们可以更改您的 NEXT 按钮命令以调用 class 方法,然后从该方法更新 FirstName 变量,然后还从同一方法设置 FirstNameDis 标签文本。

首先将 FirstName 变量移动到 MegaQuiz class 中,方法是将此行放在 __init__ 部分。

self.FirstName = 'none'

然后改变这个:

#NEXT BUTTON
Button1 = tk.Button(self, text="NEXT", command = lambda: controller.show_frame("MainPage"))

为此:

    #NEXT BUTTON
    Button1 = tk.Button(self, text="NEXT", command=self.next_button)
    Button1.grid(column=10, row=10)

def next_button(self):
    self.controller.FirstName = self.FirstNameEntry.get()
    self.controller.frames["MainPage"].FirstNameDis.config(text='FirstName: ' + self.controller.FirstName)
    self.controller.show_frame("MainPage")

在您的 MainPage 中更改为:

self.FirstNameDis = tk.Label(self, text='FirstName: ' + FirstName)

为此:

self.FirstNameDis = tk.Label(self, text='FirstName: ' + self.controller.FirstName)

这应该是您需要解决的全部问题。

我确实注意到了一些 PEP8 问题,所以这里重写了您的代码以修复您的问题,并重写了一些内容以更好地遵循 PEP8 准则。

  1. 不确定为什么要将 () 添加到您的某些字符串变量中,但这不是必需的。
  2. 变量和class属性名称应全部小写,单词之间有下划线。
  3. 您不需要为所有内容提供变量名。如果你有一个按钮或标签,你知道你以后不会更新,那么你可以在没有变量名的情况下编写它们。

代码:

import tkinter as tk


class MegaQuiz(tk.Tk): 

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self)
        self.title("THE MEGA POP QUIZ")
        self.first_name = 'none'
        container = tk.Frame(self)
        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 (ProfilePage, MainPage):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("ProfilePage")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()


class ProfilePage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        tk.Label(self, text="Create A Profile Yo").grid(column=0, row=2)
        tk.Label(self, text="First Name: ").grid(column=0, row=1)

        self.fn_entry = tk.Entry(self)
        self.fn_entry.grid(column=2, row=4)

        tk.Button(self, text="NEXT", command=self.next_button).grid(column=10, row=10)

    def next_button(self):
        self.controller.first_name = self.fn_entry.get()
        self.controller.frames["MainPage"].fn_dis.config(text='FirstName: {}'.format(self.controller.first_name))
        self.controller.show_frame("MainPage")


class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        tk.Button(self, text="PLAY", width=40).grid(column=0, row=20, sticky="nesw")
        self.fn_dis = tk.Label(self)
        self.fn_dis.grid(column=0, row=0, sticky="w")


app = MegaQuiz()
app.mainloop()