#python
Вопрос:
Мне нужно просто заменить имя шрифта как RSQFont, если значение 123, или Обычное, если не значение .. Итак, у меня есть этот код …
if 123.value:
FontName='RSQFont'
else:
FontName='Regular'
"""<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
<widget source="Title" render="Label" font="%(key)s;23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
<widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="%(key)s;23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
<convert type="ClockToText">Format:%d-%m-%Y %H:%M:%S</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="%(key)s; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
<convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="%(key)s; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
<convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
</widget>
<widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="%(key)s;17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>""" % {'key': FontName,}
Но у меня есть эта ошибка
""" % {'key': FontName,}
TypeError: not enough arguments for format string
Я пробовал другой метод, но я не могу его решить …
Я пытался
.format(FontName)
вместо
{'key': FontName,}
И другие вещи, но ничего, что могло бы помочь …
и совет ?!!!
P. s: Я не могу использовать код %s, потому что в некоторых строках он уже есть, и я использую его с другими файлами python, как это
<convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
и
<convert type="ClockToText">Format:%d-%m-%Y %H:%M:%S</convert>
Комментарии:
1. почему бы не использовать f-строку или
str.format()
вместо форматирования строк в старом стиле или даже шаблонного движка , подобногоjinja2
?2. Возможно, это проблема с публикацией, но «код» в первой части вашего вопроса недействителен и не имеет смысла. Содержит ли он где-нибудь строку в тройных кавычках?
3. Теперь в этом больше смысла. Проблема в том, что строка содержит
%
символы, которые%
интерпретирует строковый оператор Python. Чтобы обойти это, вам нужно будет «экранировать» все остальные%
символы, удвоив их (чтобы%
строковый оператор мог превратить их обратно в отдельные символы). Более простым обходным решением было бы использовать более современныйstr.format()
метод, который использует{
}
символы и (как уже предлагал @buran).4. Другой альтернативой (которая также использует
{
}
символы и) было бы использование f-строк , которые были добавлены в Python 3.6.5. Если бы вы использовали
font="{0};23"
его, вам пришлось бы пройти толькоFontName
один раз.
Ответ №1:
Как уже упоминалось в комментариях — используйте f-строку:
font_name='RSQFont'
html = f"""<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
<widget source="Title" render="Label" font="{font_name};23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
<widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="{font_name};23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
<convert type="ClockToText">Format:%d-%m-%Y %H:%M:%S</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="{font_name}; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
<convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="{font_name}; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
<convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
</widget>
<widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="{font_name};17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>"""
print(html)
или str.format()
способ:
font_name='RSQFont'
html = """<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
<widget source="Title" render="Label" font="{font};23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
<widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="{font};23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
<convert type="ClockToText">Format:%d-%m-%Y %H:%M:%S</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="{font}; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
<convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
</widget>
<widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="{font}; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
<convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
</widget>
<widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="{font};17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>""".format(font=font_name) # or .format(**{'font':font_name})
print(html)
Вы также можете выбрать более сложное решение , используя шаблонный движок, например jinja2
, который является де-факто стандартным подходом в веб-разработке