Проблема в текущем выводе Qt для терминалов на основе ячеек заключается в том, что символы различной ширины неправильно выровнены с сеткой ячеек, используемой терминалом. Один из обходных путей - попытаться применить выравнивание, используя другие символы позиционирования, а не просто печатая нестандартные символы. Двумя такими символами являются \t
и \b
- \t
- символ «табуляция» перенаправит печать на следующую «остановку табуляции» - по умолчанию, кратный 8 «ячейкам символов одинарной ширины». То есть используйте: print('?\t|\n\t|')
- вот что я получаю в Konsole (другой терминал на базе Qt):
\t for alignment">
(символ \b
означает «возврат», поэтому я напечатал 4 из них, чтобы «отойти» назад на 4 ячейки одинарной ширины, чтобы приблизиться к расположению, которое вы имели в виду)
использовать библиотеку терминалов
Другой вариант очень уместно, если вы хотите интерактивное приложение со сложным макетом (например, отображение цветов, принятие пользовательского ввода без необходимости ждать нажатия клавиши «ввод»), если вы используете библиотеку terminedia (заявление об отказе: автор этого проекта).
Позволяет вам явно работать с терминалом в виде сетки и будет «знать», когда печатаются символы нестандартной ширины, и округлять их ширину до двух ячеек.
Итак, чтобы отобразить то же самое с помощью terminedia, я создал объект «Экран», который позволяет мне использовать print_at
в точном месте - полный код, который я использовал:
import terminedia as TM
sc = TM.Screen()
sc.print_at((0, 10),'? |', color="red")
sc.print_at((0,11), ' | ', color="red")
sc.update()
Чтобы установить terminedia, используйте pip install git+https://github.com/jsbueno/terminedia.git
(извините, я виноват в том, что не сделал новую версию)