Похоже, что вы на самом деле хотите обратного вызова:
class txtfield(pygame.sprite.Sprite):
def __init__(self, ***callback***, name, x, y):
***self.callback=callback***
self.value=""
def update(self, key):
#I removed image-changing and the code which changes the string self.value
#key is a character from the last pressed button
#(self.value+=key)
if key=="return":
***self.callback(self.value)***
# I want this to be like 'a=self.value'.
#-> assuming self.name is 'Peter', 'a' should change to 'Peter'
#if the user hits enter
***def myCallback(text):
print(text)***
txt=txtfield(***myCallback***, "popo", 20, 20)
Вы даже можете установить переменные следующим образом:
class MyController(object):
def __init__(self):
self.A = ''
def makeCallback(self):
"""
Makes a callback which modifies self.A
"""
def myCallback(text):
self.A = text
return myCallback
controller = MyController()
txt = txtfield(controller.makeCallback(), "popo", 20, 20)
assert controller.A=='popo' #--> True!
Причина, по которой вы не могли «установить переменную» в исходной версии, заключалась в том, что вы сказали функции «установить« popo »в« popo »»; Функция, устанавливающая вещь, должна была знать название объекта. В приведенном выше примере вы говорите «установите self.A в« popo »». Вот пример без класса:
A = ''
def setA(text):
A = text
txt = txtfield(setA, "popo", 20, 20)
assert A=='popo'
Вот пример, в котором используются словари (вы также можете использовать списки), чтобы избежать необходимости давать кодовое имя:
lookupTable = {}
def setA(text):
lookupTable['A'] = text
txt = txtfield(setA, "popo", 20, 20)
assert lookupTable['A']=='popo'