Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Дек. 11, 2016 19:50:34

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранить в csv

Помогите разобраться есть таблица пытаюсь ее сохранить с помощью

         def save_file(self):
            filesave_name = QtGui.QFileDialog.getSaveFileName(self, 'Сохранить', '', 'CSV(*.csv)')
            if not filesave_name is True:
                with open(str(filesave_name), 'w') as stream:
                    writer = csv.writer(stream)
                    for row in range(self.table.rowCount()):
                        rowdata = []
                        for column in range(self.table.columnCount()):
                            item = self.table.item(row, column)
                            if item is not None:
                                rowdata.append(item)
                            writer.writerow(rowdata)
получается просто пустой csv файл.

Офлайн

#2 Дек. 12, 2016 02:09:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5174
Репутация: +  482  -
Профиль   Отправить e-mail  

сохранить в csv

ROBOT-3000
  
if not filesave_name is True:
Истинность никогда через is не проверяется.

  
if not filesave_name:

ROBOT-3000
получается просто пустой csv файл.
Выведи данные на экран сначала.



Офлайн

#3 Дек. 12, 2016 11:54:49

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранить в csv

Вот мой черновик

 import sys, csv
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial
class Icons(QtGui.QWidget):
    def __init__(self, parent=None):
           QtGui.QWidget.__init__(self, parent)
           self.table = QtGui.QTableWidget(self)
           self.table.setRowCount(20)
           self.table.setColumnCount(20)
           self.table.setGeometry(0, 29, 1600, 1600)
           self.table.verticalHeader()
           self.table.horizontalHeader()
           self.table.show()
           self.table.horizontalHeader().hide()
           self.table.verticalHeader().hide()
        # test
           self.table.setColumnWidth(0, 30)
           self.table.setRowHeight(0, 30)
           self.table.resizeColumnsToContents()
           #self.table.resizeRowsToContents()
           self.setGeometry(300, 300, 800, 600)
           self.setWindowTitle('icon')
#################################################################################
           self.lay = QtGui.QHBoxLayout()
           self.lay.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
           self.lay.setMargin(0)
           self.lay.setSpacing(0)
           self.setLayout(self.lay)
           self._buttns = [
               {'btn': None, 'text': u'', 'img': 'sym1.png', 'ico': 'sym1.png'},
               {'btn': None, 'text': u'', 'img': 'sym2.png', 'ico': 'sym2.png'}]
           for i in self._buttns:
               i["btn"] = QtGui.QPushButton(i["text"])
               i["btn"].setIcon(QtGui.QIcon(i["ico"]))
               i["btn"].clicked.connect(partial(self.on_clicked_btn, i["img"]))
               self.lay.addWidget(i["btn"])
           self.btn = QtGui.QPushButton("save csv", self)
           self.btn.setGeometry(75, 0, 80, 30)
           self.btn.sizeHint()
           self.connect(self.btn, QtCore.SIGNAL("clicked()"), self.save_file)
##################################################################################
#-----------------------------
    def save_file(self):
        filesave_name = QtGui.QFileDialog.getSaveFileName(self, 'Сохранить', '', 'CSV(*.csv)')
        if not filesave_name is True:
            with open(str(filesave_name), 'w') as stream:
                writer = csv.writer(stream)
                for row in range(self.table.rowCount()):
                    rowdata = []
                    for column in range(self.table.columnCount()):
                        item = self.table.item(row, column)
                        if item is not None:
                            rowdata.append(str(item.text()))
                        writer.writerow(rowdata)
    def on_clicked_btn(self, img):
        _item = TableWidgetItem(img, "")
        self.table.setCellWidget(self.table.currentRow(), self.table.currentColumn(), _item)
#------------
##################################################################################
class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        label = QtGui.QLabel()
        label.setPixmap(QtGui.QPixmap(icon))
        label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(label)
#################################################################################
app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())

Текст сохраняет но криво(это пока не важно), но иконки которые вставляю вообще не показывает.
Без is True не работает. Не знаю в чем дело.
Моя задача сохранять в таблице иконки, а потом еще и открывать таблицу с иконками.
Можно даже не в табличном представлении, главное что бы сохраняло правильно,
тестил с дат файлом не вышло(может что то не так делал)

Отредактировано ROBOT-3000 (Дек. 12, 2016 12:33:34)

Офлайн

#4 Дек. 12, 2016 14:51:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5174
Репутация: +  482  -
Профиль   Отправить e-mail  

сохранить в csv

ROBOT-3000
Без is True не работает. Не знаю в чем дело.
Она возвращает либо строку с путём, либо пустую строку.
 if filesave_name:

ROBOT-3000
 if not filesave_name is True:
А вот это ерунда какая-то, которая говорит только о том, что ты питон вообще не знаешь. Там никогда не возвращается ни True, ни False.
  
>>> '' is True
False
>>> 'abc' is True
False
>>>
И вообще, is True в питоне не используется никогда. В книжке ты такое прочитать не мог, значит сам что-то вставлял там наугад. Можно не знать PyQt, но питон надо знать, если пишешь на нём, потому что метод тыка тут не прокатывает - получается неправильный код, который неправильно работает.

Ты должен вывести на экран сначала то, что должно сохраняться, чтобы убедиться, что там всё правильно выбирается и что оно вообще там есть.

ROBOT-3000
но иконки которые вставляю вообще не показывает
У меня всё показывает. И картинки вставляет, и числа в файл сохраняет. (На обеих версиях питона.)



Отредактировано py.user.next (Дек. 12, 2016 14:51:40)

Офлайн

#5 Дек. 12, 2016 15:06:32

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранить в csv

Тут ты прав я много чего не знаю, но учусь.
Да я уже просто закипаю от этого, какой день бьюсь и ни чего не выходит, вот и получается is True…..
Как вывести на экран, можешь подсказать?

Офлайн

#6 Дек. 12, 2016 15:53:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5174
Репутация: +  482  -
Профиль   Отправить e-mail  

сохранить в csv

ROBOT-3000
Как вывести на экран, можешь подсказать?
Просто делаешь print(rowdata) вместо записи в файл и смотришь в консоли, что выводится. А потом корректируешь код, пока не станет правильно выводиться всё. И только потом возвращаешь запись в файл.

Вообще, я так понимаю, ты просто пишешь не там. Нужно после цикла писать, когда ряд заполнен, а ты в цикле пишешь, когда ряд ещё заполняется. Вот для этого и нужно выводить на экран, чтобы видеть всё наглядно.



Офлайн

#7 Дек. 12, 2016 19:06:44

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранить в csv

Текст сохраняет но иконки игнорит будто их нет в чем проблема?

     def save_file(self):
        FS = QtGui.QFileDialog.getSaveFileName(self, 'Сохранить', '', 'CSV(*.csv)')
        if FS:
            with open(str(FS), 'w') as stream:
                writer = csv.writer(stream)
                for x in range(self.table.rowCount()):
                    row = []
                    for y in range(self.table.columnCount()):
                        item = self.table.item(x, y)
                        if item is not None:
                            row.append(str(item.text()))
                            print(row)
                        writer.writerow(row)

в этой строке?
 row.append(str(item.text()))

Отредактировано ROBOT-3000 (Дек. 12, 2016 19:08:05)

Офлайн

#8 Дек. 13, 2016 01:26:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5174
Репутация: +  482  -
Профиль   Отправить e-mail  

сохранить в csv

Там не надо в str() оборачивать, оно и так в виде строки передаётся.

Вот эту строку

ROBOT-3000
 writer.writerow(row)
надо сместить влево, чтобы она в цикле ряда была, а не в цикле колонок.

FS - неправильное имя, потому что большими (прописными) буквами называют константы. Переменная должна называться маленькими (строчными) буквами.

У меня картинки ставятся в клетки. При сохранении в файл сохраняются только строки из ячеек.

ROBOT-3000
Текст сохраняет но иконки игнорит будто их нет в чем проблема?
Потому что ты сохраняешь в CSV, это текстовый формат, туда картинки не сохраняются. Даже не знаешь, что делаешь. Картинки ставятся в клетки, но используются только для отображения. То есть ты ставишь туда число и туда же ставишь картинку на это число, и вот число будет сохранено в файл, а картинка будет просто показываться в окне.

Прочитай по питону что-нибудь для новичков. И прочитай про формат сохранения, какие они бывают. Потому что если ты нихрена не знаешь, то ты программу не сделаешь. Она сама не делается, она придумывается в голове, а потом записывается с помощью языка программирования, как картина художника записывается с помощью кисточки. Вот питон - это кисточка, а кисточка сама ничего не рисует.

Тебе приходится объяснять какую-то мелочёвку всё время, про которую в каждой книжке на первой странице рассказывают.



Отредактировано py.user.next (Дек. 13, 2016 01:33:49)

Офлайн

#9 Дек. 13, 2016 13:38:16

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранить в csv

Ты меня вообще не понимаешь, и помогать не хочешь а злорадствуешь.
Не надо мне мелочевку обьяснять.Книжки я читаю по мимо обучения пытаюсь что то делать на практике, у меня уже почти готовая программа осталось только пару функций допилить.
Я не хочу в таблицу сохранять картинки, я хочу чтобы сохраненный файл использовался для хранения данных. Вот в таблице например должно вставляться вот это sym1.png, потом это загружается обратно в таблицу и там появляется иконка(чего не происходит).
Если бы я все знал то здесь бы не спрашивал, и это не просто сохранить файл, а сохранить из таблицы QTablewidget по которой документация на C написана.

Офлайн

#10 Дек. 14, 2016 02:17:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5174
Репутация: +  482  -
Профиль   Отправить e-mail  

сохранить в csv

ROBOT-3000
Если бы я все знал то здесь бы не спрашивал
Ты выбрал CSV для хранения данных из таблицы, картинки в CSV не сохраняются, потому что он для текста сделан. Делать за тебя программу никто не будет. Сам ты её тоже не сделаешь, потому что элементарных вещей не знаешь ни в питоне, ни в форматах хранения, ни в PyQt. И ты, ничего не зная, говоришь, что у тебя программа почти готова. А что же она у тебя почти готова, а не готова до конца? А потому что ты картинку пытаешься сохранить туда, куда она не может быть сохранена. Так что бери книжку и читай её с первой страницы, иначе ты ничего знать не будешь и будешь писать только всякое такое нерабочее фуфло.

ROBOT-3000
а сохранить из таблицы QTablewidget по которой документация на C написана
Не на C, а на C++ - это разные языки и у них разные стандарты. Если ещё глубже вдаваться в подробности, то никто уже давным давно QTableWidget не использует, потому что это всё принято делать через модель, к которой подключается QTableView.
Так что ты просто этот код где-то взял и бездумно пытаешься его переделать, не понимая ни строчки. Тебе говорят, сдвинь оператор записи, а ты даже не понимаешь, что тебе говорят, - это ты не знаешь основ питона, а основы питона пишутся на первой страницы любой книжки.



Отредактировано py.user.next (Дек. 14, 2016 02:42:18)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version