Форум сайта python.su
FishHookСпасибо, быстро и оперативно
Вот твоя ошибка
Офлайн
Снова всем доброго времени суток.
Не было бы ни каких вопросов если бы не одно но!
Как показано на рисунке вроде бы сетка строится нормально, но есть одно но,
а именно на вход всегда подается символ ‘'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_())
Офлайн
Проблемы в коде:
Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию 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)
Офлайн
Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию 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))
Вместо отдельно сетки и отдельно букв, возможно был бы лучше измененный формат файла.Увы что есть то есть
Офлайн
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]
Офлайн
Спасибо большое reclosedev, будем разбираться
Офлайн
По поводу цикла вопросов нету.
А вот с файлами так разобраться и не могу
Как я понимаю что я написал на основе примера выше:
Сначала мы считаем все наши файлы и записываем все внутрь, после чего я перенаправляю в лоадгрид где он как я понял просто перечитывает строки и возвращает их в наш файл, далее идем на построение непосредственно сетки, где мы читаем файлы.
В моей логике должно работать и без 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()
Офлайн
Точно то скопировали?
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()
Офлайн
Сделал так как вы сказали, но без результативно, если отслеживать 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)
Офлайн
Скорее всего проблема в общей логике. Из того, что прислали не видно откуда должен появится новый кроссворд в 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)
Офлайн