python - 无法从其他类访问变量 - tkinter

标签 python variables python-3.x tkinter

我正在尝试在 tkinter 中编写一个程序,用户单击带有其姓名的按钮,然后验证页面会向他们显示该程序。我遇到的问题是变量要么正在重置,要么我访问错误:

import tkinter as tk
from tkinter import *
from tkinter import ttk

LARGE_FONT = ("Times New Roman", 12)
NORM_FONT = ("Times New Roman", 10)
root = Tk()
root.withdraw()


class DIS(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.iconbitmap(self, default="")
        tk.Tk.wm_title(self, "program")
        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 (StartPage, contactQues, nameVerify):

            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(tk.Frame):

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

        button2 = ttk.Button(self, text = "Name Select",
                        command=lambda:           controller.show_frame(contactQues))
        button2.pack()


class contactQues(tk.Frame):

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

        label1 = tk.Label(self, text = "Select Your Name", font = LARGE_FONT)
        label1.pack(pady=10, padx=10)

        button2 = ttk.Button(self, text = "Bojangles", command = self.bojangles)
        button2.pack(pady=5)

    def bojangles(self):

        name.set("Mr. Bojangles")
        self.controller.show_frame(nameVerify)
    #
    #Many other names to select
    #

class nameVerify(tk.Frame):

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

        label5 = tk.Label(self, text = "Your Name:", font = LARGE_FONT)
        label5.pack(pady=10, padx=10)
        labelcontact = tk.Label(self, text = namename, font = NORM_FONT)
        labelcontact.pack()

app = DIS()
app.mainloop()

所以,本质上,我想要发生的是: - 程序运行,用户按下“名称选择”,用户选择他们的名称,最后一页显示他们的选择。

我尝试过使用全局变量、labelcontact 标签的文本变量、StringVar() 等,但似乎无法确定这一点。

有更好的方法吗?或者我做错了什么?

感谢您的帮助。

最佳答案

我建议将 name 设为 DIS 类的属性。然后您的 StartPage 和 nameVerify 实例可以通过其 controller 属性访问它。如果您希望 labelcontactname 更新时自动更新,请使用 textvariable 属性。

此外,您需要删除 root = Tk()root.withdraw() 行。我不知道为什么,但只要它们在那里,labelcontact 标签就不会正确更新。在任何情况下它们似乎都没有做任何事情 - 希望它们对您的实际代码并不重要。

import tkinter as tk
from tkinter import *
from tkinter import ttk

LARGE_FONT = ("Times New Roman", 12)
NORM_FONT = ("Times New Roman", 10)

class DIS(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.iconbitmap(self, default="")
        tk.Tk.wm_title(self, "program")
        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.name = StringVar()
        self.frames = {}

        for F in (StartPage, contactQues, nameVerify):

            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(tk.Frame):

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

        button2 = ttk.Button(self, text = "Name Select",
                        command=lambda:           controller.show_frame(contactQues))
        button2.pack()


class contactQues(tk.Frame):

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

        label1 = tk.Label(self, text = "Select Your Name", font = LARGE_FONT)
        label1.pack(pady=10, padx=10)

        button2 = ttk.Button(self, text = "Bojangles", command = self.bojangles)
        button2.pack(pady=5)

    def bojangles(self):

        self.controller.name.set("Mr. Bojangles")
        self.controller.show_frame(nameVerify)
    #
    #Many other names to select
    #

class nameVerify(tk.Frame):

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

        label5 = tk.Label(self, text = "Your Name:", font = LARGE_FONT)
        label5.pack(pady=10, padx=10)
        labelcontact = tk.Label(self, textvariable = self.controller.name, font = NORM_FONT)
        labelcontact.pack()

app = DIS()
app.mainloop()

关于python - 无法从其他类访问变量 - tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32852088/

相关文章:

python - 如何从嵌套生成器函数中产生结果?

java - 配置失败 : @BeforeMethod setup org. openqa.selenium.NoSuchSessionException : Session ID is null. 调用 quit() 后使用 WebDriver?

python - 添加到同一个字典的不同生成器返回相同的值

angularjs - AngularJS 中的 $scope 与 var

python-3.x - 如何解释 recvfrom 的结果(原始套接字)

python - 使用 List Comprehension 和/或 map 避免嵌套 for 循环

python : Can I global all variables in a function with a simple line?

python - 如何使用 Flask 测试客户端模拟 AJAX 请求?

python - for循环中的.Split()不返回列表

bash - 管道的左侧是子壳?