Найти - Пользователи
Полная версия: Алгоритм для любителя "кодировать".
Начало » Python для новичков » Алгоритм для любителя "кодировать".
1 2 3
Vladej
да, если нужна оболочка - Transler51, креплю файл
Vladej
py.user.next(self), только что напоролся на один старый фильм. Вы человек внимательный, посмотрите про некую “аутентичность”, это касается темы про “дураков” в мире, буквально несколько первых минут:
https://youtu.be/nflIrZT7a9k?t=2484
py.user.next
Vladej
Вот с чего я должен начинать поиск, абсолютно не зная направления?
1)
Сначала я всё прочитал.

Так я составил общую картину программы и представил её блок-схему.

1. Открывается окно.
2. В окне что-то нажимается.
3. Происходит какое-то действие.
4. Происходит какая-то индикация результата.
5. Окно возвращается в исходное состояние.

2)
Затем я разделил этот код на то, что ты взял где-то, и то, что ты писал сам.

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

Так я нашёл у тебя тупой with и так я нашёл твой метод Flags.
Тупой with закрывает файл, потому что ты не читал, как работает with, а также не читал многочисленные примеры с использованием with, которые пишут в книжках по питону, так как ты не читаешь книжек вообще никаких. А метод Flags сразу привлёк моё внимание потому, что он назван неправильно, так как ты не читал такую элементарную вещь как PEP8 и поэтому не знаешь, как правильно именовать разные элементы в питоне. Так я нашёл фрагменты кода, к которым нужно приглядеться особо и проверить там всё.

3)
Дальше я начал проверять подозреваемые фрагменты кода, установленные на предыдущих этапах, на связь с треем, с которым у тебя проблемы и из которого надо разворачивать что-то.

Так я взглянул на метод с with и увидел, что этот метод практически никак не взаимодействует с треем. Поэтому его я отбросил на первое время.

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

Дальше я стал анализировать, зачем ты туда записал операцию XOR, зачем это могло тебе понадобиться, такому ничего не читающему. И так я понял, что ты пытаешься снять флажок вот этот. Также я предположил, что ты скупердяй, раз пришёл за бабками в программирование (годами тебя тут не было и тут ты припёрся, как раз когда реклама айтишников пошла из всех щелей и в том числе из твоего телевизора, который ты смотришь), а значит ты стопудово будешь ещё и экономить методы и одним методом так умно и включать флажки, и выключать флажки. А чтобы одним экономным методом это делать и в одной экономной строчке, тебе, естественно, пришлось выдумывать, как это сделать, и ты нашёл для этого операцию XOR.

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

Если бы ты читал книжки, то ты бы увидел там примеры кода, а в них написано, как ставить флажки и как снимать флажки.

Я же, изучая C ещё, в 2008-м году дошёл там в книжке по C до упражнений на побитовые операции и написал десяток функций, где нужно было брать биты, удалять биты, вставлять биты, искать биты. Один раз вот это прочитал, проделал, запомнил, а теперь годами этим пользуюсь. Мне даже книжку по Qt читать не надо или коды на Qt, чтобы знать, как именно снять такой-то флажок, потому что это просто операция с битами, которая ничем не отличается от всех других операций с битами, которые я прошёл больше десяти лет назад.

К тому же, если подниматься на материи повыше, то в программировании (в теории программирования) есть такой пункт, что надо всё разделять, отделять друг от друга, делать всё это независимым друг от друга и работать с этими отдельными независимыми кусочками по отдельности. Принцип этот называется “разделяй и властвуй”. Но тебе он незнаком, потому что ты ничего не читаешь, так как всё можешь узнать из космоса или с помощью аутотренинга, и поэтому ты всё сливаешь в одно, чтобы оно умнее выглядело, типа одна строчка лучше, чем десять. Это кажется тебе правильным, как и всем новичкам, которые наступают на эти и другие одни и те же разложенные грабли, когда только заходят в программирование. Это типа “я понесу все яйца в одной корзине, потому что две корзины или десять корзин покупать глупо; лучше иметь одну корзину и в ней сразу за один раз перенести все яйца, так как это экономнее по корзинам, по времени и по месту, поэтому я умный”. В итоге ты поскальзываешься и падаешь вместе с этой одной корзиной, в которой у тебя все яйца лежат, и они все разбиваются. Оказалось, что аутотренинг, повышающий умность искусственным путём, не помог ни устоять на ногах, ни спасти корзину с яйцами от гравитации.
xam1816
Vladej
Поделитесь опытом, как вы строите своё изучение языка, каков алгоритм у вас сложился, который облегчает это занятие?

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

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

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

И когда нужно будет что-то писать, эта информация должна всплывать из сознания, тут конечно уже от человека зависит, у кого какая память и тд.

Я вот тоже не могу себя заставить читать, как-то не приучен, утомляюсь быстро от чтения, так вот я ищу информацию в интернете исходя из вопроса - О чем я не знаю, что поможет мне решить задачу?. Часто задаюсь вопросом ни как делать?, а почему так нужно делать?

Обладая нужными компетенциями, можно сделать все что угодно.По аналогии с нейросетью нужно задаться вопросом, а какая ценная информация в тебе заложена?, сколько ее там? Если ее брать из космоса, ну незнаю, может бывают и такие уникумы.

Короткий ответ: загружать в себя нужную информацию и осмысливать ее потом
py.user.next
Vladej
Программка запускается в трее и включается по горячей клавише, чтобы сделать скриншот участка. Появляется перекрестие и всё такое далее. Если я делаю второй следом скриншот, то программка мигает в панели задач, и перекрестие появляется только после развёртывания из панели.
В общем, я её запустил под Linux с заглушками и потестировал. Дело не в флажках.

Вот в этом методе закомментировал self.hide() и ничего не изменилось
  
    def activateSnipping(self):
        self.snipper.showFullScreen()
        QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CrossCursor)
        #self.hide()
Так зачем нужен self.hide() этот?

А вообще, запусти консоль в винде, перейди в консоли в директорию программы и программу запусти в консоли, чтобы в консоль шёл вывод из программы, если там какие-то ошибки выпадают.
Vladej
Здравствуйте. Вкратце пробегусь, потом по теме.
py.user.next
Тупой with закрывает файл, потому что ты не читал, как работает with
……….
Так я взглянул на метод с with и увидел, что этот метод практически никак не взаимодействует с треем
Задача tesseract (OCR) - распознание текста на картинке и последующая фиксация текста в .txt.
Единственный with в коде - с открытием файла .txt происходит перезапись файла и затем закрытие файла для того, чтобы def translate переводчик открыл его для чтения и последующего перевода на русский. Может я что-то не догоняю с with?
Догнал. Удалил эти строчки, связанные с with. Спасибо за указание. Ранее на определённом этапе мне нужно было лицезреть результат OCR, хотя достаточно было просто прописать print(text). Я старался следовать логике, а она в определённом месте оказалась излишней. На раннем этапе код выглядел несколько иначе, я пытался исследовать всё и вся. Но для конечного результата нужно подчищать свой же мусор.

Я долгое время не пользовался своим переводчиком, который “написал” в 2020, и забыл hotkeys: выделил - нажал - перевод. Трей будет напоминать.
py.user.next
Дальше я стал анализировать, зачем ты туда записал операцию XOR, зачем это могло тебе понадобиться, такому ничего не читающему. И так я понял, что ты пытаешься снять флажок вот этот. Также я предположил, что ты скупердяй, раз пришёл за бабками в программирование
Всё намного проще. В 2020 очень часто переводил комменты в коде с китайского, турецкого, ну и с англ. тоже. И чтобы окно переводчика не мельтешило перед глазами, я искал способ закрепить OnTop с помощью кнопки. Долго искал. Попался единственный случай из stackoverflow, там была стрелочка вверх. Я искал способ логического оформления этой функции, а оказалось, что достаточно прописать оператор, который работает как тумблер, никакой логики не надо. Дана кнопка, ей приписывается def, а в ней прописывается “тумблер”. Я пытался изобрести велосипед, а он уже существовал в одной строчке кода.

Я веду дневник “открытий” в коде python, и по случаю забил в него список операторов. Та стрелочка - побитовое ИЛИ НЕ. Откуда я мог понять, что код - это не только логика, но и тумблеры? Стрелочку я больше ни разу не встречал, а вот столбик (ИЛИ) довольно часто. Исправил код на:
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.show()
Спасибо за указание. Просто впихнул в код автоматом, но работал же.
Да, я тогда не знал или не заметил расширение Comment Translate для VSCode.
py.user.next
К тому же, если подниматься на материи повыше, то в программировании (в теории программирования) есть такой пункт, что надо всё разделять, отделять друг от друга, делать всё это независимым друг от друга и работать с этими отдельными независимыми кусочками по отдельности. Принцип этот называется “разделяй и властвуй”.
Именно так и поступаю. Берёшь чей-то замысловатый код, клонируешь его, и методом исключения “строгаешь” в поисках того, что тебе нужно. Ваша формула “разделяй и властвуй” - это некорректно, хотя смысл понял.
py.user.next
годами тебя тут не было и тут ты припёрся, как раз когда реклама айтишников пошла из всех щелей и в том числе из твоего телевизора, который ты смотришь
Мир не стоит на месте, если вы считаете, что кто-то припёрся из альдебарана, значит вы чувствуете себя тут лишним (“понаехали”). А телик я продал в 2021. И на компе не смотрю телеканалы. Тем не менее я тоже заметил обилие рекламы айтишников, это просто знак времени, что-то этот знак означает. Но это другая тема.
py.user.next
Так зачем нужен self.hide() этот?
Вы извините меня, но напомню, что я не программист, это просто очень интересное хобби. Хайд нужен чтобы скрыть, к примеру, окно скриншотера при скрине экрана монитора. Просто он был вставлен вместе с другим кодом на раннем этапе, и я забыл почистить мусор. Но этот мусор работе кода не мешал, потому и не замечал его. Спасибо за указание.
……. продолжу чуть позже, времени навалом, я на больничном.
py.user.next
Vladej
Может я что-то не догоняю с with?
Да, что такое with и зачем его делать? Называется слышал звон, да не знаю где он. Типа увидел with, значит вставил with сразу.

Файл можно открыть, записать и закрыть так
  
f = open('file.txt', 'w')
f.write('text')
f.close()

Но делают это обычно так
  
with open('file.txt', 'w') as f:
    f.write('text')
Куда делся f.close()? Вот он как раз внутри with и находится.
Если бы ты прочитал хоть одну книгу по питону для новичков, начинающих и так далее, ты бы везде увидел такие with'ы, привык их видеть, и когда писал бы его, то не стал бы ставить туда f.close(), потому что начитанность кодом не дала бы тебе этого сделать; для тебя бы этот f.close() показался странным, не к месту и так далее.

А так ты делаешь именно тупость
  
with open('file.txt', 'w') as f:
    f.write('text')
    f.close()
Типа чтобы по-умному всё было, ты используешь with, но тут же прокалываешься и используешь f.close(), который повторно пытается файл закрыть закрытый. Это тебе повезло, что это питон и он закрытый файл повторно закрывать не станет, а просто сделает nop (no operation), но в другом языке программирования такой код выпадет с ошибкой, поэтому за такими вещами нужно строго следить. Открывать открытые файлы или закрывать закрытые файлы нельзя.

Оператор with, вообще по своей сути, запускает скрытый метод __enter__() при создании объекта и запускает скрытый метод __exit__() при разрушении объекта. И вот для файловых объектов в этом скрытом методе __exit__() есть вызов obj.close() внутри.

Это пример
  
>>> class A:
...     def __init__(self):
...         self.name = 'nothing'
...     def __enter__(self):
...         self.name = 'cat'
...         return self
...     def __exit__(self, et, ev, tb):
...         self.name = 'dog'
...     def __str__(self):
...         return self.name
... 
>>> print(A())
nothing
>>>     
... with A() as obj:
...     print(obj)
... 
cat
>>> print(obj)
dog
>>>

Vladej
Но для конечного результата нужно подчищать свой же мусор.
Так тебе же об этом и говорят: никто не пишет программы сразу в коде. Сначала делается полное словесное описание алгоритма, потом по этому полному словесному описанию, сделанному до конца, строится блок-схема, потом по этой блок-схеме, сделанной до конца, пишется псевдокод, а потом уже по этому псевдокоду, сделанному до конца, пишется конечный код. Когда ты пишешь код, у тебя уже всё лишнее вычищено и переделано сто раз на предыдущих этих этапах. Сначала ты в вузе сидишь и пишешь это всё вручную в тетради, потом ты там это всё проделываешь уже в программах, а потом ты уже это всё проделываешь в голове только, потому что оно переходит в навыки мышления. Поэтому я вот и могу просто идти по улице и писать программу так, а потом прихожу домой и записываю её готовую в компьютер. Разработка в голове вся идёт. В компе ты только записываешь уже готовое.

Vladej
я искал способ закрепить OnTop с помощью кнопки. Долго искал. Попался единственный случай из stackoverflow, там была стрелочка вверх.
Да это хреновый способ, он неочевидный.
Ставить флаг надо так
  
flag = flag | mask
Убирать флаг надо так
  
flag = flag & ~mask
Всё. Вот это идиомы, в которых точно не будет никаких ошибок. Все их знают и ни у кого не возникнет вопросов к ним, и там точно ничего не пропустишь и никакой флажок случайно не снимешь.

Вот твой тумблер
  
if not flag & mask:
    flag = flag | mask
else:
    flag = flag & ~mask
Ты вот писал про истребитель F-16, у которого в программном обеспечении миллион строк. Так там миллион строк вот таких, где четыре строки вместо одной. Они ясные, понятные, они без ошибок, самолёт не упадёт из-за тупого флажка какого-то, снятого или установленного из-за побочного эффекта от какой-то не той операции, применённой не в то время не в том месте.
В этот раз тебе повезло, что XOR переключает всё правильно, а в другой раз не повезёт. Ты будешь думать, что на неё можно опереться, положиться, а она тебе даст какой-нибудь эффект ненужный и ты даже знать об этом не будешь. Ну, ты узнаешь тогда, когда самолёт упадёт. Где-то там уже была история, что ошибка в определении уровня моря приводила к тому, что у самолёта становилась отрицательная высота и самолёт то ли разбивался там, потому что автопилот направлял его вниз, то ли просто начинал подниматься вверх, хотя для этого не было поводов. Когда стали выяснять, оказалось, что там в коде была ошибка переполнения целочисленной переменной, неучтённая, пропущенная программистом. Задайся вопросом: как программист, которого подпустили к написанию кода для самолёта, пропустил такую наитупейшую ошибку на уровне школьника? Это не невнимательность. Это он просто нарушил правила кодирования. Есть правила и их надо соблюдать, а он ими пренебрёг, где-то там что-то сократил до одной строки типа по-умному и в итоге из-за этого всё накрылось. Никого не интересует, сколько у тебя там строк в коде, главное - летит ли самолёт правильно.

К этому тумблеру пока вопросов нет, он только написан неправильно в виде кода, неправильный приём применён. Применён хак, а в хаках прячутся ошибки очень хорошо, которые могут годами оставаться незаметными, а потом выстреливать где-нибудь, когда этот код где-нибудь работает уже и от него что-то зависит.

Vladej
Та стрелочка - побитовое ИЛИ НЕ
Смотри
@ - собачка
^ - циркумфлекс (каретка ещё)
& - амперсанд
| - вертикальная черта (труба ещё)
# - октоторп (решётка ещё)
/ - слеш (косая черта ещё)
\ - бэкслеш (обратная косая черта ещё)
И циркумфлекс - это операция XOR (exclusive OR). Это исключающее ИЛИ.
Если при обычном OR (ИЛИ) мы имеет такую таблицу истинности
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
То при исключающем OR (ИЛИ) мы из таблицы истинности OR (ИЛИ) исключаем одну строку.
Получается такая таблица истинности
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
То есть это всё точно так же, как в OR (ИЛИ), только первая строка исключается и заменяется на ноль.

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

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

Vladej
Исправил код на:
  
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.show()
Не исправляй, он пока работает. Ищи ошибку свою по сворачивания окна пока. Не надо 100500 ошибок сразу искать и исправлять. Исправляй по одной ошибке, но полностью. Одну исправил ошибку - к следующей переходишь. Следующую исправил ошибку - к следующей за следующей переходишь. И так далее. Твоя работа должна идти так, что у тебя всё время позади остаётся правильный код, который проверен и который больше проверять не надо, в моменте ты работаешь с каким-то небольшим участком кода, который ты можешь охватить мысленно полностью, а впереди вот остаётся всё только непроработанное. И так ты переводишь постепенно код из неизвестного состояния в проверенное состояние через узкое окно. Это как есть пирог или торт. Вот ты бы стал сразу весь торт засовывать в рот? Это нереально. А вот съесть его по маленьким кусочкам можно весь часа за три или за день там. И при этом он будет весь съеден идеально. С кодом точно так же, так миллионы строк и пишутся, про которые ты недоумеваешь.

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

Пока что баг ты не исправил. Поэтому надо найти его причину и исправить. Чтобы найти причину, ищи в коде места, где идёт управление окном и управление треем. Где окно там показывается, скрывается, трей активируется, деактивируется, - такие места. Иногда что-нибудь комментируй в коде, запускай его и смотри, как программа работает без этого. Так ты увидишь наглядно, что в коде на что в запущенной программе влияет. Это навык отладки, которого у тебя тоже нихрена нет. Все эти навыки надо вырабатывать через постоянную практику, они не могут сами по себе из космоса появиться.
Vladej
py.user.next
Куда делся f.close()? Вот он как раз внутри with и находится
я это уже понял, понял что сценарий уже прописан. Но по коду (“походу”) этого не видно. Мы же код читаем, а не книжки, и как понять по коду, что любое действие с файлом - чтение, перезапись, дозапись - уже подразумевает полностью законченное действие?

не знаю как вставить сюда картинки, только через прикреплённый файл, ну и на том спасибо - лучшее враг хорошего, как говорится.
Vladej
py.user.next
Сначала делается полное словесное описание алгоритма
ну а что мы все делаем? предварительно “филология”, потом конкретика. Как говорил некто: “без общего не понять частного”.
py.user.next
И циркумфлекс - это операция XOR
мне до самой смерти не понадобятся “эти” операции. Не начинайте даже.
Vladej
py.user.next
Не исправляй, он пока работает. Ищи ошибку свою по сворачивания окна пока.
эта ошибка переросла в нечто большее. Я прилагаю видео, там увидете, как перекрестие скриншотера отчасти выполняет роль клика мыши. Перелопатил кучу образцов кода с гитхаба, но только пара-тройка выполнялась корректно. Есть подозрение, что прежде, чем делать обрезку участка, делается клон экрана монитора. И уже по этому клону выполняются все операции. Но это не всегда явно, возможно, что тут дело обстоит проще, но только как.

Отладка кода в VSCode происходит по клавише F5. Запускаю отладку и сразу же в блокноте открываю какое-нибудь модальное окно, и наблюдаю, как реагирует мод. окно на работу скрина. Последний в видео вариант - это клавиша PrntScr. Она ничего не трогает, просто фотографирует как есть. Вот пытаюсь понять, как это реализовать в своей третьей программке. Пока не дошло. В большинстве кодов с гита перекрестие скрина закрывает мод. окно. Это та же самая “кликабельность” по сворачиванию окна, которой быть не должно.

Как вы считаете, действительно ли дело в клонировании изображения?

“Прикреплённый файл слишком большой”. 16 МВ. Ладно, дам ссылочку на:
https://disk.yandex.ru/i/uI6bkF4oj7AZsg
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB