Python tkinter:如何使用按钮调用的函数创建类对象?

Python tkinter:如何使用按钮调用的函数创建类对象?,python,tkinter,Python,Tkinter,我创建了一个条目,在其中输入一些值。通过单击提交按钮,我希望函数create\u object获取条目值,然后创建类Test\u class的对象,将获取的值作为参数,并返回该对象 但很明显,这个对象还没有被创建,因此无法访问,对吗?如何创建类对象并访问它 from tkinter import * class Test_Class: def __init__(self, parameter ): self.parameter = parameter root = T

我创建了一个条目,在其中输入一些值。通过单击提交按钮,我希望函数
create\u object
获取
条目
值,然后创建类
Test\u class
的对象,将获取的值作为参数,并返回该对象

但很明显,这个对象还没有被创建,因此无法访问,对吗?如何创建类对象并访问它

from tkinter import *

class Test_Class:
    def __init__(self, parameter ):
        self.parameter = parameter

root = Tk()

def create_object():
    parameter = entry.get()
    object = Test_Class(parameter)
    return object

entry = Entry(root, width=30)
entry.grid(row=0, column=0)

submit = Button(root, text="Submit", command=create_object)
submit.grid(row=1, column=0)

root.mainloop()

您可以完全停止使用过程编程,这样就不必担心范围问题。我所做的只是将代码转换成类并对其进行重构,以便测试您的写和读结果

另一个简单的改变是:我不再担心可能存在或可能不存在的东西,而是简单地创建了一些肯定存在的东西来保存前面提到的东西,你可以通过循环找到存在的东西

import tkinter as tk
from typing import *

class Test_Class:
    def __init__(self, parameter ):
        self.parameter = parameter
        
    def __str__(self):
        #allows us to call print on the entire class to print self.parameter value
        return self.parameter

#extend the root
class Root(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)            
        #you don't have to "strict type" this. I just did, cause I do
        self.param_objects:List[Test_Class] = []
        
        self.entry = tk.Entry(self, width=30)
        self.entry.grid(row=0, column=0, columnspan=2)
        
        #unless you intend for your script to modify or delete these buttons, there is no need for a reference
        tk.Button(self, text="Submit", command=self.create_pobjs).grid(row=1, column=0)
        tk.Button(self, text="Check", command=self.print_pobjs).grid(row=1, column=1)
        
    def create_pobjs(self):
        #create a new Test_Class instance
        self.param_objects.append(Test_Class(self.entry.get()))
        
    def print_pobjs(self):
        for param in self.param_objects:
            #call print on the entire Test_Class instance
            print(param)


if __name__ == "__main__":
    Root().mainloop()

你说过打印(对象)并检查过这是否是你想要的吗。我发现
object
是一个内置类。所以我把它改成了简单的
a
。当我尝试访问(或打印)a时,它表示a未定义,这是有意义的,因为“a”只是该函数内部的局部变量。您需要将
Test\u类的实例设置为全局,以便在程序中的其他位置访问。按钮回调返回的任何内容都将被丢弃。就像您必须说的那样,
global a
,在您的例子中,
tkinter
忽略按钮回调函数返回的值-因此您必须将该值保存在函数中的某个位置。最简单的方法是使用
global
变量(需要在函数体的开头声明)。