0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
||||||
1 | ||||||
Использование переменной между классами08.06.2021, 16:10. Показов 2804. Ответов 11
Здравствуйте. Такой вопрос. У меня есть переменная light в классе Randomize_light, которая используется в методе random_light. Данная переменная отвечает за генерацию рандомного числа для освещения, а метод уже реализует саму генерацию, не суть. У меня так же есть класс для генерации масок Maskss, там при генерации маски меняется цвет фона и цвет освещения, но чтобы вернуться к исходному освещению мне нужно задать параметр light из класса Randomize_light. Как это можно реализовать?
Фрагмент кода: По нажатию кнопки "Генерировать освещение" у меня получается какой-то рандомный оттенок освещения, полученный переменной light из списка color_light. По нажатию кнопки Mask при определенном условии ( там так же есть галка, если стоит, то генерируется маска ( маска - некое изображение, с определенными параметрами освещения ), если нет, то будет обычное освещение ( параметры такого освещения записаны в переменную light ) ) у меня генерируется маска. Если я сгенерирую маску, а потом уберу галку и нажму еще раз сгенерировать, то освещение остается прежним, т.к. сохранился предыдущий параметр, мне же надо чтобы туда записывался параметр из переменной light. После запуска программы по данному коду ошибок не возникает, ошибка возникает после нажатия кнопки Mask NameError: name 'light' is not defined, то есть не определена переменная light. Пробовал ее делать глобальной, может не правильно это сделал, пробовал через self как-то, может тоже не правильно сделал, в общем уже много чего попробовал чтобы эту переменную light = random.choice(color_list) из class Randomize_light(Operator): перетащить как переменную light в class Maskss(Operator):. Можешь ее как-то можно присвоить через новую переменную, например задать переменную light1 = light в классе Maskss, в общем нужна помощь. [...] - пропущенный код, который не имеет значения. Так же тут естественно не весь код, только фрагмент, там весь код на много строк, надеюсь весь не нужно выкладывать. Если для решения задачи требуется весь код, я выложу весь. Если где-то что-то не так в терминологии или вообще в коде даже, извиняюсь заранее, я в этом новичок, без ошибок тут никак, по всем вопросам критику принимаю)
0
|
08.06.2021, 16:10 | |
Ответы с готовыми решениями:
11
Как передать значение переменной между классами? Передача функции между классами Использование Connection между классами Работа со значением переменной между классами Использование ресурсов классами |
Автоматизируй это!
|
|
08.06.2021, 16:21 | 2 |
mcratveller, ну так сделай лайт атрибутом и запрашивай его.
Добавлено через 1 минуту не нужно. Просто добавь к ней self и попроси ее у объекта Рандомизе_лайт после выполнения нужных вычислений. И подумай нельзя ли это вообще сделать отдельной независимой функцией?
0
|
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
|
08.06.2021, 17:53 [ТС] | 3 |
А как обратиться к ней в коде программы потом в классе Maskss? Я просто пошарил в интернете все, я только учусь, попробовал некоторые варианты, не получилось.
0
|
Автоматизируй это!
|
||||||
08.06.2021, 18:04 | 4 | |||||
mcratveller, нужно было просто с книги начинать, а не шарить в интернете, тысячелетиями это работало.
вот пример
0
|
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
|||||||||||
08.06.2021, 19:19 [ТС] | 5 | ||||||||||
А, ну такое я пробовал да, это работает в случае такого кода:
Traceback (most recent call last): File "D:\blender\test_nesk_def.blend\test_light.py", line 17, in <module> masks = Masks() TypeError: bpy_struct.__new__(type): expected a single argument Да, значит я делал что Вы мне посоветовали, просто не получилось из-за этой ошибки. Не знаю что с этим делать, буду читать и смотреть дальше. В любом случае спасибо за отклик)
0
|
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
|
08.06.2021, 20:30 [ТС] | 7 |
Я как переменную не объявлял ее нигде, просто написал как в шаблоне в конце, думал сработает, я думал только в Си надо писать мол int masks)
А как надо?
0
|
Автоматизируй это!
|
|
09.06.2021, 06:37 | 8 |
ты же раньше как то работал с маскс? ты ж выше писал что в немт ебе надо использовать переменную, как ты его тогда раньше создавал, до моего кода? Работай с ним как и раньше, просто там где тебе нужен лайт создавай объект рендом_лайт и у него бери.
а надо все это оставить и пойти читать книгу
0
|
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
|
09.06.2021, 17:48 [ТС] | 9 |
Какую книгу посоветуете?)
Мне просто ни с того, ни с сего понадобилось и очень срочно это сделать, я не думал даже, что пригодится, поэтому приходится все быстро изучать, впитывать и применять, это мой первый код на Python и второй вообще в программировании. Я работал с функцией random_light(self), там у меня задана переменная light, сама функция находится в классе Randomize_light(Operator) и эту переменную ( даже не столько переменную, сколько именно значение этой переменной ) мне уже надо перенести в другой класс Maskss() в функцию masksss(self). Я на самом деле уже запутался, у меня нет никакой переменной masks, ранее я ее нигде не задавал, кроме как скопировал из шаблона и вставил в конце. То есть у меня генерируется случайным образом значение переменной light и вот это сгенерированное значение нужно подставить в функцию masks в другом классе. Можно создать новую переменную и в него записать значение light, но по простому так не получается, там выдает другую ошибку.
0
|
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
|
||||||
10.06.2021, 01:21 [ТС] | 11 | |||||
В данном случае у меня есть 2 кнопки "Генерировать освещение" ( bl_label в коде подписано ) и "Mask", если смотреть изначальный код что я скидывал. По нажатию кнопки 'Генерировать освещение' у меня генерируется освещение, генерация происходит в переменной:
Далее если я нажимаю кнопку "Mask" ( при этом галочка тоже должна стоять, на фото она показана ) у меня генерируется маска ( просто картинка с другим освещением ) и там я настроил чтобы освещение поменялось. Но если я убираю галочку и нажимаю эту кнопку еще раз, у меня освещение должно вернуться в исходное состояние до маски. За маски и свет отвечают 2 разных класса, вот мне значение переменной light из класса Random_light(Operator) надо перекинуть в класс Masksss(Operator).
0
|
10.06.2021, 16:46 | 12 | |||||
Неверное высказывание. Нельзя в классы импортировать класс. Можно указать какой класс является супер классом для данного класса, указывая имя суперкласса в скобках (Operator). Но это связь будет работать только в том случае, если суперкласс находится в том же модуле, что и данный класс. В противном случае нужно предварительно импортировать модуль, в котором находится суперкласс Operator.
Вообще трудно говорить о связях, когда нет полного кода и алгоритма, что он делает. Добавлено через 21 минуту Я раньше советовал Лутца "Изучаем Python". Но во-первых это не для быстрого изучения, а во-вторых, 4-ое издание уже устарело, а что бы читать 5-ое издание, нужно уже хорошо знать классы (и ООП в целом), так как для новичков, трудно воспринимаем. Возможно это связано с корявым переводом на русский (перевод на русский, который я читал, 4-ого издания, был лучше). Я не достаточно знаю английский, что бы читать в оригинале. Лутц конечно замечательная книга, но для самостоятельного изучения новичком, она не под силу. По ней хорошо заниматься и достичь глубоких знаний Питона, но только если Вы изучаете ее под руководством куратора (профессионального программиста , хорошо знающего ООП), который разъясняет Вам все, что Вам по ходу изучения этой книги не понятно. Краткий курс ООП, для быстрого его освоения, я думаю может дать только хороший репетитор. Если же Вам просто нужен быстрый результат в написании кода, то выход только один, это фриланс. Что касается изучения Питона и в частности ООП, может кто то здесь посоветует что то хорошее из литературы. Я же по Питону ничего кроме Лутца не читал. Добавлено через 37 минут Лично я такие задачи решаю создавая вместо глобальной переменной экземпляр light класса GV (сокращение от Global Variable). Образец кода:
mcratveller, в такую квалифицированную переменную можно вносить изменения и читать из любого места программы. А что бы избегать ошибок, которые могут возникать при использовании обычных глобальных переменных, нужно в атрибут sources , когда Вы пишете код, вручную заносить все те места, которые вносят изменение в значение данной переменной. И учитывать этот список при отладке работы программы, что бы исключать возможные ошибки. Добавлено через 5 минут mcratveller, В Вашем случае, В в одном классе заносите значение в атрибут v такой переменной, а из другого класса читаете значение этого атрибута из этой переменной. Доступно в любом месте кода. Добавлено через 4 минуты Это в какой то степени тот же прием с атрибутом, который предложил Welemir1, но в таком виде делает его более универсальным, для использования в разных случаях.
0
|
10.06.2021, 16:46 | |
10.06.2021, 16:46 | |
Помогаю со студенческими работами здесь
12
Работа с классами (использование и применение классов) Использование одного элемента двумя классами Сортировка списка с классами по переменной в классе Использование имени метода/переменной, указанного в переменной String Запрет изменения переменной другими классами сборки Использование переменной при урезании другой переменной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |