Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/75: Рейтинг темы: голосов - 75, средняя оценка - 4.52
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

Добавление нескольких файлов для последующего редактирования

03.09.2019, 12:20. Показов 16047. Ответов 158

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане! Не так давно, благодаря знатокам из данного форума была написана (спасибо за всё) программа. Суть её в следующем: На диске лежат файлики в которых 20 строк, каждую десятую строку программа вставляет пустую строку, затем копирует содержимое 10-й строки, добавляет перед пустой строкой (проще говоря дублирует 10-ю строку), затем дублирует 11-ю и добавляет перед 11-й строкой (капец туфтология), наглядно это вот так:

Было:
7
8
9
10
11
12
13

Стало:
7
8
9
10
10

11
11
12
13

И так программка делает каждую 10-ю строку! Строк может быть уйма. Всё работает всё делится, как надо, вопрос таков:
Файлов которые нужно редактировать много, поэтому, я хотелось бы сделать, что-то типа добавления или запоминания нескольких файлов, а затем их сразу переделывать, что каждый раз не указывать файл заново. Файлы лежат в разных папках, поэтому забирать из корня не выйдет. Желательно сделать наглядно, чтобы я уже видел, какие файлики я добавил, а какие нет! Заранее спасибо за помощь!

Собственно и сама программа:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from tkinter import *
from tkinter import ttk
import os
 
from tkinter import messagebox
from tkinter import filedialog
 
def update_the_label():
    lb0 = Label(window, text = "-")
 
def clicked_dialogOpen():
    global choosefile
    choosefile=filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("all files", "*.*")))
    lb0 = Label(window, text = choosefile)
    lb0.pack(side ="top")
 
def clicked():
    try:
        with open(choosefile, 'r+', encoding='utf-8') as f:
            lines = f.readlines()
            f.seek(0)
            for i in range(int(combo.get())-1, len(lines), int(combo.get())):
                lines[i]+=lines[i][0:21] + "\n\n"
                if i <len(lines)-1:
                    lines[i+1]=lines[i+1][0:21] + " Информация: " + "\n" + lines[i+1]
            f.writelines(lines)
        f.close()      
    except:
        messagebox.showerror("Ошибка", "Дядь, файлик то выбери!")
    messagebox.showinfo("Завершение", "Готова")
 
window = Tk()
window.title("Дырка")
window.geometry('220x400')
window.resizable('false', 'false')
 
lb1 = Label(window, text = "Диапазон строк: ")
lb1.pack(side ="top")
 
combo=ttk.Combobox(window, values=(2,10,50,100,250,500,600,700,800,900,1000), width=28)
combo.current(0)
combo.pack(side ="top")
 
btn3 = Button(window, text = "Обновить список", command = update_the_label, width=26)
btn3.pack(side = "top")
 
btn2 = Button(window, text = "Открыть файл", command=clicked_dialogOpen, width=26)
btn2.pack(side ="top")
 
btn = Button(window, text ="Зарубить", command=clicked, width=26)
btn.pack(side ="top")
 
lb2 = Label(window, text = "_________________________")
lb2.pack(side ="top")
 
lb3 = Label(window, text = "Список отредактированных файлов:")
lb3.pack(side ="top")
 
window.mainloop()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2019, 12:20
Ответы с готовыми решениями:

Сохранить данные из них для последующего просмотра и редактирования
имеется несколько полей в которые заносятся данные. как мне сохранить данные из них для последующего просмотра и редактирования?

Как целиком загрузить таблицу из SQL БД в браузер для последующего её редактирования?
Как целиком загрузить таблицу из SQL БД в браузер для последующего её редактирования?

Добавление картинки через диалоговое окно по кнопке, для последующего сохранения в таблицу
Здравствуйте, в бд имеется таблица с полями Оле. В поля Оле добавляются картинки с изделиями. Создал форму для добавления картинок и...

158
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.09.2019, 14:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Damenikx Посмотреть сообщение
У меня теперь каша в голове, получается использовать глобальные переменные всё-таки можно)))
Можно, но не нужно, пример из личного опыта:
Работал с 1 источником питания объявил его параметры глобальными переменными, все работало на ура.
Появилась потребность подключить 2 источника, выставляя напряжение на одном, на другом тоже значение поменялось.
Результат: сжег весьма дорогой девайс.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
06.09.2019, 14:56  [ТС]
Оооооооооооооо, а вот это уже прям жизненно!
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
06.09.2019, 17:39
DmFat, проблема масштабирования
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.09.2019, 18:57
Цитата Сообщение от Damenikx Посмотреть сообщение
получается использовать глобальные переменные всё-таки можно
Если Вы хорошо понимаете как работают глобальные переменные и поэтому они не будут создавать Вам проблем, а только помогать, то используйте их. Если же возникнут с глобальными переменными проблемы, то не используйте их. Критерий очень простой. Единственно что можно сказать, когда используются глобальные переменные как у Вас, без определения их на верхнем уровне модуля, то при чтении кода другими людьми, а может и Вами в будущем ( если Вы не комментируете свой код) , то могут возникнуть сложности с пониманием текста. Это из-за того, что на верхнем уровне в случае , как у Вас, они присутствую только динамически в пространстве имен модуля, и то, только тогда, когда была запущена содержащая глобальную переменную функция. Что бы упростить такой код для понимания, можно задать необходимые переменные, которые будут затем в функции объявлены глобальными, разместив их вначале кода, как переменные пространства имен модуля.
Это будет избыточный код, но улучшающий читаемость программы.
Кстати в своей программе я так и делаю, определяю переменные в начале модуля, которые потом в функциях будут объявляться как глобальные. При этом сразу присваиваю им некоторые значения по умолчанию. Кстати в Вашем случае для лучшей читаемости можно было переменную choosefile задать в начале кода (сразу после импорта), на уровне пространства имен модуля, присвоив в качестве значения пустую строку '' . Эти строки в работе программы ничего не меняют, но читаемость программы улучшается.

Добавлено через 6 минут
Проблема, о которой рассказал DmFat, возникла из-за не правильного структурирования пространств имен. Если бы источник 1 и источник 2 имели бы разные, свои собственные пространства имен, то проблем бы небыло, так как не было бы пересечения пространств имен для разных источников.
И еще раз повторюсь, для работы с глобальными переменными нужно хорошо понимать структуру пространств имен и областей видимости, последнее кстати не одно и то же.

Добавлено через 10 минут
Кстати самый простой способ структурирования пространств имен, это использование модулей и импортретирование их с помощью синтаксиса import ... , а не инструкции from ... import ... , так как последняя смешивает пространства имен, объединяя пространство имен модуля с пространством имен вызывающего сценария. Именно тогда и возникают проблемы как у DmFat.

Добавлено через 16 минут
Структурировать пространства имен можно так же с помощью классов. Каждый экземпляр класса имеет свое пространство имен и они не пересекаются. Если бы у DmFat, источник 1 и источник 2, были созданы как экземпляры класса "Источник", то проблем, которые у него случились так же можно было избежать.
Damenikx, это я Вам пишу в качестве небольшой консультации, а для более глубокого понимания, как говорит Welemir1, читайте литературу, Я например читаю Лутца.
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
06.09.2019, 18:58
Цитата Сообщение от Viktorrus Посмотреть сообщение
Проблема, о которой рассказал DmFat, возникла из-за не правильного структурирования пространств имен. Если бы источник 1 и источник 2 имели бы разные, свои собственные пространства имен, то проблем бы небыло, так как не было бы пересечения пространств имен для разных источников.
Цитата Сообщение от Viktorrus Посмотреть сообщение
, для работы с глобальными переменными нужно хорошо понимать структуру пространств имен
Это называется классы То есть отказ от глобалок, иными словами.

Цитата Сообщение от Viktorrus Посмотреть сообщение
Кстати самый простой способ структурирования пространств имен, это использование модулей
Вы серьёзно? Для задачи с двумя одинаковыми источниками питания, как в задаче DmFat, один модуль - для одного, второй - для второго? По тексту получается так.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.09.2019, 19:48
Цитата Сообщение от Welemir1 Посмотреть сообщение
For now, though, especially if you are relatively new to programming, avoid the temptation to use globals whenever you can—they tend to make programs difficult to understand and reuse, and won’t work for cases where one copy of saved data is not enough.
Даю перевод.
На данный момент, однако, особенно если вы относительно новичок в программировании, избегайте соблазна использовать глобалы, когда вы можете—они, как правило, затрудняют понимание и повторное использование программ и не будут работать в тех случаях, когда одной копии сохраненных данных недостаточно.
Здесь Лутц говорит не об использовании глобальных переменных вообще, а только о том, что для их использования на данный момент (то есть на данной стадии обучения), когда Вы еще не умеете грамотно использовать глобальные переменные, нужно стараться их избегать.
Вообще интересный принцип Вы предлагаете. Если какая то область знания сложная и при не правильном ее использовании может привести к сбою, то вы предлагаете не использовать эти знания, вместо того, что бы как следует это изучить и не допускать ошибок в использовании этого знания.
Я использую глобальные переменные и у меня все работает без сбоев.
Вы же так запудрили мозги Damenikx, Что у него даже та часть кода, которая работала, перестала работать.
У меня же принцип другой, если можешь используя какой либо прием писать код без ошибок, значит имеет смысл использовать его, когда он упрощает задачу.
У Damenikx, основной код, с использованием глобальной переменной нормально работал, а проблема в другом, которую вы даже и не поняли, и тогда прицепились к глобальной переменной, которая у него нормально работала. А теперь без глобальной переменной программа вообще перестала работать. Вот уж помогли.
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
06.09.2019, 19:59
Viktorrus, ты всю главу прочел? он там много чего написал и привел примеры, я только цитатку одну привел.
Цитата Сообщение от Viktorrus Посмотреть сообщение
Я использую глобальные переменные и у меня все работает без сбоев.
это потому что ты пишешь только для себя и никто твой код не видит, ты и файл закрываешь после использования менеджера контекста, ревью то никто не проводит, ошибка ничего не стоит, тесты не падают, команду не подводишь. Я писал выше и еще раз тебе повторю - пиши как хочешь для себя. Но если ты уж пытаешься кого то учить, то учи правильно, обладая необходимой матчастью.
ТС я тоже сказал -пусть использует что хочет, ему сейчас не глобал нужен и не твои вредные советы, а много читать, с самых основ, а он ленится. Но он может и не читать, это его право, можно всю жизнь писать вот такие программки для себя и прекрасно себя чувствовать.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
07.09.2019, 08:47  [ТС]
Welemir1, чтением можно ещё больше запудрить себе мозг. Вы не можете с уверенностью сказать, читал я или нет. Пару постов выше я говорил: "я прочитал", вы же всё равно говорите читать. При этом получается практики нет и надо постоянно читать. Я не могу зубрить, у меня не получается запоминать, когда я читаю, я запоминаю "на практике", так проще для меня. Я могу прочитать один абзац 10 раз и не запомнить его, но один раз сделав запоминаю. Так сколько надо читать Лутца, чтобы Вы сказали "вот теперь можешь писать не только свои говнопрограмки"?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
07.09.2019, 09:18
Цитата Сообщение от Damenikx Посмотреть сообщение
Так сколько надо читать Лутца, чтобы Вы сказали "вот теперь можешь писать не только свои говнопрограмки"?
так надо не просто читать а прорешивать все что прочел, хотя бы просто в консольке, если проблемы с памятью то вести конспект что и как используется. Все приходит с опытом. Например что такое менеджер контекста, для чего он используется, что неверно в вашем общем коде с его использованием?
Что такое except, почему нельзя использовать его так как у тебя (не указав исключения)?
Но ты опять не правильно отнесся, я не настаиваю, не читай, пиши как бог на душу положит, главное же "чтоб код работал".
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
07.09.2019, 09:43  [ТС]
Welemir1, я учусь. Я не студент, которому дали задание на дом и он просит решить его на форуме. Я взял просто идею создания мааааааааленькой програмки и пытаюсь сделать с поддержкой людей с форума, которые знают и которые подскажу. Я не прошу написать за меня код или "сделайте на меня програмку". Я спрашиваю и если мне указывают на ошибку, то спасибо большое. Всегда отношусь к критике с пониманием. Вот из вашего поста я теперь понимаю - "ага, исключения не правильно написаны, надо бы пересмотреть".
0
07.09.2019, 09:47

Не по теме:

тему можно переименовывать в ликбез по пайтону

1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
07.09.2019, 09:58  [ТС]
Welemir1, посмотрите вот эту тему, одним глазком . Там форумчанин, просто, разжевал настолько, что я офигел. При этом я его не просил. Но ему просто стало интересно. Сейчас я с ним хорошо общаюсь. Он не говорил мне: "иди читай". Мы доходили до какого-то момента, где у меня начинался ступор (а она начинался часто) и я шёл читать мат. часть именно в том куске до которого, до меня не доходило. Я понимаю, что никто не должен тут водить меня за ручку и всему учить, нет конечно. Просто "иди читай, много читай" и "прочти тут вот это и ты поймёшь" это две разные вещи.

Скачивание папки с FTP - сервера по актуальной дате

Добавлено через 1 минуту

Не по теме:

Alli_Lupin, а чо, хорошо сидим, общаемся с умными людьми. Но да, вопрос темы не решён, зато интересно же! :)



Добавлено через 8 минут
Вот вчера, когда тут была дискуссия по поводу глобалок, использовать их или нет, я пришёл к выводу, что на моём уровне знаний, вот сейчас, я могу использовать глобальные переменные, но при этом надо понимать, что при более больших и значимых приложениях этого делать не стоит. Вывод этот пришёл не потому что я пошёл рыть всего Лутца, а потому что люди сами здесь эту дискуссию и начали, кто-то считает, что можно, а кто-то нет. Возможно, когда-нибудь, в далёком будущем я и до этого момента дойду и вспомню, что Welemir1, очень не советовал их использовать и тогда моё мнение о глбальных переменных поменяется и я не стану их использовать. Да я понимаю, что нужно сразу учиться делать всё правильно, но приходит это не сразу, а с опытом.
0
5042 / 1069 / 149
Регистрация: 29.01.2013
Сообщений: 6,241
07.09.2019, 10:03
Damenikx, сидим хорошо, но у меня больше полусотни писем за 3 дня))
1
07.09.2019, 10:06  [ТС]

Не по теме:

Alli_Lupin, Сегодня же суббота, расслабься :)

0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
07.09.2019, 12:35
Damenikx, Как я понимаю Ваша задача пока не решена. Вы так и не уточнили условие задачи и не написали алгоритм, что должен делать код в отношении вывода информации внизу формы. Вечером займусь и напишу пример решения Вашей задачи так, как я ее вижу. А Вы потом уточните, то ли Вам нужно.

Не по теме:

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

1
07.09.2019, 17:27  [ТС]

Не по теме:

Viktorrus, вы как - то поздновато собрались, мы уже дасквуд закончили :))

0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.09.2019, 12:53
Damenikx, Вот я в качестве примера сделал вариант вывода информации внизу формы.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from tkinter import *
from tkinter import ttk
import os
 
from tkinter import messagebox
from tkinter import filedialog
 
count = 1
countS = 0
countP = 0
dictS = {}
dictP = {}
 
def makeWidgets():
    # создание графической формы
    global combo
    window = Tk()
    window.title("Дырка")
    window.geometry('220x400')
    window.resizable('false', 'false')
 
    lb1 = Label(window, text = "Диапазон строк: ")
    lb1.pack(side ="top")
 
    combo=ttk.Combobox(window, values=(2,10,50,100,250,500,600,700,800,900,1000), width=28)
    combo.current(0)
    combo.pack(side ="top")
 
    btn3 = Button(window, text = "Очистить список", command = clean_the_label, width=26)
    btn3.pack(side = "top")
 
    btn2 = Button(window, text = "Выбрать файл", command=clicked_dialogOpen, width=26)
    btn2.pack(side ="top")
 
    btn = Button(window, text ="Зарубить", command=clicked, width=26)
    btn.pack(side ="top")
 
    for i in range(5):
        lb = Label(window, text = "-")
        lb.pack()
        dictS["lS"+str(i)] = lb
 
    lb2 = Label(window, text = "_________________________")
    lb2.pack()
    
    lb3 = Label(window, text = "Список отредактированных файлов:")
    lb3.pack()
 
    for i in range(5):
        lb = Label(window, text = "-")
        lb.pack()
        dictP["lP"+str(i)] = lb
 
    return window
 
def clean_the_label():
    # очистка списка
    global count, countS, countP
    for i in dictS.keys():
        dictS[i].config(text = "-")
    for i in dictP.keys():
        dictP[i].config(text = "-")
    count = 1
    countS = 0
    countP = 0
 
def clicked_dialogOpen():
    global choosefile, count, countS, dictS
    choosefile=filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("all files", "*.*")))
    keysLS = list(dictS.keys())[countS]
    dictS[keysLS].config(text = str(count) + ') ' + choosefile)
    count += 1
    if countS < 4:
        countS += 1
    else:
        countS = 0
 
def clicked():
    global choosefile, count, countP, dictP
    try:
        with open(choosefile, 'r+', encoding='utf-8') as f:
            lines = f.readlines()
            f.seek(0)
            for i in range(int(combo.get())-1, len(lines), int(combo.get())):
                lines[i]+=lines[i][0:21] + "\n\n"
                if i <len(lines)-1:
                    lines[i+1]=lines[i+1][0:21] + " Информация: " + "\n" + lines[i+1]
            f.writelines(lines)
        f.close()
        keysLP = list(dictP.keys())[countP]
        dictP[keysLP].config(text = str(count-1) + ') ' + choosefile)
        if countP < 4:
            countP += 1
        else:
            countP = 0
    except:
        messagebox.showerror("Ошибка", "Дядь, файлик то выбери!")
    messagebox.showinfo("Завершение", "Готова")
 
if __name__ == '__main__':
 
    window = makeWidgets()
    window.mainloop()

Было бы нагляднее выводить информацию сдвигая строчки вверх при заполнении блока списка. Но я не знаю как просто прочитать запись из метки. Или нужно вести параллельный список этих записей, и брать оттуда или использовать для вывода информации не Label а виджет Entry. У него есть методы set() и get().
Но это Вы решайте сами. Вы же не дали алгоритма, что Вам нужно делать.
Еще не плохо было бы вести базу данных обработанных файлов, что бы повторно не пускать файл в обработку. Но я не знаю, что Вы делаете с обработанными файлами. Может переносите их в другую папку. Потом я не знаю, поступают ли новые файлы с одинаковыми именами.
В общем я многого не знаю, что бы написать окончательный вариант кода.
Поэтому используя мой пример пишите тот код, который Вам нужен.

Добавлено через 23 минуты
Damenikx, Извините, я как всегда разбираясь с задачей, уже забыл что Вы написали в условии. Сейчас перечитал и оказалось я не совсем то сделал. Вы хотите выбрать несколько файлов и обработать их оптом. Но тогда Вам в форме нужно добавлять кнопку "Обработать все" только предварительно очищать список, и выбирать файлы, что бы обработать их оптом.
Хотя под "Зарубить" можно подразумевать именно обработку всех выбранных файлов. Что бы так сделать, нужно в мой код добавить создание списка выбранных файлов и потом в цикле обрабатывать все файлы из этого списка.
Попробуйте это сделать сами, если не получится, то обращайтесь.

Добавлено через 7 минут
Но в таком варианте, Вы зараз можете вывести информацию о выбранных фалах, не более чем позволяют размеры формы. Или нужно создавать дополнительные формы для вывода информации о выбранных файлах и форму с информацией об обработанных файлах. Решите, что Вам нужно.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.09.2019, 21:19
Damenikx, Вот переделал что бы обрабатывало оптом.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from tkinter import *
from tkinter import ttk
import os
 
from tkinter import messagebox
from tkinter import filedialog
 
count = 1
countS = 0
countP = 0
dictS = {}
dictP = {}
chooseList = []
 
def makeWidgets():
    # создание графической формы
    global combo
    window = Tk()
    window.title("Дырка")
    window.geometry('220x400')
    window.resizable('false', 'false')
 
    lb1 = Label(window, text = "Диапазон строк: ")
    lb1.pack(side ="top")
 
    combo=ttk.Combobox(window, values=(2,10,50,100,250,500,600,700,800,900,1000), width=28)
    combo.current(0)
    combo.pack(side ="top")
 
    btn3 = Button(window, text = "Очистить список", command = clean_the_label, width=26)
    btn3.pack(side = "top")
 
    btn2 = Button(window, text = "Выбрать файл", command=clicked_dialogOpen, width=26)
    btn2.pack(side ="top")
 
    btn = Button(window, text ="Зарубить", command=processFiles, width=26)
    btn.pack(side ="top")
 
    for i in range(5):
        lb = Label(window, text = "-")
        lb.pack()
        dictS["lS"+str(i)] = lb
 
    lb2 = Label(window, text = "_________________________")
    lb2.pack()
    
    lb3 = Label(window, text = "Список отредактированных файлов:")
    lb3.pack()
 
    for i in range(5):
        lb = Label(window, text = "-")
        lb.pack()
        dictP["lP"+str(i)] = lb
 
    return window
 
def clean_the_label():
    # очистка списка
    global count, countS, countP, chooseList
    chooseList = []
    for i in dictS.keys():
        dictS[i].config(text = "-")
    for i in dictP.keys():
        dictP[i].config(text = "-")
    count = 1
    countS = 0
    countP = 0
 
def clicked_dialogOpen():
    global choosefile, count, countS, dictS
    choosefile=filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("all files", "*.*")))
    chooseList.append(choosefile)
    keysLS = list(dictS.keys())[countS]
    dictS[keysLS].config(text = str(count) + ') ' + choosefile)
    count += 1
    if countS < 4:
        countS += 1
    else:
        countS = 0
 
def clicked(choosefile):
    global count, countP, dictP
    try:
        with open(choosefile, 'r+', encoding='utf-8') as f:
            lines = f.readlines()
            f.seek(0)
            for i in range(int(combo.get())-1, len(lines), int(combo.get())):
                lines[i]+=lines[i][0:21] + "\n\n"
                if i <len(lines)-1:
                    lines[i+1]=lines[i+1][0:21] + " Информация: " + "\n" + lines[i+1]
            f.writelines(lines)
        f.close()
        keysLP = list(dictP.keys())[countP]
        dictP[keysLP].config(text = str(chooseList.index(choosefile) + 1) + ') ' + choosefile)
        if countP < 4:
            countP += 1
        else:
            countP = 0
    except:
        messagebox.showerror("Ошибка", "Дядь, файлик то выбери!")
    #messagebox.showinfo("Завершение", "Готова")
 
def processFiles():
    for file in chooseList:
        clicked(file)
    messagebox.showinfo("Завершение", "Готова")
 
if __name__ == '__main__':
 
    window = makeWidgets()
    window.mainloop()

Алгоритм такой. Выбираете нужное количество файлов (сколько выбирать не ограничено, но информация выводится только о пяти последних файлах, это ограничено размером окна). Затем нажимаете кнопку "Зарубить" и оптом обрабатываются все выбранные файлы. Затем делаете очистку списка выбранных файлов и все повторяете по новой.

Добавлено через 14 минут
Damenikx, Я поленился писать комментарии, поэтому, что не понятно, спрашивайте. Я объясню.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
09.09.2019, 08:16  [ТС]
Viktorrus, спасибо Вам огромное за проделанную работу. Правда программа выдаёт ошибку "якобы файл не выбран". Попробую разобраться
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
09.09.2019, 10:20
Viktorrus,
Я использую глобальные переменные и у меня все работает без сбоев.
это потому что ты пишешь только для себя и никто твой код не видит, ты и файл закрываешь после использования менеджера контекста, ревью то никто не проводит, ошибка ничего не стоит, тесты не падают, команду не подводишь.
Таки присоединяюсь. Позиция "лишь бы всё работало, и пусть внутри будет какой угодно говнокод, это мне по фигу" - это позиция заказчика. Вы заказчик?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2019, 10:20
Помогаю со студенческими работами здесь

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

Добавление нескольких файлов в БД
Мне надо вывести в бд сразу несколько файлов в форме. сказали что надо преобразовать массив в строку с помощью serialize() чтобы добавить...

Добавление нескольких файлов в бд
Добрый день. Столкнулься с проблемой, так как сам в програмировании пребиваю на начальной стадии обучения прошу совета. Необходимо...

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

Добавление нескольких файлов в OpenFileDialog
Надо сделать чтоб можно было выбрать несколько файлов в OpenDialog Пока вот что сделал, место пути выдаёт OpenFileDialog1. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru