将列表中的类实例保存为变量(类外部)Python

将列表中的类实例保存为变量(类外部)Python,python,list,class,tkinter,Python,List,Class,Tkinter,我目前正在做一个项目,希望能得到一些帮助。 一般来说,我对编程相当陌生,所以请耐心点…-) 所以我写了一个程序,从用户那里获取一些变量,然后对它们进行处理(我完成了这个处理程序,所以这里不需要帮助)。然后我开始编写一个GUI,其中会询问一些问题,用户的输入将保存为变量。在这些问题结束时,所有变量都将从处理程序中保存和使用 所以我陷入困境的地方是我无法保存变量 我正在为Gui使用类。其中第一个类以以下形式保存主框架: class questions(tkinter.Tk): def __

我目前正在做一个项目,希望能得到一些帮助。 一般来说,我对编程相当陌生,所以请耐心点…-)

所以我写了一个程序,从用户那里获取一些变量,然后对它们进行处理(我完成了这个处理程序,所以这里不需要帮助)。然后我开始编写一个GUI,其中会询问一些问题,用户的输入将保存为变量。在这些问题结束时,所有变量都将从处理程序中保存和使用

所以我陷入困境的地方是我无法保存变量

我正在为Gui使用类。其中第一个类以以下形式保存主框架:

class questions(tkinter.Tk):

    def __init__(self, *args, **kwargs):
        tkinter.Tk__init__(self, *args, **kwargs)
        container = tkinter.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, QuestionOne, QuestionTwo)
              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()

    def show_choice(self, cont)
        global pr_var
        global x
        questions.pr_var = x.get()
        var_list[0]= questions.pr_var
        print('pr_var = ' + str(questions.pr_var)) ## i print it to check
        frame= self.frames[QuestionOne]
        frame.tkraise()

class Startpage(tkinter.Frame):

    def __init__(self, parent, controller):
        tkinter.Frame.__init__(self, parent)
        label= tkinter.Label(self, text='Hello', font= LARGE_FONT)
        label.pack(pady=10, padx=10)
        button=ttk.Button(self, text='Start', command= Lambda:controller.show_frame(QuestionOne))
        button.pack()

class QuestionOne(tk.Frame):

    def __init__(self, parent, controller):
        tkinter.Frame.__init__(self, parent)
        label= tkinter.Label(self, text='How many pieces?', font= LARGE_FONT)
        label.grid(row= 3, column=1, pady=10, padx=50)
        global x
        self.radio_num= tkinter.IntVar()
        x = self.radio_num
        self.rb1 = tkinter.Radiobutton(self, text='one', variable=self.radio_num, value=1)
        self.rb2 = tkinter.Radiobutton(self, text='two', variable=self.radio_num, value=2)
        self.rb1.grid(row=5, column=0, padx=10)
        self.rb2.grid(row=6, column=0, padx=10)
        button1=ttk.Button(self, text='Next', command= Lambda:controller.show_choice(self))
        button2=ttk.Button(self, text='back', command= Lambda:controller.show_frame(StartPage))
        button1.grid(row=25, column=1, padx=10, pady=50)
        button2.grid(row=25, column=0, padx=10, pady=50)

class QuestionTwo(tkinter.Frame):

    def __init__(self, parent, controller):
        tkinter.Frame.__init__(self, parent)
        label= tkinter.Label(self, text='So you have ' +str(var_list[0]) + ' piece(s)', font= LARGE_FONT)  ## here is the problem
        label.grid(row= 3, column=1, pady=10, padx=50)
        global x 
        global pr_var
        button1=ttk.Button(self, text='back', command= Lambda:controller.show_frame(QuestionOne))
        button1.grid(row=25, column=1, padx=10, pady=50)

app=questions()
app.mainloop()
对于我使用的每个页面,我都创建一个新类(新框架),它引用主类

现在的问题是,例如,在第2页,用户第一次选择单选按钮,然后使用“command”从主类(每个新页面始终引用)的方法计算值,在该方法中,我在计算后打印值(以查看是否正确保存),并且它可以工作。直到这里一切都好

我的问题是,当我使用第3页中保存的变量时,它不起作用

我尝试将类实例作为全局变量,它只在主类的方法中工作。当我想在另一个类(我的意思是在另一个页面)中使用它之后,它就不工作了。 我试图引用ClassA.variable,但也不起作用。。我尝试在init方法中使用None来定义变量(否则我会发现“变量”没有定义)当从第2页开始计算时,它是有效的,但在第3页,我想把变量以字符串的形式放在一个带有tkinter的标签中,然后我得到值None,尽管我被认为是一个全局变量…我很困惑

我的主要目标是用单选按钮列出用户要给出的变量。此列表必须位于列表之外,以便处理程序能够轻松访问它们

我也尝试过…制作一个列表,但当我引用列表[0](例如第一个变量)时,我得到的…列表索引超出了范围

如何将类实例转换为列表组件作为变量

PS:变量不是整数或字符串..是对类实例的引用,例如

def __init__(self, *args, **kwargs) 
全局x和

list[0] = x.get()

PS2:我不知道我是否正确地解释了所有的事情,以便有人能够准确地理解我的问题所在……如果没有,我可以在需要时上传一些代码


无论如何,谢谢:-)

在模块的开头创建一个命名类的列表。 在要存储的类的
\uuuuu init\uuuu()函数中,放置:

x= self.radio_num

这将允许您以属性的形式访问变量。

您能提供一份代码副本吗?我刚刚上传了部分代码。我希望现在我的问题更容易理解。您能解释一下怎么做吗??我尝试在方法Show_choice中使列表全局化,但在第2页仍然不起作用。我澄清了我的答案,解释了如何实现列表。谢谢你的帮助,但我仍然无法使其工作。首先,如果我没有弄错,每当有人使用append时,它只是将内容添加到列表中,如果用户按下前后可能变量之后不会在正确的位置..因此我认为insert方法会更安全,因为变量总是保存在正确的索引中。其次,我完全按照你告诉我的那样键入了它,好消息是,当它使用列表中的变量时,我再也看不到它了,但它给我的数字是.58345200.72500432,其中正确的答案是“1”,我相信这对你来说是非常简单的..听起来也很简单(将变量保存在列表中)但不幸的是,它仍然不起作用……感谢您的耐心:-)
x= self.radio_num
global classes
classes.append(self)