Форум программистов, компьютерный форум, киберфорум
Наши страницы
Бета-тестирование
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/63: Рейтинг темы: голосов - 63, средняя оценка - 4.81
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
1

Python компилятор

23.07.2015, 17:59. Просмотров 11571. Ответов 87
Метки нет (Все метки)

Здорово, форумчане!
Кое-кто уже имел дело с данным Python-компилятором в прошлом и даже дал пару дельных советов. С тех пор Бозон был несколько усовершенствован и разбит на два комплекта:

Boson Aqua - компилирует программы, написанные на Python 2 (рекомендуется Python 2.7, как самый стабильный релиз).
Boson Aero - компилирует программы, написанные на Python 3 (рекомендуется Python 3.3, как с.с.р.).

Среди основных новшеств:

Больше не требуется отдельно устанавливать cx_Freeze(который рекомендуется перед установкой Бозона удалить, если есть) - теперь сборочные модули(немного перепрограммированные под нужды приложения) устанавливаются самим компилятором.
Появилась возможность в пару кликов прикладывать целые деревья доп. файлов, указывать издателя компилируемого приложения, устанавливать пути поиска доп. модулей. Плюс, были исправлены некоторые ошибки и неудобности.

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

Для тех, кто может запутаться в трёх кнопках: если в Aqua при компиляции у Вас возникнет ошибка несоответствия версий Tcl, зайдите в Настройки программы и установите путь к Tcl вручную(там написано, как, примерно, он должен выглядеть).

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

Бозон скомпилировал сам себя, а также Veil, Лунатик, плюс некоторые другие приложения, ссылки на которые мне давать нельзя.

Требование:
Наличие MS VC Redist 2010.

Скачать Boson Aqua (для Python 2)
Скачать Boson Aero (для Python 3)

Python компилятор
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 17:59
Ответы с готовыми решениями:

Компилятор на Python
Всем доброго времени суток! Помогите сделать такую простую вещь: У меня...

Нужен компилятор Си для Windows 7 64x для корректной установки библиотек и модулей Python
Приветствую форумчан. Возникла проблема при попытке установки grab, очень...

Нужен компилятор Си для в Windows 7 64x для корректной установки библиотек и модулей Python
Приветствую форумчан. Возникла проблема при попытке установки grab, очень...

Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор
Здравствуйте! Я недавно начал заниматься С++, но мой компилятор (Visual C++...

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации?...

87
Юрий Денисов
0 / 0 / 0
Регистрация: 09.09.2015
Сообщений: 28
01.11.2015, 14:54 41
Фаер, спасибо. И еще я с удовольствием приму участие в проекте(безвозмездно) т.к. нужна практика в программировании.
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
28.12.2015, 23:22  [ТС] 42
Что ж, джентльмены и леди, с радостью сообщаю Вам, что готова третья версия Python-компилятора Бозон.

Новое в третьей версии:
- Бозон больше не использует при компиляции setup.py файлы. Соответственно, скорость компиляции немного поднялась, удалось сильнее интегрировать Бозон и cx_Freeze - теперь они являются практически одним целым. Разумеется, со стандартными модулями cx_Freeze Бозон больше работает - нужны переписанные нами(что, в соответствии с лицензией cx_Freeze, допустимо).
- Переработаны сборочные модули разных разрядностей - теперь к Бозону прилагается два вида модулей: x64 и x32(x86). Разрядность компилируемого приложения определяется по разрядности установленного Python и сборочных модулей(а не ОС).
- Появилась возможность компилировать консольные приложения.
- При загрузке предыдущих проектов в форме теперь автоустанавливаются ещё и параметры иконки, интерфейса(GUI\консоль), результата(EXE\MSI). То есть кликов станет гораздо меньше.
- Введена дополнительная проверка на пути поиска модулей. Ранее проблема с путями не вызывала ошибки, но и не запускала компиляцию.
- Исправлен баг с установкой сборочных модулей при отмене команды выбора каталога для установки.
- Если не найдена прикреплённая к компилируемой программе иконка, компиляция не запустится->появится соответствующее сообщение->вылета не произойдёт.
- Если при запуске Бозона в каталоге project оказался один PY-файл с русскими символами в имени, автоматически занесён в форму он не будет.
- В список дополнительных файлов добавлена полоса прокрутки.
- Исправлен баг вылета программы при попытке скомпилировать программу с нулячими или пустыми параметрами демо-версии.
- Исправлено не-переключение фокуса на дополнительные окна(загрузка проектов, пути поиска, установка сборочных модулей).
- Отключено мелькание радиокнопок при переключении.

Кроме того, была уточнена и немного расширена встроенная справка по компиляции.

Решение самых распространённых ошибок:
  • FCI 1 Error - возникает в консоли(ныне окне Бозона) - переустановите Бозон в каталог, в адресе\имени которого нет русских символов. Так же проверьте на предмет не-латинницы имена файлов, модулей и имени проекта.
  • Invalid Command 'bdist' - появляется в отдельном окне - зайдите в каталог pythonxx/Lib, найдите в нём папку distutils - скопируйте её в каталог, в который установлен Бозон.
  • Permission Denied или No such file or directory 'project' - запустите Бозон от имени администратора.
Решение остальных ошибок можно найти в интернете, но всё же не стесняйтесь сообщать, если они возникают - будем решать.

В данный момент к работе готов только комплект Бозон Аэро (Python 3.X). Аква (Python 2.X) появится в ближайшие несколько дней.

Скачать демо-версии:
Бозон Аэро 3.0 (x32)
Бозон Аэро 3.0 (x64)
(к каждому комплекту приложены сборочные модули обеих разрядностей)

Кроме того, в ближайшее время появится полноценная справка по Бозону с решением всех возможных ошибок компиляции(в основном, это ошибки cx_Freeze, так что не обессудьте). Поэтому "Отправляйте отчёт об ошибках Microsoft". Компилятор нам всем нужен.

Добавлено через 1 минуту
Цитата Сообщение от Юрий Денисов Посмотреть сообщение
И еще я с удовольствием приму участие в проекте(безвозмездно) т.к. нужна практика в программировании.
Если у Вас практики маловато - это, наоборот, аргумент против Вас. Там, всё-таки, сложные вещи крутятся, в Бозоне. Но мы подумаем, что можно сделать. Руки лишними редко бывают.
1
Юрий Денисов
0 / 0 / 0
Регистрация: 09.09.2015
Сообщений: 28
29.12.2015, 18:02 43
Фаер, спасибо. Думайте быстрее :-) . Что ж Вы раньше не сказали что бозон не компилирует консольные приложения и что он не должен быть установлен в кириллический каталог ? Я долго мучился искал "ошибку" . Есть идея сделать визуальный конструктор GUI приложений и включить его в состав бозона. Конструктор GUI на основе tkinter несложно сделать будет.

Добавлено через 18 часов 18 минут
Фаер, я поймал баг! Не работает демо версия консольного приложения, полная версия работает.
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
30.12.2015, 21:17  [ТС] 44
Цитата Сообщение от Юрий Денисов Посмотреть сообщение
Что ж Вы раньше не сказали что бозон не компилирует консольные приложения и что он не должен быть установлен в кириллический каталог ?
Не всегда получается всё сразу учесть. Но будет, будет в самые кратчайшие сроки полноценная справка.

Цитата Сообщение от Юрий Денисов Посмотреть сообщение
Не работает демо версия консольного приложения, полная версия работает.
Если подумать, так оно и должно быть - система демо работает через GUI, а в консольных приложениях всё, что касается GUI, обрезается. Исправим.

Добавлено через 4 минуты
Готовы комплекты третьей версии Бозон Аква (Python 2.X). Список нововведений тот же, что и у Аэро, кроме первого пункта - Бозон Аква по-прежнему использует в работе setup.py файлы(полностью автоматизировано! Вы к этим файлам даже прикасаться не будете).

Скачать демо-версии:
Бозон Аква 3.0 (x32)
Бозон Аква 3.0 (x64)
1
MrOnlineCoder
Всегда онлайн
552 / 463 / 187
Регистрация: 07.04.2013
Сообщений: 1,943
Завершенные тесты: 2
02.01.2016, 15:08 45
Фаер, а можете ли вы назвать преимущества Бозона перед py2exe?
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
02.01.2016, 16:12  [ТС] 46
MrOnlineCoder, да Вы серьёзно что ли?

Вручную писать setup? А если опечатаетесь? А если у Вас десятки сопутствующих файлов? А возможные значения параметров компиляции Вы знаете наизусть? Или каждый раз в туториал смотреть не лень? Команды через консоль - двадцать первый век, ну!? Можно уже позволить себе обойтись без такой мануальности.

У py2exe и список параметров сборки никчёмный. MSI в зачаточной стадии. Да весь проект в альфе альфы.

И вот Бозон. Просто установите его, даже компилировать ничего не надо пытаться! Он ведь скомпилировал сам себя. Результат: автоматизированная установка, иконка, в том числе, на рабочий стол, все нужные файлы приложены, запись в Установке И Удалении Программ, версия, издатель, никаких проблем с MS VC Redist. И с третьей версией Python работает! И, вполне вероятно, скоро третий комплект сделаем: для MacOS.

В чём вообще основа Ваших сомнений? В том, что русский продукт что ли? Или в том, что он бесплатно не раздаётся? Что поделать, время и силы дорого стоят. Учитывая, что ни одного значимого аналога у Бозона нет, цена у него вообще скромнейшая.

Кстати говоря, начата страница Всё о Бозоне. Уже есть FAQ и комментарии по развёртке. Не знаю, насколько легально давать подобные ссылки, но уж не обессудьте.
2
MrOnlineCoder
Всегда онлайн
552 / 463 / 187
Регистрация: 07.04.2013
Сообщений: 1,943
Завершенные тесты: 2
02.01.2016, 16:22 47
Фаер, вот так бы всегда. Теперь вижу преимущества.
0
Pro_grammer
Модератор
6176 / 2259 / 443
Регистрация: 24.04.2011
Сообщений: 3,998
Записей в блоге: 10
03.01.2016, 12:13 48
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
Теперь вижу преимущества
Какие?
В мире компьютеров есть нормальные компиляторы, которые создают нативные EXE программы, размером от килобайта! От килобайта, Карл!
Не надо скачивать килотонны мусора и в результате получить
Цитата Сообщение от Фаер Посмотреть сообщение
десятки сопутствующих файлов
В чем понт? В том, что вы не хотите изучить нормальный ЯП, отличный от Пайтона? Любите использовать костыли для интерпретатора? Обратите внимание на абсолютно бесплатные компиляторы Паскаль, Си, Си#, VB.NET и ещё множество нормальных ЯП , которые не требуют для своей работы "десятки сопутствующих файлов" и к тому же имеют современный интерфейс, а не "а ля win 95".
Цитата Сообщение от Фаер Посмотреть сообщение
что русский продукт что ли?
Обидно, да.
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
03.01.2016, 12:50  [ТС] 49
Pro_grammer, а я уже переживать начал, куда это все умники подевались!?

Цитата Сообщение от Pro_grammer Посмотреть сообщение
размером от килобайта
При нынешних сотнях Гб это, конечно, серьёзное преимущество. :like:
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В том, что вы не хотите изучить нормальный ЯП
Ну да, я слышал, что можно изучить программирование за одну ночь. Особенно, на таких "нормальных" языках, как C и Java. Вот только чё-то не видел ни разу, пока. Большинство после трёх лет "активной практики" ничего стоящего написать не может. Ну, в смысле, стоящего. Примитивные задачи на форуме мы же не считаем чем-то стоящим!? Или нет?
Сдаётся мне, на Python внимание обращают как раз потому, что хотят изучить нормальный ЯП.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Паскаль, Си, Си#, VB.NET и ещё множество нормальных ЯП
О-о, да-а, калека времён DOS, два мозголома и один псевдоязык с таким количеством костылей, что уж дальше просто некуда. Слыхали, ага.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
современный интерфейс
Ну это просто трындец! Закруглённые края у кнопок компилятора, очевидно, очень сильно помогают Вам скомпилировать приложение, на которое хоть кто-то обратит внимание. Связь, вообще, абзац. Я аж всерьёз задумался!
1
Pro_grammer
Модератор
6176 / 2259 / 443
Регистрация: 24.04.2011
Сообщений: 3,998
Записей в блоге: 10
03.01.2016, 14:39 50
Цитата Сообщение от Фаер Посмотреть сообщение
Я аж всерьёз задумался!
Задумайтесь лучше над этой фразой:
Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
03.01.2016, 16:07  [ТС] 51
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Задумайтесь лучше над этой фразой:
Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.
Ну-у. Можно использовать, как хочешь, в том числе, в платных приложениях.
0
MrOnlineCoder
Всегда онлайн
552 / 463 / 187
Регистрация: 07.04.2013
Сообщений: 1,943
Завершенные тесты: 2
03.01.2016, 18:39 52
Pro_grammer, я говорю преимущества перед py2exe.
1
backtrader
2 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 2
02.02.2016, 05:26 53
Компилятор питон? рилли? Исходный код достается на 1,2,3. И даже если вы шифруете импорты через класс какой нить, они хукуются, по этому мой друг, фейк защитан. Нет и не может быть защиты исходного кода на питоне =)))) Почитали бы сперва.... ну и на закуску код всегда выгружается в память , а от туда достается все что нужно!!!!

ЗЫ:
есть такая игра — Eve Online. большая ее часть написана на питоне.
ее разработчики применили именно такой подход — шифрование файлов на диске и свой импортер c расшифровкой на лету.
естественно, никого из желающих порыться в исходниках на предмет внесения нужных изменений это не останавливало. алгоритм шифрования просто и тупо восстановили из бинарника, ключи — извлекли. взято с хабра...
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
02.02.2016, 05:34  [ТС] 54
backtrader, кулхацкер, хой!
1
backtrader
2 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 2
02.02.2016, 05:47 55
Это было предисловие, но я сюда не ругать пришел по этому попробую помочь.Сделайте двухступенчатое — в бинарнике (например C/C++) и в скрипте (python) шифрование, с открытым (для расшифровки) и закрытым (для шифрования) ключами и подписями.Скрипт должен быть подписан приватным ключем (чтобы нельзя было изменить.функции расшифровки могут быть вызваны только из классов (либо статики) из пространств имен тоже только зашифрованых и подписаных приватным ключем (т.н. safe area). Зная только паблик-ключ, хакеру не возможно самому создать safe area и придется ковырять бинарные модули, что не есть просто.А точнее это будет гемор еще тот, в памяти будет каша, вот вам и будет тру компиллер =) С Уважением....
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
03.03.2016, 16:35  [ТС] 56
Обновление, джентльмены и леди.

Бозон 3.1.8:
  • Встроена система автонастройки приложения при первом запуске. Автоматически определяется местоположение Python, устанавливается основной путь поиска, путь к Tcl(в Аква), определяется каталог для установки сборочных модулей. Таким образом, большая часть проблем Бозона, а они практически всегда связаны с неправильной настройкой, уходит.
  • Установлена проверка на наличие в каталоге Бозона русских символов(точнее, проверка на соответствие ASCII) с всплывающим сообщением. То есть перехвачена ещё одна распространённая проблема.
  • Установлен перехват ошибки PermissionError, исправляемой запуском Бозона от имени администратора устройства.
  • Бозон больше не удаляет свой Pmw(что влекло за собой не-запуск Бозона) при компилировании приложения, использующего Pmw.
  • Добавлена кнопка "Пакеты", которая позволяет автоматически определить сторонние пакеты, которые нужно прикрепить к программе. В данный момент определяются Pmw, PIL, PyQt4, PyQt5 и dbm, необходимый приложениям, использующим shelve.
  • Так же для Вашего удобства появилась кнопка "Открыть в IDLE", благодаря которой Вы можете, не выходя из Бозона, открыть компилируемый скрипт в IDLE для исправления ошибок на ходу. Только в Аэро.
  • При выборе иконки её адрес теперь автоматически будет добавляться в список сопутствующих файлов.
  • В окно мониторинга процесса компиляции была добавлена полоса прокрутки для удобства отладки.
  • При открытии каталогов project, build и dist больше не будет появляться консоль Windows.
  • Интерфейс Бозона приведён к стройному, порядочному виду.

Подводя итоги, можно сказать, что Бозон 3.1.8 делает шаг навстречу новым пользователям: он предупредительнее, устойчивее и имеет больше встроенных пояснений\предупреждений, а так же способен настраиваться сам собой.

Скачать демо-версии:
Бозон Аква x32 (x86) - Python 2.X (рекомендуется 2.7)
Бозон Аква x64
Бозон Аэро x32 (x86) - Python 3.X (рекомендуется 3.3)
Бозон Аэро x64

Python компилятор
0
Zodt
156 / 79 / 69
Регистрация: 10.05.2014
Сообщений: 420
12.03.2016, 17:16 57
Доброго времени суток, у меня такая проблемка возникла, написал тетрис посредством модуля PyQt5. Скрипт полностью работающий. Засовываю в базон, прописываю все используемые модули, за исключением стоковых, к путям поиска и сборочным модулям пути указал. Вроде бы все хорошо, даже скомпилировался код, но как только запускаю получившийся экзешник пишет ошибки(скриншот прикреплен).
0
Миниатюры
Python компилятор  
Zodt
156 / 79 / 69
Регистрация: 10.05.2014
Сообщений: 420
12.03.2016, 17:56 58
Если код поможет дать более верный ответ, то
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
import sys, random, re
from PyQt5.QtWidgets import QWidget, QMainWindow, QFrame, QDesktopWidget, QApplication, QMessageBox
from PyQt5.QtCore import Qt, QBasicTimer, pyqtSignal
from PyQt5.QtGui import QPainter, QColor, QIcon
#from __future__ import unicode_literals
 
class Tetris(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
 
        self.tboard = Board(self)
        self.setCentralWidget(self.tboard)
 
        self.statusbar = self.statusBar()
        self.tboard.msg2Statusbar[str].connect(self.statusbar.showMessage)
 
        self.tboard.start()
 
        self.resize(180, 380)
        self.center()
        self.setWindowTitle('Тетрис')
        self.setWindowIcon(QIcon('tetris.png'))
        self.show()
 
        def closeEvent(self, event):
            reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if reply == QMessageBox.Yes: event.accept()
            else: event.ignore()
    def center(self):
        screen = QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)
class Board(QFrame):
    msg2Statusbar = pyqtSignal(str)
    BoardWidth = 10
    BoardHeight = 22
    Speed = 300
    def __init__(self, parent):
        super().__init__(parent)
        self.initBoard()
    def initBoard(self):
        self.timer = QBasicTimer()
        self.isWaitingAfterLine = False
        self.curX = 0
        self.curY = 0
        self.numLinesRemoved = 0
        self.board = []
        self.setFocusPolicy(Qt.StrongFocus)
        self.isStarted = False
        self.isPaused = False
        self.clearBoard()
    def shapeAt(self, x, y): return self.board[(y * Board.BoardWidth) + x]
    def setShapeAt(self, x, y, shape): self.board[(y * Board.BoardWidth) + x] = shape
    def squareWidth(self): return self.contentsRect().width() // Board.BoardWidth
    def squareHeight(self): return self.contentsRect().height() // Board.BoardHeight
    def start(self):
        if self.isPaused: return
        self.isStarted = True
        self.isWaitingAfterLine = False
        self.numLinesRemoved = 0
        self.clearBoard()
        self.msg2Statusbar.emit(str(self.numLinesRemoved))
        self.newPiece()
        self.timer.start(Board.Speed, self)
    def pause(self):
        if not self.isStarted: return
        self.isPaused = not self.isPaused
        if self.isPaused:
            self.timer.stop()
            self.msg2Statusbar.emit("paused")
        else:
            self.timer.start(Board.Speed, self)
            self.msg2Statusbar.emit(str(self.numLinesRemoved))
        self.update()
    def paintEvent(self, event):
        painter = QPainter(self)
        rect = self.contentsRect()
        boardTop = rect.bottom() - Board.BoardHeight * self.squareHeight()
        for i in range(Board.BoardHeight):
            for j in range(Board.BoardWidth):
                shape = self.shapeAt(j, Board.BoardHeight - i - 1)
                if shape != Tetrominoe.NoShape:
                    self.drawSquare(painter,
                        rect.left() + j * self.squareWidth(),
                        boardTop + i * self.squareHeight(), shape)
        if self.curPiece.shape() != Tetrominoe.NoShape:
            for i in range(4):
                x = self.curX + self.curPiece.x(i)
                y = self.curY - self.curPiece.y(i)
                self.drawSquare(painter, rect.left() + x * self.squareWidth(), boardTop + (Board.BoardHeight - y - 1) * self.squareHeight(),self.curPiece.shape())
    def keyPressEvent(self, event):
        if not self.isStarted or self.curPiece.shape() == Tetrominoe.NoShape:
            super(Board, self).keyPressEvent(event)
            return
        key = event.key()
        if key == Qt.Key_P:
            self.pause()
            return
        if self.isPaused:
            return
        elif key == Qt.Key_Left:
            self.tryMove(self.curPiece, self.curX - 1, self.curY)
        elif key == Qt.Key_Right:
            self.tryMove(self.curPiece, self.curX + 1, self.curY)
        elif key == Qt.Key_Down:
            self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY)
        elif key == Qt.Key_Up:
            self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY)
        elif key == Qt.Key_Space:
            self.dropDown()
        elif key == Qt.Key_D:
            self.oneLineDown()
        else:
            super(Board, self).keyPressEvent(event)
    def timerEvent(self, event):
        if event.timerId() == self.timer.timerId():
            if self.isWaitingAfterLine:
                self.isWaitingAfterLine = False
                self.newPiece()
            else:
                self.oneLineDown()
        else:
            super(Board, self).timerEvent(event)
    def clearBoard(self):
        for i in range(Board.BoardHeight * Board.BoardWidth): self.board.append(Tetrominoe.NoShape)
    def dropDown(self):
        newY = self.curY
        while newY > 0:
            if not self.tryMove(self.curPiece, self.curX, newY - 1):
                break
            newY -= 1
        self.pieceDropped()
    def oneLineDown(self):
        if not self.tryMove(self.curPiece, self.curX, self.curY - 1): self.pieceDropped()
    def pieceDropped(self):
        for i in range(4):
            x = self.curX + self.curPiece.x(i)
            y = self.curY - self.curPiece.y(i)
            self.setShapeAt(x, y, self.curPiece.shape())
        self.removeFullLines()
        if not self.isWaitingAfterLine:
            self.newPiece()
    def removeFullLines(self):
        numFullLines = 0
        rowsToRemove = []
        for i in range(Board.BoardHeight):
            n = 0
            for j in range(Board.BoardWidth):
                if not self.shapeAt(j, i) == Tetrominoe.NoShape:
                    n = n + 1
            if n == 10:
                rowsToRemove.append(i)
        rowsToRemove.reverse()
        for m in rowsToRemove:
            for k in range(m, Board.BoardHeight):
                for l in range(Board.BoardWidth):
                        self.setShapeAt(l, k, self.shapeAt(l, k + 1))
        numFullLines = numFullLines + len(rowsToRemove)
        if numFullLines > 0:
            self.numLinesRemoved = self.numLinesRemoved + numFullLines
            self.msg2Statusbar.emit(str(self.numLinesRemoved))
            self.isWaitingAfterLine = True
            self.curPiece.setShape(Tetrominoe.NoShape)
            self.update()
    def newPiece(self):
        self.curPiece = Shape()
        self.curPiece.setRandomShape()
        self.curX = Board.BoardWidth // 2 + 1
        self.curY = Board.BoardHeight - 1 + self.curPiece.minY()
        if not self.tryMove(self.curPiece, self.curX, self.curY):
            self.curPiece.setShape(Tetrominoe.NoShape)
            self.timer.stop()
            self.isStarted = False
            self.msg2Statusbar.emit("Game over")
    def tryMove(self, newPiece, newX, newY):
        for i in range(4):
            x = newX + newPiece.x(i)
            y = newY - newPiece.y(i)
            if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
                return False
            if self.shapeAt(x, y) != Tetrominoe.NoShape:
                return False
        self.curPiece = newPiece
        self.curX = newX
        self.curY = newY
        self.update()
        return True
    def drawSquare(self, painter, x, y, shape):
        colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
                      0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
        color = QColor(colorTable[shape])
        painter.fillRect(x + 1, y + 1, self.squareWidth() - 2, self.squareHeight() - 2, color)
        painter.setPen(color.lighter())
        painter.drawLine(x, y + self.squareHeight() - 1, x, y)
        painter.drawLine(x, y, x + self.squareWidth() - 1, y)
        painter.setPen(color.darker())
        painter.drawLine(x + 1, y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + self.squareHeight() - 1)
        painter.drawLine(x + self.squareWidth() - 1, y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
class Tetrominoe(object):
    NoShape = 0
    ZShape = 1
    SShape = 2
    LineShape = 3
    TShape = 4
    SquareShape = 5
    LShape = 6
    MirroredLShape = 7
class Shape(object):
    coordsTable = (
        ((0, 0),     (0, 0),     (0, 0),     (0, 0)),    
        ((0, -1),    (0, 0),     (-1, 0),    (-1, 1)),   #red
        ((0, -1),    (0, 0),     (1, 0),     (1, 1)),    #green
        ((0, -1),    (0, 0),     (0, 1),     (0, 2)),    #line
        ((-1, 0),    (0, 0),     (1, 0),     (0, 1)),    #yellow
        ((0, 0),     (1, 0),     (0, 1),     (1, 1)),    #sqrt
        ((-1, -1),   (0, -1),    (0, 0),     (0, 1)),    #orange
        ((1, -1),    (0, -1),    (0, 0),     (0, 1))     #blue
    )
    def __init__(self):
        self.coords = [[0,0] for i in range(4)]
        self.pieceShape = Tetrominoe.NoShape
        self.setShape(Tetrominoe.NoShape)
    def shape(self): return self.pieceShape
    def setShape(self, shape):
 
        table = Shape.coordsTable[shape]
 
        for i in range(4):
            for j in range(2):
                self.coords[i][j] = table[i][j]
 
        self.pieceShape = shape
    def setRandomShape(self): self.setShape(random.randint(1, 7))
    def x(self, index): return self.coords[index][0]
    def y(self, index): return self.coords[index][1]
    def setX(self, index, x): self.coords[index][0] = x
    def setY(self, index, y): self.coords[index][1] = y
    def minX(self):
        m = self.coords[0][0]
        for i in range(4): m = min(m, self.coords[i][0])
        return m
    def maxX(self):
        m = self.coords[0][0]
        for i in range(4): m = max(m, self.coords[i][0])
        return m
    def minY(self):
        m = self.coords[0][1]
        for i in range(4): m = min(m, self.coords[i][1])
        return m
    def maxY(self):
        m = self.coords[0][1]
        for i in range(4): m = max(m, self.coords[i][1])
        return m
    def rotateLeft(self):
        if self.pieceShape == Tetrominoe.SquareShape:
            return self
        result = Shape()
        result.pieceShape = self.pieceShape
        for i in range(4):
            result.setX(i, self.y(i))
            result.setY(i, -self.x(i))
        return result
    def rotateRight(self):
        if self.pieceShape == Tetrominoe.SquareShape: return self
        result = Shape()
        result.pieceShape = self.pieceShape
        for i in range(4):
            result.setX(i, -self.y(i))
            result.setY(i, self.x(i))
        return result
if __name__ == '__main__':
    app = QApplication([])
    tetris = Tetris()
    sys.exit(app.exec_())
0
Фаер
641 / 370 / 259
Регистрация: 09.12.2011
Сообщений: 733
Записей в блоге: 35
12.03.2016, 19:42  [ТС] 59
Zodt, модуль у Вас потерялся. С Qt такое часто бывает. Покажите начало скрипта.

Вот что Вам стоит попробовать:
- Проверьте, правильно ли написан импорт. Насколько мне известно, _collection_abc - это пакет CPython, в Python его нет - есть collections.abc.
- Попробуйте вписать collections в поле "Дополнительные модули и библиотеки".
- Вручную найдите файлы пакета и приложите их к программе, как сопутствующие файлы(через интерфейс Бозона, естественно).

Как показывает опыт пользователей, последний способ наиболее продуктивен. Мы совсем недавно с одним клиентом решали проблему потери sip.pyd, используемого PyQt4, и решили через сопутствующие файлы.

Если не разберётесь, пишите в ЛС. Я и скрипт Ваш могу попробовать скомпилировать и через TeamViewer посмотреть. В общем, всё включено.

Добавлено через 58 секунд
Цитата Сообщение от Zodt Посмотреть сообщение
Если код поможет дать более верный ответ, то
Да, скорее всего, поможет.

Добавлено через 1 час 33 минуты
Zodt, я на виртуальной машине пошаманил с Вашим скриптом - сумел получить такую же ошибку и решить её.

В общем, Вам нужно в каталоге Python34\Lib найти файл _collections_abc.py (или .pyc, какой Вам больше нравится), переместить его в каталог project Бозона, затем добавить его в список "Сопутствующие файлы" и скомпилировать приложение. То есть этот файл должен просто кочевать с Вашей программой, и всё.

В аналогичных случаях так же действуйте: найдите файлы, соответствующие ненайденному пакету и прикрепите их. Обычно, их можно сначала в каталог скомпилированного приложения положить и посмотреть, запустится ли EXE-файл - чтобы по-новой не перекомпилировать каждый раз.
0
bodya_men
Нарушитель
44 / 52 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
12.03.2016, 23:57 60
Это что за костыли?

Добавлено через 43 секунды
Компилятор(бозон) на компиляторе(cx_freeze) компилятором(питоновский компилятор в байткод) погоняет?

Добавлено через 19 секунд
Мда
0
12.03.2016, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2016, 23:57

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код...

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той...

Не могу получить ответ от python скрипта и на его основе создать список (зависимые списки js ajax python)
Привет! Есть необходимость сделать динамические списки при помощи js, ajax...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru