бла-бла-бла создавать 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()