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

时间:2017-09-12 09:55:30

标签: python list class tkinter

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()

我目前正在制作一个计划,我希望得到一些帮助。 我是一般的编程新手所以请耐心等待......: - )

所以我编写了一个程序,它从用户那里获取一些变量,然后处理它们(我完成了这个处理程序,所以这里没有需要帮助)。然后我开始编写一个GUI,其中将询问一些问题,并且来自用户的输入将被保存为变量。在这些问题的最后,所有变量都将被保存并从处理程序中使用。

所以我被困住的地方是我无法保存变量!!

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

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

对于我使用的每个页面,我创建一个引用主类的新类(新框架)。

现在的问题是,例如在第2页,用户第一次选择了一个单选按钮,然后从主类的方法(每个新页面总是引用)中使用'command'计算值并在里面这个方法我打算计算后的值(为了看看它是否正确保存),它的工作原理。直到这里一切都好。

我的问题是,当我在第3页中使用已保存的变量时,它无效...

我试图将类实例作为全局变量,它只在Primary类的方法中工作。之后当我想在另一个类(我的意思是在另一个页面中)使用它时,它不起作用。 我试图将引用作为ClassA.variable但是也没有用。我尝试用init定义init方法中的变量(否则我得到''变量''没有定义)当它被存在时从第2页计算它可以工作,但在第3页我想把变量以字符串的形式放在带有tkinter的Label中然后我得到值None虽然我应该是一个全局变量...我很困惑< / p>

我的主要目标是制作一个列表,其中包含用户将通过单选按钮提供的变量。此列表必须位于列表之外,以便处理程序可以轻松访问它们。

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

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

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

list[0] = x.get()

其中全局x和

self.radio_num =tkinter. IntVar()

x= self.radio_num
PS2:我不知道我是否正确解释了所有内容,以便有人能够准确理解我的问题是什么......如果没有,我可以根据需要上传一些代码

无论如何都要感谢: - )

1 个答案:

答案 0 :(得分:-1)

在模块的开头创建一个名为classes的列表。 在要存储的类的__init__()函数中,输入:

global classes
classes.append(self)

这将允许您将变量作为属性访问。