#python #text-files
#python #текстовые файлы
Вопрос:
Я создаю свой первый интерфейс с Pyqt, используя «designer» и Python для его настройки.Функция def clickconector
возвращает заполнение формы и def radio_value
возвращает, если задание находится на рассмотрении или завершено («pendiente» или «terminado»). clickconector
и radio_value
* функции написаны правильно, но у меня проблемы с def text_file
функцией.
Проблема № 1: по какой-то причине сгенерированный файл имеет то же самое, что и заголовок, который появился бы, если radio_value
бы функция, поскольку она указывает в алгоритме, что это была другая функция clickconector
.
Проблема № 2: заголовок не записывается так, как я хочу. Я получаю это: ('Terminado', 'MT16'). txt
, (это написано .txt
в названии). Когда это должно быть: Terminado MT16
. Кроме того, тип файла не отображается для меня как .txt
, я должен выбрать, чтобы открыть его таким образом с помощью мыши
def clickconector (self):
relleno = [self.bitacora.text(), self.turno.text(), self.asesor.text(), self.item.text(), self.modelo.text(), self.identificacion.text(), self.rig.text(),self.horometro.text(),self.condicion.text(),self.orden.text(), self.observacion.text()]
form_label = ["bitacora", 'turno', 'asesor', 'item', 'modelo', 'identificacion', 'rig', 'horometro', 'condicion', 'orden', 'observacion']
for a,b in zip (form_label, relleno):
return (a,b)
def radio_value (self):
if self.pendiente.isChecked():
return 'Pendiente' , self.bitacora.text()
if self.terminado.isChecked():
return'Terminado', self.bitacora.text()
def text_file (self):
Bloc_title= self.radio_value()
f = open(str(Bloc_title) '. txt', 'w')
f.write(str(self.clickconector()))
return f
Комментарии:
1. Что вы пытаетесь записать в файл, это всегда будет выбирать первый элемент из relleno и form_label?
2. Это вызвано вызовом функции zip, которая будет по очереди добавлять элементы из массивов, но затем вы выбираете только первый из нового большего массива
3. @User1010 Я хочу записать все сгенерированные элементы в zip, «relleno» и «form_label», но он генерирует только первый, знаете почему?
4. как я должен это исправить? @User1010
5. Я внес изменения в свой ответ
Ответ №1:
Возвращаемый тип radio_value
— a tuple
. Вы преобразуете кортеж в строку, поэтому он будет напечатан в форме tuple
, т. е. "(value_a, value_b, value_c)"
и не value_a value_b value_c
. Вы можете использовать join
для объединения каждого значения кортежа с пробелом, например:
" ".join(self.radio_value())
Вы также написали ". txt"
, а не ".txt"
f = open(str(Bloc_title) '. txt', 'w')
в. Вот почему . txt
было указано в имени файла. Имея все это в виду, ваша text_file
функция должна выглядеть примерно так:
def text_file(self):
filename = f"{' '.join(self.radio_value())}.txt"
with open(filename, "w") as f:
f.write(" ".join(self.clickconnector()))
return f
Обратите внимание на использование with/open
вместо just open
. with/open
Настоятельно рекомендуется использовать для удобства чтения и общей простоты использования.
Комментарии:
1. Это не даст желаемого выходного имени файла и оставит запятую
2. @gmdev У меня есть еще один вопрос: в «def clickconector» возвращает только первый кортеж, и я хочу, чтобы все кортежи, я перепробовал много возможных решений, но ошибка та же: TypeError: может присоединиться только к итерируемому. Как я должен исправить эту часть, чтобы иметь данные для обоих списков?
3. Оператор return прерывает цикл for . Вы можете вернуть весь zip-файл, написав:
return list(zip(form_label, relleno))
Ответ №2:
Проблема 2,
Пара небольших проблем здесь вы помещаете файл ext так, как . txt
это должно быть .txt
. Обратите внимание на лишнее пространство.
Ваш Bloc_title
список, и поэтому вы получаете массив в заголовке, вам нужно будет добавить дополнительные части этого массива, это всегда будет иметь длину 2, поэтому вы можете сделать следующее,
def text_file (self):
Bloc_title = self.radio_value()
f = open(Bloc_title[0] ' ' str(Bloc_title[1] '.txt', 'w')
f.write(str(self.clickconector()))
return f
Обратите внимание, что вызов str может не потребоваться, но я не уверен в типе данных, возвращаемом self.bitacora.text()
.
Ответ из комментариев, если вам нужны все элементы из relleno и только первый из form_label, я бы предложил исправить clickconnector()
def clickconector (self):
relleno = [self.bitacora.text(), self.turno.text(), self.asesor.text(), self.item.text(), self.modelo.text(), self.identificacion.text(), self.rig.text(),self.horometro.text(),self.condicion.text(),self.orden.text(), self.observacion.text()]
form_label = ["bitacora", 'turno', 'asesor', 'item', 'modelo', 'identificacion', 'rig', 'horometro', 'condicion', 'orden', 'observacion']
return [form_label[0]] relleno
Комментарии:
1. Спасибо @User1010! И последний вопрос: если бы я хотел объединить оба списка, чтобы отобразить все элементы, как бы это было?
2. @cfsl Вы можете просто добавить два списка, relleno form_label потенциально используют zip без цикла for
3. Я пытался это сделать, но это не работает, потому что я получаю сообщение об ошибке: TypeError: может присоединиться только к итерируемому. Я новичок в этом и пытаюсь учиться, не могли бы вы помочь мне с этим? Это последнее, что мне нужно