Найти - Пользователи
Полная версия: PyQt4 Создание GUI на основе вход txt файла
Начало » GUI » PyQt4 Создание GUI на основе вход txt файла
1 2 3
INTJOGE
FishHook
Вот твоя ошибка
Спасибо, быстро и оперативно
INTJOGE
Снова всем доброго времени суток.
Не было бы ни каких вопросов если бы не одно но!
Как показано на рисунке вроде бы сетка строится нормально, но есть одно но,
а именно на вход всегда подается символ ‘'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)

Так же возник вопрос в апдейте сетки, то есть после нажатия кнопки генерейт, я посылаю запрос на выполнения скрипта по построения data и data2 как на рисунке и дальше перенаправляю на createGrid(data, data2) но результатов 0, возможно он их и добавляет на мою QGraphicsScene, но не апдейтит.

Код кнопки
    
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)
Так же у меня возникла идея почему он не перестраивает сетку из-за того что я свои txt фалы
задаю не в том месте а именно
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_())

Хотелось бы ответить по поводу layout.setSpacing(0), была моя ошибка все же он работает так как нужно рисунок

reclosedev
Проблемы в коде:

Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию 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
Зачем? Это всегда True.

table >= "1"
сравнивает не значение, а строку по алфавиту:
>>> "1" > "-"
True

item1.item2 - как в этом ориентироваться? названия должны быть вменяемыми.

sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" )
print a.word_bank()
open возвращает file, у него есть метод write File Objects

with open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) as f:
    f.write(a.word_bank())
Кстати, не стоит задавать полные пути в коде.

Вместо отдельно сетки и отдельно букв, возможно был бы лучше измененный формат файла.
INTJOGE
Слишком вложенный цикл с многократным перезаписыванием переменных. Ошибку в нем отследить сложно. Можно использовать функцию 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]

Более менее разобрался с данным циклом, но так и не понял почему на вход подается большое количество символа “a” в начале, после чего идут символы попарно “b” “b” и т.д буду дальше разбираться
если будут какие варианты в чем может быть дело

        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))
Вместо отдельно сетки и отдельно букв, возможно был бы лучше измененный формат файла.
Увы что есть то есть

А по поводу того что грид не хочет перестраиваться есть идеи? есть команда QtGui.QGraphicsScene.clear() которая очищает всю сцену, но почему заново не строится грид я не понимаю…
reclosedev
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)
Возможно проблемы с “а” уйдут или они находятся в коде Cell

INTJOGE
А по поводу того что грид не хочет перестраиваться есть идеи?
INTJOGE
Так же у меня возникла идея почему он не перестраивает сетку из-за того что я свои txt фалы задаю не в том месте а именно
Да, данные из файлов нужно перечитывать. И лучше, наверное создать функцию, которая бы загружала данные из файла и возвращала список, например:

def load_grid(filename):
     with open(filename) as file:
        return [line.split() for line in file if line]
INTJOGE
Спасибо большое reclosedev, будем разбираться
INTJOGE
По поводу цикла вопросов нету.
А вот с файлами так разобраться и не могу
Как я понимаю что я написал на основе примера выше:
Сначала мы считаем все наши файлы и записываем все внутрь, после чего я перенаправляю в лоадгрид где он как я понял просто перечитывает строки и возвращает их в наш файл, далее идем на построение непосредственно сетки, где мы читаем файлы.
В моей логике должно работать и без 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() 
       
        
reclosedev
Точно то скопировали?

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()
INTJOGE
Сделал так как вы сказали, но без результативно, если отслеживать 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) 
reclosedev
Скорее всего проблема в общей логике. Из того, что прислали не видно откуда должен появится новый кроссворд в 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])):
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