Вы должны заполнить атрибут «Button» класса «CompoundButton» с помощью пути для рисования XML (my_checkbox). В XML-чертеже вы должны иметь:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_checked="false" android:drawable="@drawable/checkbox_not_checked" />
<item android:state_checked="true" android:drawable="@drawable/checkbox_checked" />
<item android:drawable="@drawable/checkbox_not_checked" /> <!-- default -->
</selector>
Не забудьте заменить my_checkbox на ваше имя файла флажка drawable, checkbox_not_checked с помощью вашего PNG-файла, который является вашим флажком, когда он не установлен, и checkbox_checked с ваше изображение, когда оно проверено.
Для размера непосредственно обновите параметры макета.
Я думаю, что решение регулярных выражений будет легче понять здесь. Это берет слова, которые заканчиваются заглавными буквами и добавляет подчеркивание и делает их строчными
import re
s = "courseID pathID apiID exampleABC DEF"
def underscore_lower(match):
return "_" + match.group(1).lower()
pat = re.compile(r'(?<=[^A-Z\s])([A-Z]+)\b')
print(pat.sub(underscore_lower, s))
# course_id path_id api_id example_abc DEF
Возможно, вам придется поиграть с этим регулярным выражением, чтобы заставить его делать именно то, что вы хотите. На данный момент он принимает заглавные буквы в конце слов, которым предшествует символ, который не является ни заглавной буквой, ни пробелом. Затем он делает эти буквы строчными и добавляет подчеркивание перед ними.
Проблема с вашим исправленным кодом заключается в том, что index
находит только первый вхождение заглавной буквы в строке. Поскольку вы повторяли экземпляры с одинаковыми заглавными буквами, функция никогда не находит последующие экземпляры. Вы можете упростить свой подход и избежать этой проблемы, просто объединяя буквы с подчеркиванием или без подчеркивания, в зависимости от того, являются ли они заглавными буквами при итерации.
Например:
def underscore_caps(s):
result = ''
for c in s:
if c.isupper():
result += f'_{c.lower()}'
else:
result += c
return result
print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d
Или немного более кратко, используя понимание списка и join
:
def underscore_caps(s):
return ''.join([f'_{c.lower()}' if c.isupper() else c for c in s])
print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d
У вас есть ряд проблем с вашим кодом:
string.index(letter)
дает индекс первого вхождения letter
, поэтому, если у вас есть несколько, например, D
, pos
будет обновляться только до положения первого. Вы можете исправить это, перебирая как позицию, так и букву, используя enumerate
, например. for pos, letter in enumerate(string):
_i_d
string
в parsed_string=string[:pos] + '_' + string[pos:]
Исправление всех этих проблем, которые у вас возникли бы:
def parse_variables(string):
new_string=''
for pos, letter in enumerate(string):
if letter.isupper() and pos+1 < len(string) and string[pos+1].isupper():
new_string += f'_{letter}'
else:
new_string += letter
return new_string.lower()
Но гораздо более простой метод:
"courseID pathID apiID".replace('ID', '_id')
<час> Обновление: ]
Учитывая разнообразие строк, которые вы хотите захватить, кажется, что регулярное выражение - это инструмент, который вы хотите использовать:
import re
def parse_variables(string, pattern=r'(?<=[a-z])([A-Z]+)', prefix='_'):
"""Replace patterns in string with prefixed lowercase version.
Default pattern is any substring of consecutive
capital letters that occur after a lowercase letter."""
foo = lambda pat: f'{prefix}{pat.group(1).lower()}'
return re.sub(pattern, foo, text)
text = 'courseID pathProjects apiCode'
parse_variables(text)
>>> course_id path_projects api_code