我有一个类,我想通过函数创建实例,但我也希望能够使用Tkinter.Entry
小部件的值命名实例。
我想要实现的简化版本如下:
class vtdiagram():
IO=0.0
IC=0.0
EO=0.0
EC=0.0
IGA=0.0
def printvtvalues(self):
print self.IO
print self.IC
print self.EO
print self.EC
print self.IGA
def createvtinstance():
global Nametemp
Nametemp=vtdiagram()
如果我运行此代码,那么我可以调用Nametemp.printvtvalues()
并打印所有值,因此它可以正常工作。
我现在正在尝试将实例Nametemp
的名称更改为Tkinter条目小部件上的字符串。基本上,如果我在createvtinstance()
时在输入框上写入engine1,我想通过以下方式调用实例:
engine1.printvtvalues()
并获取值。
我想这个函数应该是这样的:
def createvtinstance():
global Nametemp
Nametemp=vtdiagram()
Nametemp._command_to_change_the_name_=stringinentrybox.get()
你们有没有知道可以做这样事情的命令? 或者有没有办法可以达到相同的效果,也许使用字典?
***编辑:我需要为变量命名的原因如下(简单英语):我正在创建一个'引擎模拟器'。 这个想法是用户将在GUI中输入引擎参数-plus其名称,这是vtdiagram类。 使用课程的原因是我具有' engine1,engine2 ...'保存为类的实例,但我还需要附加功能。这是因为我想生成已保存引擎的图形和图表,但仅在调用时生成。所以我可以比较engine1和engine2,但是然后忘记'来自GUI的engine2比较1和3.
请记住我对python很新:) ***
非常感谢!
涓
答案 0 :(得分:-2)
我不建议根据用户输入更改变量的名称。 你可以实现同样的效果"像这样:
Objects=[]
Names=[]
def createvtinstance(Object=4,Name="engine1"):
global Nametemp
global Objects
global Names
Nametemp=Object # I'll just use an int to demonstrate.
Objects+=[Nametemp]
Names+=[Name]
def Use(Name="engine1"):print(Objects[Names.index(Name)]) # Or: Objects[Names.index(Name)].SomeFunction()
如果您真的想要根据用户输入更改变量的名称,那么您可以这样做:
def createvtinstance(Name="engine1"):
if (not Name[0]in"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") or False in(i in"1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"for i in Name) or Name in("tkinter","createvtinstance","Name","vtdiagram",):return "Invalid name." # This should make the code more "robust".
try:exec("global "+Name+"\n"+Name+"=vtdiagram()")
except SyntaxError:return "Invalid name."
或者这个:
def createvtinstance(Name="engine1"):
if (not Name[0]in"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") or False in(i in"1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"for i in Name) or Name in("tkinter","createvtinstance","Name","vtdiagram",):raise NameError("The name "+Name+" does not comply to validation rules.") # This should make the code more "robust".
try:exec("global "+Name+"\n"+Name+"=vtdiagram()")
except SyntaxError:raise NameError(Name+" is a reserved keyword.")
顶部示例显示了如何使用列表查找另一个列表中的对象;使用字符串。这就是我在这种情况下可能会做的事情,但字典可能更好。
底部示例显示了如何根据用户输入实际命名变量。这是 NOT WOMMENDED 。每个人似乎都同意使用exec
会适得其反,应该避免。 Python无法在exec语句中编译代码直到执行,并且无法对代码进行颜色编码。
人们一直在建议使用python词典,所以我决定研究它们。字典(dict
)似乎是一种类似于列表的数据类型,除了它们可以使用字符串(或其他"不可变"数据类型)编制索引。这是我的第一个使用字典而不是列表的示例:
Objects={}
def createvtinstance(Object=4,Name="engine1"):
global Objects
Objects[Name]=Object
def Use(Name="engine1"):print(Objects[Name]) # Or: Objects[Name].SomeFunction()
Python似乎有一个名为globals
的内置字典,它存储了所有变量,所以你可能会这样做:
def createvtinstance(Object=4,Name="engine1"):
globals()[Name]=Object # Or globals()[Name]=vtdiagram()
但是,如果用户使用createvtinstance
或tkinter
等名称,则会允许用户中断您的计划。