Найти - Пользователи
Полная версия: PyQt4 и HTML
Начало » GUI » PyQt4 и HTML
1
Moonbite2006
Добрый вечер. Вдохновился глупой идеей, написать интерпретатор brainfuck'а на питоне с ГУИ и простеньким дебагером. Проблемы возникли с дебагом. Суть его такова, что снизу выводятся ячейки, а команда брейнфака, которая в данный момнет выполняется выделяется жирным шрифтом. Вот пример кода, для выделения команды жирным цветом:
def SyntaxLight(self):
string=str(self.inputText.toPlainText())
string=list(string)
for p in range(0,len(string)):
if p==self.i:
string[p]='<b>'+string[p]+'</b>'
temp=''.join(string)
temp.replace('<','&lt;')
temp.replace('>','&gt;')
self.inputText.setText(temp)
string=str(self.inputText.toPlainText()) - это строка берет из поле ввода команд все что есть
for p in range(0,len(string)):
if p==self.i:
string='<b>'+string+'</b>'
self.i - это текущее положение команды в inputText
if p==self.i: ищет данную команды, выдирает и вставляет на ее место'<b>'+string+'</b>', дабы текст был жирным.
temp=''.join(string) - текст объединяется и вставляется обратно в поле inputText, при этом старый вариант затирается
Все бы ничего, если бы определенном значении переменной string некоторые символы удивительным образом не исчезали, причем проверенно, символы исчезают сразу после команды self.inputText.setText(temp).
Например команда брейнфака-хеллоуворд( Даже не важно набирается она вручную или копируется из ХТМЛ источника.)
++++++++++>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
——.——–.>+.>.
Он после подсвечивания первой команды “+” переделывает в(стоит сказать, что команду он все таки подсвечивает:))
++++++++++[>+++++++>++++++++++>+++>+++ .>+.+++++++..+++.>++..+++. ——.——–.>+.>.
При этом не все списки команд он переделывает, понять при каких именно комбинациях не смог.
Подскажите где может быть проблема пожалуйста, а то уже прогу изуродовал три раза, ривербанк не помогает… Если требуется могу кинуть код всей программы. Заранее спасибо.
poltergeist
temp.replace('<','&lt;'), temp.replace('>','&gt;') - ты походу этим макаром теги разметки раскурочил:) Затем, цикл тут зачем? можно так написать: string = string + ‘<b>’ + string + </b> + string
Потом: лучше бы ты где-то запоминал код программы, а не брал его каждый раз из self.inputText; str.replace() - не делает преобразований на месте, их надо сохранить в переменную, т.е. вместо temp.replace('>','&gt;'), надо писать temp = temp.replace('>','&gt;').

В общем у меня это как-то так вышло:
your_raw_source_code = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++'

buffer = []
for c in your_raw_source_code:
if c == '<':
c = '&lt;'
elif c == '>':
c = '&gt;'
elif c == '\n':
c = '<br />'
buffer.append(c)


string = buffer[:self.i] + ['<b>'] + buffer[self.i] + ['</b>'] + buffer[self.i+1]
self.inputText.setText(''.join(string))
Moonbite2006
poltergeist
temp.replace('<','&lt;'), temp.replace('>','&gt;') - ты походу этим макаром теги разметки раскурочил:) Затем, цикл тут зачем? можно так написать: string = string + ‘<b>’ + string + </b> + string
Потом: лучше бы ты где-то запоминал код программы, а не брал его каждый раз из self.inputText; str.replace() - не делает преобразований на месте, их надо сохранить в переменную, т.е. вместо temp.replace('>','&gt;'), надо писать temp = temp.replace('>','&gt;').
Маркеры я уже потом приделал, подумал, что без них худо)
“лучше бы ты где-то запоминал код программы, а не брал его каждый раз из self.inputText; str.replace() ” Он сам берет в переменную из того окна. И если этого не делать, то придется писать дополнительный код для убирания “ожирения” команд, так как он берет в PlainText а записывает в Html. А переменная string хранит все команды, так же как и buffer у тебя)
Все равно как только я перекидываю текст в self.inputText он вырезает все теже символы. Даже без цикла и без маркеров)
P.S. Проверенно, переменная temp после экзекуций всех хранит именно ту инфу, какую надо. А символы убираются сразу после команды setText (может баг?). Добавление всего хтмл кода вручную результатов не дало…


Опытным путем было доказано, что символы изменяются при вставке любого хтмл кода. Эту функцию для подсветки отпочковал, так что дело не в коде всей программы, а именно в этой маленькой функции. Как вставлять хтмл код корректно?)
poltergeist
Ты что-то путаешь, у тебя в коде выше явные проблемы. Напиши тут какой хтмл ты вставляешь, что ожидаешь увидеть и что ты видишь на самом деле.
Попробуй сделать ещё print self.inputText.toHtml(), что выдаст?
У меня всё нормально сработало, возможно и баг, а возможно и ты где-то что-то упустил.
Moonbite2006
Вообщем дело обстоит так…
если выполнить команду
self.inputText.setHtml('++++++++++>++.>+.+++++++.
.+++.>++.<<+++++++++++++++.>.+++.——.——–.>+.>.')

он выдает в результате
++++++++++[>+++++++>++++++++++>+++>+++.>+.+++++++..+++.>++..+++.——.——–.>+.>.
то есть там теги или нет, все равно вырезает некоторые символы. Я хочу чтобы после смещения команды, в данном случае от первого + до второго +, второй плюс выделялся жирным, соответсвенно, когда выполняется третий +, то уже он подсвечивается жирным.

если вместо setHtml использовать setText или setPlaintext то отображается все правильно. Но если в строчке команд списать любой хтмл тег, то и при setText и при setHtml он высвечивает неправильно.
Moonbite2006
Ступил, все вы правильно написали, спасибо) Проблема была в ‘>’ и ‘<’, которые наверно он по ошибке воспринимал как десрикпотры хтмл, от сюда скрытие оного из текста
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB