@SOmar

Питон добавление в ComboBox?

как названия листов добавить в ComboBox и потом получить в sheet_by_index[]
import xlrd, csv
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class OpenFile(QtGui.QMainWindow):
   def __init__(self, parent=None):
       QtGui.QMainWindow.__init__(self, parent)
       self.setGeometry(300, 300, 325, 100)
       self.setWindowTitle(self.trUtf8('Выбор файла'))
       self.setWindowIcon(QtGui.QIcon('imageformats\icon.jpeg'))

       pButton = QtGui.QPushButton('Открыть файл', self)
       pButton.setGeometry(25, 15, 125, 25)       
       self.connect(pButton, QtCore.SIGNAL('clicked()'), self.showDialog)

       quit = QtGui.QPushButton('Выход', self)
       quit.setGeometry(175, 15, 125, 25)
       self.connect(quit, QtCore.SIGNAL('clicked()'),
                    QtGui.qApp, QtCore.SLOT('quit()'))

       comboBox = QtGui.QComboBox(self)
       comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
       comboBox.setObjectName(self.trUtf8("comboBox"))
             
   def showDialog(self):
       filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
      
       wbr = xlrd.open_workbook(filename,formatting_info=True)

       sheetName = []
       
       for sName in wbr.sheet_names():
          sheetName.append(wbr.sheet_by_name(sName))

       #//////////////////Индекс листа///////////////////////
       #sheet = wbr.sheet_by_index(0)

       vals = []
       i = 0
       a = 0

       for rows in range(sheet.nrows):
          vals.append(sheet.row_values(rows))

       #/////////////Удаляем из массива шапку Промоактивности//////////////
       for a in range(4):
          del vals[0]
          a = +1

       file_csv = open('C:\promo.csv', 'w')

       for i in range(sheet.nrows - 4):
          stroka_0 = str(vals[i]).replace('[','')
          stroka_1 = stroka_0.replace(',',';')
          stroka_2 = stroka_1.replace(']','')
          stroka_3 = stroka_2.replace(' ','')
          stroka_4 = stroka_3.replace("'",'')
          stroka_5 = stroka_4.replace(".0",'')
          file_csv.write(stroka_5 + "\n")
          i=+1

       file_csv.close()       
   
app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
sys.exit(app.exec())
  • Вопрос задан
  • 2378 просмотров
Решения вопроса 1
@Sergey6661313
бла-бла-бла создавать comboBox как переменную создаваемого объекта OpenFile:
class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
      ...   ...   ...
      self.comboBox = QtGui.QComboBox(self)
      self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
      self.comboBox.setObjectName(self.trUtf8("comboBox"))

тогда в методе showDialog можно обратится к self.comboBox:

for sName in wbr.sheet_names():
        sheetName.append(wbr.sheet_by_name(sName))
        self.comboBox.addItem(str(sName))


бла-бла-бла узнать его индекс можно методом currentIndex()
sheet = wbr.sheet_by_index(self.comboBox.currentIndex())


бла-бла-бал отдельным методом бла-бла-бла.
____________________________________________________________________________________________
дополнение к ответу:
подытожим: мы уже заменили все comboBox на self.comboBox (вы ведь так сделали ?)
убрали к (недружелюбное слово) sheetName и цикл его заполнения. (зачем он вам если у вас есть отличный comboBox?)
так же сам wbr нам тоже придётся сделать "долгоиграющей" переменной (мы его будем использовать в нашем "отдельном" методе, поэтому потерять его будет катастрофой. )

т.е довели метод def showDialog(self):
до след. 3-х строчек:
filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
self.wbr = xlrd.open_workbook(filename, formatting_info=True)
self.comboBox.addItems(self.wbr.sheet_names())

Что же делать со всем этим кодом ниже?
ну можно сделать ещё одну кнопочку "писать_в_csv" и метод-слот для вашего кода.
пример для связи кнопки и метода уже есть в вашем примере. нужно просто перед вашим кодом написать def вставте_суда_любое_название(self): и кнопку продублировать просто указать другое имя и другие координаты и там где connect поменять всё соответственно. И просто нажимать на кнопку после того как выберете лист.
class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        ...  ...  ...

        pButton2 = QtGui.QPushButton('записать в csv', self)
        pButton2.setGeometry(175, 55, 125, 25)
        self.connect(pButton2, QtCore.SIGNAL('clicked()'), self.slot_list_selected)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
        self.wbr = xlrd.open_workbook(filename, formatting_info=True)
        self.comboBox.addItems(self.wbr.sheet_names())

    def slot_list_selected(self):
        # //////////////////Индекс листа///////////////////////
        sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())

        ... ... ...


Но мы же не ищем легких путей ведь так?
+ мы хотим познакомится с QT поближе.
наш тру вариант без участия дополнительной кнопки:
метод я назвал slot_list_selected. и мы его соединим непосредственно с сигналом изменения combobox-а так:
self.comboBox.currentIndexChanged.connect(self.slot_list_selected) - это альтернативный более коротки метод связывания сигналов и слотов (чем self.connect(self.comboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.slot_list_selected) )
но есть запарка - сигнал не только вызывает метод но и передает ему int (выбранный индекс). Значит наш слот-метод должен его принимать.
def slot_list_selected(self, list_index):
ну и так как он нам всё равно передается мы могли бы его сразу использовать.
заместо sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())
sheet = self.wbr.sheet_by_index(list_index)
в принципе дальше ваш магический код вроде прекрасно работает. но он будет вызыватся в момент когда мы заполняем наш comboBox (изначально пустой combo показывает "-1", а когда заполняем его значение становится "0" что вызывает сигнал currentIndexChanged)
это решается выключением сигналов коммандой self.comboBox.blockSignals(True)
Но и тут вылезут подводные камни: в частности по умолчанию выберется первый элемент(с индексом 0) и попытавшись его выбрать индекс не изменится.
тут опять 2 выхода:
1) сделать первым итемом не имя листа а свой собственный. (если его ещё и назвать "выберите лист", то это будет служить дополнительной подсказкой для пользователя.)

переписываем self.comboBox.addItems(self.wbr.sheet_names()) на
self.comboBox.addItems(["выберите лист"] + self.wbr.sheet_names())
т.к. индексы сместились то и sheet вычисляем с индексом -1:
sheet = self.wbr.sheet_by_index(list_index-1)
и придется делать проверку на то что list_index больше нуля. (мы же не хотим читать лист под номером "-1")
if list_index:
ваш код.

вдоволь наигравшись с вашей программой замечаем что comboBox при выборе фаила заполняется но при этом не стирает предыдущие значения.
исправляем добавляя перед additems
self.comboBox.clear()

вроде бы всё хорошо.

2) более простой способ:
просто использовать сигнал activated вместо currentIndexChanged тогда оно будет реагировать даже на выбор уже выбранного. Но я всё равно рекомендую проделать операции из первого способа.

Суммарный код:
class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setGeometry(300, 300, 325, 100)
        self.setWindowTitle(self.trUtf8('Выбор файла'))
        self.setWindowIcon(QtGui.QIcon('imageformats\icon.jpeg'))

        pButton = QtGui.QPushButton('Открыть файл', self)
        pButton.setGeometry(25, 15, 125, 25)
        self.connect(pButton, QtCore.SIGNAL('clicked()'), self.showDialog)

        quit = QtGui.QPushButton('Выход', self)
        quit.setGeometry(175, 15, 125, 25)
        self.connect(quit, QtCore.SIGNAL('clicked()'),
                     QtGui.qApp, QtCore.SLOT('quit()'))

        self.comboBox = QtGui.QComboBox(self)
        self.comboBox.setGeometry(QtCore.QRect(25, 55, 125, 25))
        self.comboBox.setObjectName(self.trUtf8("comboBox"))
        self.comboBox.activated.connect(self.slot_list_selected)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Выбор файла', '*xls')
        self.wbr = xlrd.open_workbook(filename, formatting_info=True)
        self.comboBox.blockSignals(True)
        self.comboBox.clear()
        self.comboBox.addItems(["выберите лист"] + self.wbr.sheet_names())
        self.comboBox.blockSignals(False)


    def slot_list_selected(self, list_index):
        if list_index:
            # //////////////////Индекс листа///////////////////////
            sheet = self.wbr.sheet_by_index(list_index-1)
            print(list_index)
    
            vals = []
            i = 0
            a = 0
    
            for rows in range(sheet.nrows):
                vals.append(sheet.row_values(rows))
    
            # /////////////Удаляем из массива шапку Промоактивности//////////////
            for a in range(4):
                del vals[0]
                a = +1
    
            file_csv = open('C:\promo.csv', 'w')
    
            for i in range(sheet.nrows - 4):
                stroka_0 = str(vals[i]).replace('[', '')
                stroka_1 = stroka_0.replace(',', ';')
                stroka_2 = stroka_1.replace(']', '')
                stroka_3 = stroka_2.replace(' ', '')
                stroka_4 = stroka_3.replace("'", '')
                stroka_5 = stroka_4.replace(".0", '')
                file_csv.write(stroka_5 + "\n")
                i = +1
    
            file_csv.close()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SOmar Автор вопроса
Я сначала выбираю книгу. В ComboBox подгружаю листы из книги. Выбираю лист и данные из него записываю в csv файл! Вопрос можешь если тебе не сложно так же красиво описать "Т.е. весь код ниже скорее всего необходимо сделать отдельным методом" как это сделать!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
25 нояб. 2024, в 21:54
20000 руб./за проект
25 нояб. 2024, в 21:39
3000 руб./за проект
25 нояб. 2024, в 21:34
7000 руб./за проект