Форум сайта python.su
0
FishHookСпасибо, быстро и оперативно
Вот твоя ошибка

Офлайн
0
Снова всем доброго времени суток.
Не было бы ни каких вопросов если бы не одно но!
Как показано на рисунке вроде бы сетка строится нормально, но есть одно но,
а именно на вход всегда подается символ ‘'a’', также 1 элемент сетки строится совершенно не тот.
Код построения сетки:
def createGrid(self,data, data2): self.ce = [] self.scen = QtGui.QGraphicsScene(0.0, 0.0, 10*20+6, 10*20+6) self.scen.setBackgroundBrush(QtCore.Qt.white) self.view = QtGui.QGraphicsView(self.scen) self.xxx = QtGui.QGroupBox("PREVIEW") table = [line.split() for line in data.splitlines() if line] table2 = [line.split() for line in data2.splitlines() if line] layout = QtGui.QGridLayout() layout.addWidget(self.view) for i, table in enumerate(table): for j, table in enumerate(table): for i, table2 in enumerate(table2): for j, table2 in enumerate(table2): if (table == table and table2 == "-"): item1 = Cell(3 + j * 25, 3 + i * 25, i, j) item1.setBrush(QtCore.Qt.blue) item1.item2.setPlainText("") item1.item3.setPlainText("") self.scen.addItem(item1) if (table == table and table2 == "+"): item1 = Cell(3 + j * 25, 3 + i * 25, i, j) item1.setBrush(QtCore.Qt.white) item1.item2.setPlainText("") item1.item3.setPlainText(table) self.scen.addItem(item1) if table == table and table2 >= "1": item1 = Cell(3 + j * 25, 3 + i * 25, i, j) item1.setBrush(QtCore.Qt.white) item1.item2.setPlainText(table2) item1.item3.setPlainText(table) self.scen.addItem(item1) self.scen.setSceneRect(0, 0, 10*25+6, 10*25+6) self.view.ensureVisible(0, 0, 10, 10) self.xxx.setLayout(layout)
def buttonGenClick(self): a = crossword.Crossword(10, 10, '-', 5000, crossword.word_list) a.compute_crossword(2) sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) print a.word_bank() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setGrid.txt', "w" ) print a.solution() #print a.word_find() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumGrid.txt', "w" ) print a.display() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setQuare.txt', "w" ) print a.legend() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumQuare.txt', "w" ) print len(a.current_word_list), 'out of', len(crossword.word_list) #print a.debug self.createGrid(test_string,test_string1) self.createLable(test_string2)
if __name__ == '__main__': with open('C:/Users/INTJOGE/Desktop/PyCross/OutFile/setGrid.txt') as f: test_string = f.read() with open('C:/Users/INTJOGE/Desktop/PyCross/OutFile/setNumGrid.txt') as f: test_string1 = f.read() with open('C:/Users/INTJOGE/Desktop/PyCross/OutFile/setLableWorld.txt') as f: test_string2 = f.read() import sys app = QtGui.QApplication(sys.argv) dialog = Dialog() sys.exit(dialog.exec_())
Офлайн
173
Проблемы в коде:
Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию zip или индексы
for i, (row1, row2) in enumerate(zip(table1, table2)): for j, (col1, col2) in enumerate(zip(row1, row2)): print col1, col2 for i in range(len(table1)): for j in range(len(table1[i])): print table1[i][j], table2[i][j]
if table == table
table >= "1"
>>> "1" > "-" True
sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) print a.word_bank()
with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) as f: f.write(a.word_bank())
Отредактировано reclosedev (Апрель 19, 2012 20:52:01)
Офлайн
0
Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию zip или индексыfor i, (row1, row2) in enumerate(zip(table1, table2)): for j, (col1, col2) in enumerate(zip(row1, row2)): print col1, col2 for i in range(len(table1)): for j in range(len(table1[i])): print table1[i][j], table2[i][j]
self.scen = QtGui.QGraphicsScene(0.0, 0.0, 10*20+6, 10*20+6) self.scen.setBackgroundBrush(QtCore.Qt.white) self.view = QtGui.QGraphicsView(self.scen) self.xxx = QtGui.QGroupBox("PREVIEW") table = [line.split() for line in data.splitlines() if line] table2 = [line2.split() for line2 in data2.splitlines() if line2] layout = QtGui.QGridLayout() layout.addWidget(self.view) for i, table in enumerate(table): for j, table in enumerate(table): if table == "-": item1 = Cell(3 + j * 25, 3 + i * 25, j, i) item1.setBrush(QtCore.Qt.blue) item1.item2.setPlainText("") item1.item3.setPlainText("") self.scen.addItem(item1) else: for z, table2 in enumerate(table2): for q, table2 in enumerate(table2): if table2 == "+": item1 = Cell(3 + q * 25, 3 + z * 25, z, q) item1.setBrush(QtCore.Qt.white) item1.item2.setPlainText("") item1.item3.setPlainText(table) self.scen.addItem(item1) if table2 >="1": item1 = Cell(3 + q * 25, 3 + z * 25, z, q) item1.setBrush(QtCore.Qt.white) item1.item2.setPlainText(table2) item1.item3.setPlainText(table) self.scen.addItem(item1)
сравнивает не значение, а строку по алфавиту:Для моего варианта вполне подходит
item1.item2 - как в этом ориентироваться? названия должны быть вменяемыми.определение каким “карандашом” писать
self.item2 = QtGui.QGraphicsTextItem(parent=self) self.item2.setPlainText("") self.item2.setFont(QtGui.QFont("Verdana", 5, 75)) self.item2.setDefaultTextColor(QtGui.QColor("#050EFF")) self.item2.setPos(QtCore.QPointF(0, 0)) self.item3 = QtGui.QGraphicsTextItem(parent=self) self.item3.setPlainText("") self.item3.setFont(QtGui.QFont("Verdana", 10, 75)) self.item3.setDefaultTextColor(QtGui.QColor("#000000")) self.item3.setPos(QtCore.QPointF(5, 0))
Вместо отдельно сетки и отдельно букв, возможно был бы лучше измененный формат файла.Увы что есть то есть

Офлайн
173
INTJOGEОн стал еще более непонятным. Его можно упростить, примерно так:
Более менее разобрался с данным циклом
for i in range(len(table)): for j in range(len(table[i])): letter = table[i][j] grid = table2[i][j] item1 = Cell(3 + q * 25, 3 + z * 25, z, q) if letter == "-": item1.setBrush(QtCore.Qt.blue) else: item1.setBrush(QtCore.Qt.white) if grid.isdigit(): item1.item2.setPlainText(grid) item1.item3.setPlainText(letter) self.scen.addItem(item1)
INTJOGE
А по поводу того что грид не хочет перестраиваться есть идеи?
INTJOGEДа, данные из файлов нужно перечитывать. И лучше, наверное создать функцию, которая бы загружала данные из файла и возвращала список, например:
Так же у меня возникла идея почему он не перестраивает сетку из-за того что я свои txt фалы задаю не в том месте а именно
def load_grid(filename): with open(filename) as file: return [line.split() for line in file if line]
Офлайн
0
Спасибо большое reclosedev, будем разбираться
Офлайн
0
По поводу цикла вопросов нету.
А вот с файлами так разобраться и не могу
Как я понимаю что я написал на основе примера выше:
Сначала мы считаем все наши файлы и записываем все внутрь, после чего я перенаправляю в лоадгрид где он как я понял просто перечитывает строки и возвращает их в наш файл, далее идем на построение непосредственно сетки, где мы читаем файлы.
В моей логике
должно работать и без LoadGrid т.к мы сначала записываем в файл а потом читаем то что записали, но так как я думаю не работает и через LoadGrid тоже, возможно я что-то не так сделал, но догнать что именно пока понимания не хватает )
Файлы задаются только в самих функциях, больше ни где:
def buttonGenClick(self):
a = crossword.Crossword(15, 15, '-', 5000, crossword.word_list)
a.compute_crossword(2)
with open('setLableWorld.txt', "w" ) as f:
f.write(a.word_bank())
with open('setGrid.txt', "w" ) as f:
f.write(a.solution())
with open('setNumGrid.txt', "w" ) as f:
f.write(a.display())
with open('setQuare.txt', "w" ) as f:
f.write(a.legend())
self.LoadGrid()
def LoadGrid(self):
with open('setGrid.txt') as file:
return [line.split() for line in file if line]
with open('setNumGrid.txt') as file2:
return [line.split() for line in file2 if line]
self.createGrid()
def createGrid(self):
self.xxx = QtGui.QGroupBox("PREVIEW")
self.scen = QtGui.QGraphicsScene(0.0, 0.0, 15*20+6, 15*20+6)
self.scen.setBackgroundBrush(QtCore.Qt.white)
self.view = QtGui.QGraphicsView(self.scen)
with open('setGrid.txt') as f:
data = f.read()
with open('setNumGrid.txt') as f:
data2 = f.read()
Офлайн
173
Точно то скопировали?
LoadGrid сразу возвратит данные из первого файла, createGrid не запустится.
Я имел ввиду другое, когда говорил про создание функции.
def load_grid(self, filename): with open(filename) as file: return [line.split() for line in file if line] def createGrid(self): ... table1 = self.load_grid('setGrid.txt') table2 = self.load_grid('setNumGrid.txt') ... for ... def buttonGenClick(self): ... self.createGrid()
Офлайн
0
Сделал так как вы сказали, но без результативно, если отслеживать printom то программа лезет всегда в те файлы которые были загружены первый раз при запуске программы, то есть программка запомнила при запуске какие данные в файлах, и при каждом обращение к функции генерейт всегда строит по именно этим данным а не по новым.
фаил самой оболочки + построения грида: ФАЙЛ
def buttonGenClick(self): a = crossword.Crossword(15, 15, '-', 5000, crossword.word_list) a.compute_crossword(2) with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) as f: f.write(a.word_bank()) with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setGrid.txt', "w" ) as f: f.write(a.solution()) with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumGrid.txt', "w" ) as f: f.write(a.display()) with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setQuare.txt', "w" ) as f: f.write(a.legend()) self.createGrid() def LoadGrid(self,filename): with open(filename) as file: return [line.split() for line in file if line] def createGrid(self): self.xxx = QtGui.QGroupBox("PREVIEW") self.scen = QtGui.QGraphicsScene(0.0, 0.0, 15*20+6, 15*20+6) self.scen.setBackgroundBrush(QtCore.Qt.white) self.view = QtGui.QGraphicsView(self.scen) layout = QtGui.QGridLayout() layout.addWidget(self.view) table = self.LoadGrid('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setGrid.txt') table2 = self.LoadGrid('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumGrid.txt') for i in range(len(table)): for j in range(len(table2)): letter = table[i][j] grid = table2[i][j] item1 = Cell(3 + j * 25, 3 + i * 25, i, j) if letter == "-": item1.setBrush(QtCore.Qt.blue) self.scen.addItem(item1) else: item1.setBrush(QtCore.Qt.white) if grid.isdigit(): item1.item2.setPlainText(grid) item1.item3.setPlainText(letter) self.scen.addItem(item1) print letter else: item1.item2.setPlainText("") item1.item3.setPlainText(letter) self.scen.addItem(item1) print letter self.scen.setSceneRect(0, 0, 15*25+6, 15*25+6) self.view.ensureVisible(0, 0, 10, 10) self.xxx.setLayout(layout)
Отредактировано INTJOGE (Апрель 22, 2012 00:25:04)
Офлайн
173
Скорее всего проблема в общей логике. Из того, что прислали не видно откуда должен появится новый кроссворд в buttonGenClick, с этим разбирайтесь сами.
В цикле опять ошибка:
for i in range(len(table)): for j in range(len(table2)):
for i in range(len(table)): for j in range(len(table[i])):
Отредактировано reclosedev (Апрель 22, 2012 09:25:58)
Офлайн