【问题标题】:save class instances in lists as variables(outside of a class) Python [duplicate]将列表中的类实例保存为变量(在类之外)Python [重复]
【发布时间】:2018-02-20 17:40:11
【问题描述】:
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 页,用户第一次选择一个单选按钮,然后该值是从 Primary 类(每个新页面总是引用)的方法计算出来的,里面有“command”这种方法我在计算后打印值(以查看它是否正确保存)并且它可以工作。直到这里一切正常。

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

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

我的主要目标是列出用户将通过单选按钮提供的变量。此列表必须在列表之外,以便处理程序轻松访问它们。

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

如何获取类实例并将它们作为变量转换为列表组件?

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

list[0] = x.get()

其中全局 x 和

self.radio_num =tkinter. IntVar()

x= self.radio_num

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

无论如何谢谢:-)

【问题讨论】:

  • 你能提供一份代码吗?
  • 我刚刚上传了一部分代码..我希望现在我的问题更容易理解

标签: python list class tkinter


【解决方案1】:

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

global classes
classes.append(self)

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

【讨论】:

  • 你能解释一下怎么做吗?我尝试在 Show_choice 方法中将列表设为全局,但它在第 2 页上仍然不起作用
  • 我澄清了我的回答,以解释您将如何实施该列表。
  • 感谢您的帮助,但我仍然无法使其正常工作..首先,如果有人使用 append 时我没记错的话,它只会将内容添加到列表中,并且如果用户推回并然后接下来可能变量不会在正确的位置之后..所以我认为插入方法会更安全,因为变量总是保存在正确的索引中。其次,我完全按照你告诉我的方式输入了它,好消息是当它使用列表中的变量时我不再看到 None 但它给了我像 .58345200.72500432 这样的数字,其中正确答案是“1”跨度>
  • 我相信对你来说这很简单..听起来也很简单(将变量保存在列表中)但不幸的是它仍然不起作用......感谢您的耐心: -)
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多