Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4 Создание GUI на основе вход txt файла [RSS Feed]

#1 Апрель 17, 2012 15:04:18

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

FishHook
Вот твоя ошибка
Спасибо, быстро и оперативно

Офлайн

#2 Апрель 19, 2012 20:00:12

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

Снова всем доброго времени суток.
Не было бы ни каких вопросов если бы не одно но!
Как показано на рисунке вроде бы сетка строится нормально, но есть одно но,
а именно на вход всегда подается символ ‘'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), была моя ошибка все же он работает так как нужно рисунок

Офлайн

#3 Апрель 19, 2012 20:46:58

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

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

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

Вместо отдельно сетки и отдельно букв, возможно был бы лучше измененный формат файла.

Отредактировано reclosedev (Апрель 19, 2012 20:52:01)

Офлайн

#4 Апрель 20, 2012 00:40:28

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

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

Офлайн

#5 Апрель 20, 2012 17:47:20

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

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]

Офлайн

#6 Апрель 20, 2012 17:53:35

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

Спасибо большое reclosedev, будем разбираться

Офлайн

#7 Апрель 21, 2012 17:45:44

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

По поводу цикла вопросов нету.
А вот с файлами так разобраться и не могу
Как я понимаю что я написал на основе примера выше:
Сначала мы считаем все наши файлы и записываем все внутрь, после чего я перенаправляю в лоадгрид где он как я понял просто перечитывает строки и возвращает их в наш файл, далее идем на построение непосредственно сетки, где мы читаем файлы.
В моей логике должно работать и без 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() 
       
        

Офлайн

#8 Апрель 21, 2012 18:55:05

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

Точно то скопировали?

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()

Офлайн

#9 Апрель 22, 2012 00:24:08

INTJOGE
Зарегистрирован: 2012-04-15
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

Сделал так как вы сказали, но без результативно, если отслеживать 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)

Офлайн

#10 Апрель 22, 2012 09:25:09

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt4 Создание GUI на основе вход txt файла

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

Офлайн

  • Начало
  • » GUI
  • » PyQt4 Создание GUI на основе вход txt файла[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version