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, там была стрелочка вверх.
Да это хреновый способ, он неочевидный.
Ставить флаг надо так
Убирать флаг надо так
Всё. Вот это идиомы, в которых точно не будет никаких ошибок. Все их знают и ни у кого не возникнет вопросов к ним, и там точно ничего не пропустишь и никакой флажок случайно не снимешь.
Вот твой тумблер
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
Ваша формула “разделяй и властвуй” - это некорректно
Это не моя формула, это общеизвестная формула, которую ты прочитал бы в книжках, если бы хотя бы одну прочитал. Опять свою ахинею несёшь про то, что правильно и что неправильно. Ты профанацией занимаешь - невежественным обесцениванием по причине собственной дурости. Так что не спорь, а слушай. Потом засядешь с книжками и будешь там сам с собой соглашаться и опровергать.
Пока что баг ты не исправил. Поэтому надо найти его причину и исправить. Чтобы найти причину, ищи в коде места, где идёт управление окном и управление треем. Где окно там показывается, скрывается, трей активируется, деактивируется, - такие места. Иногда что-нибудь комментируй в коде, запускай его и смотри, как программа работает без этого. Так ты увидишь наглядно, что в коде на что в запущенной программе влияет. Это навык отладки, которого у тебя тоже нихрена нет. Все эти навыки надо вырабатывать через постоянную практику, они не могут сами по себе из космоса появиться.