Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Россия-2 _ Клуб программистов _ Учимся ездить на Питоне

Автор: IVK 25.8.2010, 19:28

Несколько дней назад начал пробовать связку Python + Tkinter. С чего началось - сказано http://forum.russ2.com/index.php?showtopic=1711&view=findpost&p=22892 . Какие первые выводы?
Прежде всего, убедился, что это удачный выбор. Да, мне нужен именно объектно-ориентированный язык (подходит к моей голове намного лучше, чем какой-то иной - сужу по bash) , именно интерпретируемый (в компилируемом замучился бы с правкой исходников) и именно в паре с графической библиотекой (надо же иногда видеть питоновские объекты воочию smile.gif ).
Так что в принципе вопрос решён : буду осваивать Python, причём в связке с Tkinter'ом.
Какие проблемы? Если кратко, то всё время возникают мелкие вопросы, ответы на которые обычно проще найти самому, чем спрашивать у других. Кавычки, отступы, методы, аргументы... и иной раз сложно сразу найти справку о том, что именно делать. Пакет документации к Питону установил, но и он не всегда помогает. Питон хорошо документирован, но не всегда могу сообразить, где именно искать нужную информацию.
Вот такой разве что вопрос могу задать (потому что он как раз не мелкий) : как лучше чайнику писать программы : в виде одного скрипта или в виде нескольких скриптов, выполняющих каждый свою часть работы? Спрашиваю потому что, по-моему, проще передавать данные из одного простенького скрипта в другой подобный же, чем соединять их в один сложный - у меня тут с переменными какие-то непонятки : по отдельности скриптики работают, а соединишь - начинается нечто непонятное. Или лучше сначала с переменными как следует разобраться?

Автор: kostyalamer 25.8.2010, 20:02

Python вообще хороший выбор, можно вместо Tkinter-а использовать другие модули для работы с графикой PyGTK PyQt и другие.
После старого доброго паскаля система отступов у меня по первости воспринималась достаточно дико но сейчас привык и дискомфорта уже не испытываю ( правда Geany иногда глючит при переносе кусков кода из проги в прогу и отступы приходится в kwrite править ). Опять же типы переменных не надо жестко задавать как в паскале. На сегодняшний день единственное что мне не нравится в нем это 'ленивые' логические операторы, но это в общем обходимо условиями хоть и на мой взгляд не удобно.
На мой взгляд простые программы проще писать одним скриптом, для сложных можно выделить подпрограммы в отдельный модуль ( если планируется использовать
их еще в других проектах ). С переменными разбираться нужно, я например страдаю излишней глобализацией, хотя по уму лучше обходиться по возможности return -ом при работе с функциями.

Автор: IVK 25.8.2010, 22:12

Насколько я понимаю, в Tkinter'е есть всё для начала (и с большим избытком), так что не буду усложнять : пусть пока будет один Tkinter.
Отступы меня тоже сначала озадачили - непривычно как-то, что они так много значат. Но привык уже.
А вот насчёт поиска ответов на всяческие мелкие вопросы. Никак не получается через sys.argv передать из одного скрипта в другой значение переменной. Всё получаю сообщение

Код
TypeError: 'list' object is not callable

и не могу выяснить, что делать.

Автор: kostyalamer 25.8.2010, 22:50

Иван посмотри тут : http://www.python.su/forum/viewtopic.php?id=7791
а вот очень интересный хелп по модулям : http://wiki.linuxformat.ru/index.php/LXF77:Python

Автор: IVK 11.9.2010, 18:55

Поставил пакет tk-demos - коллекция скриптов для демонстрации возможностей Tk, с возможностью правки на ходу. Очень наглядная штука, удобно поупражняться для начала, а главное - подсказывает идеи. Правда, скрипты на Tcl smile.gif А есть подобный пакет (желательно тоже для Tk) со скриптами на Питоне? В альтовских репозиториях вроде нет.

Автор: kostyalamer 11.9.2010, 19:14

Цитата(IVK @ 11.9.2010, 18:55) *
Поставил пакет tk-demos - коллекция скриптов для демонстрации возможностей Tk, с возможностью правки на ходу. Очень наглядная штука, удобно поупражняться для начала, а главное - подсказывает идеи. Правда, скрипты на Tcl smile.gif А есть подобный пакет (желательно тоже для Tk) со скриптами на Питоне? В альтовских репозиториях вроде нет.

Такого не видел, а вот , кстати полезная ссылочка http://www.tkdocs.com/tutorial/onepage.html она универсальна для
Tkinter-а и Tcl. вроде бы я ее еще здесь не упоминал.

Автор: IVK 12.9.2010, 23:31

Константин, вот я потренировался на чём попало и вернулся к wmfon'у - надо же попробовать прикрутить всё-таки предпросмотр. Итак, кнопка выбора должна сначала вызвать функцию предпросмотра; когда понравившийся файл выбран, то запускается твоя функция смены обоев (имя выбранного файла передаётся ей через переменную). И вот во что дело упёрлось : ведь tkFileDialog.askopenfilename (и, по-моему, все функции в tkFileDialog) - "одноразовый", а потому для последовательного просмотра картинок не годится. А есть в Питоне что-то такое, чтобы можно было, к примеру, одинарными щелчками мыши просматривать файлы в каталоге, а двойным щелчком - завершать функцию просмотра и вызывать функцию выбора обоев? Иначе говоря, есть ли файловый диалог, понимающий несколько разных способов выбора файла и реагирующий на них по-разному? Может, тут не Tkinter лучше использовать?

Автор: kostyalamer 12.9.2010, 23:57

В Tkinter-е такого диалога с предпросмотром содержимого вроде нет, делать предпросмотр посредством canvas тоже не очень хорошо программа сразу потянет за собой pyton-module-imaging а это довольно много всякой гадости ( которая в том же Antique будет лишней ) + зависимость от Qt. Есть другая идея посмотреть в сторону внешнего просмотровщика возвращающего имя файла, в таком варианте от файлового диалога можно вообще избавиться.

Автор: IVK 13.9.2010, 0:04

А какой в Antique просмотровщик? Или тут можно не пристёгиваться к определённой программе?

Автор: kostyalamer 13.9.2010, 0:14

Цитата(IVK @ 13.9.2010, 0:04) *
А какой в Antique просмотровщик? Или тут можно не пристёгиваться к определённой программе?

В Antique mirage, но думаю что можно не пристегиваться,лишь бы этот просмотровщик qt за собой не тянул по возможности .

Автор: IVK 13.9.2010, 18:05

Всё вроде просто : пишу функцию, которая запускает (к примеру) mirage, ловит адрес последнего открытого в нём файла и передаёт его в функцию выбора обоев. Но не могу найти, как заставить просмотровщик возвращать упомянутый адрес и как этот адрес ловить, и как вообще питоновские скрипты обмениваются данными с внешними программами. Методы в модуле subprocess ведь вроде не для этого?

Автор: kostyalamer 13.9.2010, 20:31

Иван , все на самом деле не очень просто , было бы просто я бы давно это сам написал wink.gif . Прогу даже с параметром можно вызвать используя модуль os
вот пример из того что сейчас пишу :
import os
#.............
os.system('mplayer cdda:// -cache 2500') # играем аудиодиск

модулем subprocess( вообще очень интересная штука) тоже можно решить эту проблему ( правда я его еще не ковырял ), в общем тебе и карты в руки, и в mirage не упирайся может тот же eog или что другое будет проще приделать к wmfon-у smile.gif

Автор: IVK 13.9.2010, 20:59

mirage с помощью os.system я уже вызывал, и тоже с параметрами, и не сомневаюсь, что и другой просмотровщик можно так же использовать; тут нет проблемы. Мне другое не совсем понятно : получается, нет простого способа отслеживания из питоновского скрипта того, какие файлы открывает им же вызванная внешняя программа? То есть дело-то не в деталях, а вообще в том, как питоновские скрипты общаются с другими программами. Вот эта группа модулей - os, sys, subprocess и т.п. - для этого (кроме прочего) предназначена, их и надо ковырять? Я, честно говоря, думал, что отслеживание действий программы, которая вызвана из скрипта - вполне обычное дело (программу ведь вызываешь ради некого результата, так как же за ним не проследить?), и должна быть какая-то готовая функция для этого. Но если её нет, придётся в самом деле поразмыслить smile.gif

Автор: kostyalamer 13.9.2010, 21:18

Размышлять придется ! При запуске программы через os.system управление полностью передается программе ( хотя думаю можно и фоновым режимом поиграться и вывод в файл переназначить, а этот файл уже сканировать питоновской прогой ) модуль subprocess позволяет запустить внешнюю прогу параллельно основной, но с ним я пока еще не работал и что можно из этого получить не знаю. Так что простор для творчества огромный smile.gif

Автор: IVK 13.9.2010, 21:39

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

P.S. Тему переименовал : очевидно, что Tkinter - нечто вторичное.

Автор: IVK 15.9.2010, 20:17

Кстати, когда требуется как можно более полная информация по какому-то модулю, классу и т.п., то где лучше искать? Вот здесь : http://www.python.org/doc ?

Автор: kostyalamer 15.9.2010, 21:45

Цитата(IVK @ 15.9.2010, 20:17) *
Кстати, когда требуется как можно более полная информация по какому-то модулю, классу и т.п., то где лучше искать? Вот здесь : http://www.python.org/doc ?

Очень неплохо посмотреть еще здесь:
http://python.su/
эта статейка хороша в качестве быстрой подсказки по питону: http://habrahabr.ru/blogs/python/31180/
а эта книжка гораздо глубже:http://www.intuit.ru/department/pl/python/1/
По установленным модулям помогает такой способ
в консоли даем команду python , получаем консоль питона
Дальше набираем , например для Tkintera:
import Tkinter
help (Tkinter)
Наслаждаемся подробным описанием ( на английском ) smile.gif

Автор: kostyalamer 18.9.2010, 18:00

Нашел описания большого количество модулей питона на русском : http://www.script-coding.info/Python/Otkidach3.html
Очень полезный хелп smile.gif

Автор: IVK 18.9.2010, 19:13

Спасибо, пригодится. Но у меня проблемы не столько с английским, сколько с азами программирования (правда, ещё больше - со временем; эту хроническую проблему лучше бы не упоминать, но я, честно говоря, из-за неё никак не могу сосредоточиться на Питоне). Вот насчёт этого модуля subprocess. Экземпляр класса Popen - это объект-посредник между функцией, в которой он создаётся, и дочерним процессом? И ещё : запуск программы через shell и напрямую - а в чём принципиальная разница?

Автор: kostyalamer 18.9.2010, 19:58

Цитата(IVK @ 18.9.2010, 19:13) *
Спасибо, пригодится. Но у меня проблемы не столько с английским, сколько с азами программирования (правда, ещё больше - со временем; эту хроническую проблему лучше бы не упоминать, но я, честно говоря, из-за неё никак не могу сосредоточиться на Питоне). Вот насчёт этого модуля subprocess. Экземпляр класса Popen - это объект-посредник между функцией, в которой он создаётся, и дочерним процессом? И ещё : запуск программы через shell и напрямую - а в чём принципиальная разница?

Со временем, проблема знакомая smile.gif . Иван зачем тебе модуль subprocess, думаю что модуля os вполне хватит.
n=os.popen('команда') запускает внешнюю команду ( mirage ничего в консоль к сожалению не выводит, надо подбирать чего-то другое ) и весь консольный вывод загоняет в переменную переменную в данном случае n, из этой строки и надо выдирать имя файла, как вариант. вообще с этими popen тема довольно интересная надо разбираться , я сейчас работаю примерно в том же направлении терзая из питона несчастный mplayer smile.gif
кстати если тебе надо что-бы внешняя команда не перехватывала управление у твоего скрипта а работала параллельно то как меня недавно осенило, надо просто ее
запустить в фоне, вот в моем случае :
os.system('mplayer -slave -quiet -input file=/tmp/mpinfile cdda:// &')

Автор: IVK 18.9.2010, 20:22

Цитата(kostyalamer @ 18.9.2010, 19:58) *
Иван зачем тебе модуль subprocess, думаю что модуля os вполне хватит.

Да без разницы, там сейчас явное дублирование одних модулей другим, так что мне всё равно, откуда брать Popen.

Цитата(kostyalamer @ 18.9.2010, 19:58) *
mirage ничего в консоль к сожалению не выводит, надо подбирать чего-то другое

А какой приемлемый для Antique просмотровщик выводит имена файлов в консоль? Я вообще даже не представляю, как это определить.

Цитата(kostyalamer @ 18.9.2010, 19:58) *
кстати если тебе надо что-бы внешняя команда не перехватывала управление у твоего скрипта а работала параллельно то как меня недавно осенило, надо просто ее
запустить в фоне, вот в моем случае :
os.system('mplayer -slave -quiet -input file=/tmp/mpinfile cdda:// &')

Хорошо. Но ведь если функция просмотра запустила просмотровщик и остановилась в ожидании, когда он отключится и выдаст имя последнего открытого файла, то получается разве не то же самое? Ну перехватил он управление - и что, ведь процесс скрипта (или Питона вообще) никуда от этого не исчезнет, просто ждёт?

Автор: kostyalamer 18.9.2010, 21:03

1) я тоже не знаю какой просмотровщик выводит имена в консоль, проверяется просто - запускаешь их из консоли и смотришь вывод, возможно идея вообще была ложной . Если все-таки найдешь такой посмотрим на его зависимости, тогда будет ясно подходит он для antique или нет.
2) Да в случае с wmfon-ом действительно фоновый режим скорее всего не нужен, я его привел тут как простую альтернативу модулю subprocess.
PS кстати какой средой разработки пользуешься? я перепробовал много: Geany, Idle, Eric, drpython везде свои глюки и баги ( с моей субъективной точки зрения )
так все достало что сидел одно время на связке konqueror+kwrite. Но недавно нашел то что нужно - medit, работает как Geany только без глюков с неправильным отображением пробелов. Рекомендую, только в меню Вид поставь галку отображать номера строк.

Автор: IVK 18.9.2010, 21:13

Цитата(kostyalamer @ 18.9.2010, 21:03) *
проверяется просто - запускаешь их из консоли и смотришь вывод, возможно идея вообще была ложной . Если все-таки найдешь такой посмотрим на его зависимости, тогда будет ясно подходит он для antique или нет.

Попробовать можно. Но почему вывод непременно в консоль? Ведь вроде бы "трубопроводу" между процессами консоль не нужна (хотя мои знания на этот счёт явно следует освежить).

Цитата(kostyalamer @ 18.9.2010, 21:03) *
кстати какой средой разработки пользуешься?

Как ни странно, никакой. Попробовал IDLE, что-то (не помню что) не понравилось, так что юзаю просто kate, а иногда и вовсе kwrite.

Цитата(kostyalamer @ 18.9.2010, 21:03) *
Но недавно нашел то что нужно - medit

Поставлю.

Автор: kostyalamer 18.9.2010, 21:22

Консоль это как простейший вариант, если сумеешь выдрать имя файла другим способом, прекрасно, но честно говоря пока не представляю как вряд ли просмотровщики могут вернуть его в виде параметра ( хотя возможно какие-то и могут )

Автор: IVK 18.9.2010, 21:43

Запустил для пробы Мираж, поглядел в /proc его процесс, там много чего есть; вполне возможно, и имена файлов. Возможно. в эту сторону и нужно рыть. Правда, тогда просмотровщик в самом деле должен работать параллельно, а функция просмотра должна отлавливать из /proc его файлы и записывать в переменную; она, конечно, будет при этом менять значение, но в итоге в ней останется имя как раз последнего открытого файла, потому что его уже ничто не перезапишет. Вот так примерно. Это, конечно, просто фантазии, ничем не проверенные!

Автор: IVK 19.9.2010, 21:31

Теоретически этот вариант выглядит довольно просто : запускаем из скрипта просмотровщик, узнаём номер его процесса, потом в каталоге /proc/<номер процесса>/fd вылавливаем ) дескрипторы (а через них - и имена) открываемых просмотровщиком файлов-картинок. А вот как это выразить не на русском языке, а на Питоне - вопрос. Наверное, я рассуждаю, как чайник, не знающий реалий программирования, и лучше действовать как-то по-другому; но я просто исхожу из того, что инфу о любом процессе по идее лучше брать прямо из /proc, а не добывать окольными путями.

Автор: kostyalamer 19.9.2010, 22:10

Вполне осушествимый вариант, попробуй для начала это сделать без питона в консоли, поюзай /proc в мс, если выдерешь оттуда имя файла, считай пол задачи решил, остальное уже дело техники smile.gif

Автор: IVK 19.9.2010, 23:34

Во всех попадавшихся мне мануалах говорится, что в каталоге /proc/<pid>/fd открывается по одной ссылке на каждый открытый процессом файл. В действительности, как показали первые же эксперименты, всё далеко не так прямолинейно, так что сразу и не поймёшь, что к чему. Но деваться некуда, придётся углубляться в тему smile.gif

Автор: IVK 28.9.2010, 19:15

Цитата(IVK @ 19.9.2010, 23:34) *
придётся углубляться в тему

Я основательно в неё углубился (работа ядра и процессов, их взаимодействие, открытие файлов, каналы, сокеты и т.п.), так что и про Питона забыл smile.gif Потом вернулся к тому, о чём тут выше говорилось, и получилось следующее.
Кроме "нормального" способа открытия файлов процессами (о котором везде пишется), есть ещё и некий другой (о котором мне что-то не попадалось упоминаний). Нормальный - это когда ядро открывает запрошенный процессом файл, а процессу даёт на него ссылку, которую легко можно подсмотреть в каталоге /proc/<pid>/fd; что нам и нужно. Например, так открывают файлы OpenOffice.org Writer, Kaffeine, Kpdf и многие другие. Но Mirage (как и вообще все проверенные мною просмотровщики) использует другой способ, внешне выражающийся в том, что при открытии первого файла в /proc/<pid>/fd появляются inotify и два сокета. Насколько я понимаю, Мираж через эти сокеты просто закачивает файлы (картинки, то есть) в своё пространство, а ядро тут вроде как остаётся не у дел, а потому в /proc имени этого файла обнаружить не удаётся. Я даже утилитой lsof выпытывал : какой прогой открыт вот этот файл(картинка)? lsof отвечает : никакой! но вот же эта картинка передо мной, в Мираже открыта!
Короче, вряд ли из /proc тут можно выцепить имя файла, разве что из самой программы.

Автор: kostyalamer 28.9.2010, 20:11

Иван, в таком варианте надо наверное тебе написать просмотровщик для wmfon-а самому, моя идея к сожалению себя не оправдала. Фиг с ним пускай тянет за собой модуль imaging, это наверное все-равно более перспективный вариант чем попытка выдрать имя файла из того-же mirage.

Автор: IVK 28.9.2010, 20:15

Цитата(kostyalamer @ 28.9.2010, 20:11) *
надо наверное тебе написать просмотровщик для wmfon-а самому

в смысле на canvas'е?

Автор: kostyalamer 28.9.2010, 20:24

Цитата(IVK @ 28.9.2010, 20:15) *
в смысле на canvas'е?

Да это будет не очень сложная задача , после твоих изысков в сторону процессов и субпроцессов (сам сейчас этой гадостью занимаюсь[субпроцессами] пишу морду для mplayer-а играющую аудиосидюки ). Потихоньку едет крыша crazy.gif , вот книжонку нашел хорошую: http://reslib.com/book/9194/288 правда там не дают много читать rtfm.gif

Автор: IVK 29.9.2010, 17:18

Дискуссию про MPlayer и т.п. переместил в http://forum.russ2.com/index.php?showtopic=2352&st=30&start=30.

Насчёт просмотра в wmfon.
С помощью Tk его, как я понял, не сделать вообще (см. http://forum.russ2.com/index.php?showtopic=2422&view=findpost&p=23239). Тогда другие графические библиотеки использовать, где есть "неодноразовые" аналоги tkFileDialog.askopenfilename? А у них тоже свои зависимости? Короче, тут вопрос вписывания всего этого дела в Antique, а в этом я как-то не очень ориентируюсь.
Всё-таки размышляю, нельзя ли как-то выпытать у просмотровщика имя открываемого файла. Если этот файл в ядре никак не регистрируется, то в /proc лазить бесполезно, а у самой проги узнать... единственное, что приходит в голову - это сохранение из неё файла куда надо; но, по-моему, с какими бы опциями ни запускать просмотровщик, всё равно это получается совсем уж негибкий вариант, и потому не годится. А какие ещё есть лёгкие просмотровщики, уместные в Antique? Может, какой-то из них открывает картинки "нормальным" способом? Тогда вопрос решится. Правда, в таком случае решение будет пристёгнуто именно к этому просмотровщику.

Автор: IVK 19.10.2010, 21:14

А не проще ковырнуть сам Мираж и кое-что в нём приписать, чтобы он, открывая файл, отправлял его адрес туда, откуда его будет тут же забирать скрипт, о котором мы тут выше говорили?

Автор: kostyalamer 19.10.2010, 21:20

Цитата(IVK @ 19.10.2010, 21:14) *
А не проще ковырнуть сам Мираж и кое-что в нём приписать, чтобы он, открывая файл, отправлял его адрес туда, откуда его будет тут же забирать скрипт, о котором мы тут выше говорили?

Можно и так, только перепакечивать его надо будет под другим именем, если можешь хакни его smile.gif

Автор: IVK 20.10.2010, 17:50

План простой. В меню Миража будет пункт "Выбор фона" (или нечто подобное), а к нему пристёгнута функция, отправляющая адрес открытого файла в условленное место (в файл с фиксированным именем хотя бы), откуда его немедленно забирает wmfon и записывает в соответствующую переменную; дальше всё ясно. Сейчас роюсь в Мираже (копию его сделал, с ней и химичу), размышляя, как это реализовать; никогда не бродил по такой большой (для меня) программе, сложно ориентироваться, тем более что успел уже отчасти подзабыть то немногое, что знал о Питоне wink.gif
Думаю, это самый простой способ сделать предпросмотр, не притягивая дополнительного софта.

Цитата(kostyalamer @ 19.10.2010, 21:20) *
только перепакечивать его надо будет под другим именем

Это с лицензией связано?

Автор: kostyalamer 20.10.2010, 20:12

Это связано не с лицензией, а с обновлениями, при первом обновлении из бранча на более свежую версию пакета, пропатченный mirage будет заменен на нормальный
и wmfon работать не будет. Хотя если поставить родной mirage в параллель к пропатченному, тоже получится бардак, значит надо прописывать зависимость на удаление, в общем все довольно паршиво с этими форками получается wink.gif

Автор: IVK 20.10.2010, 20:24

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

Автор: kostyalamer 20.10.2010, 20:55

Альтернативный способ вижу только один , написать просмотровщик самому, задача довольно интересная, но у меня сейчас на нее нет времени, так что либо mirage ковыряй, либо просмотровщик пиши smile.gif

Автор: IVK 21.10.2010, 19:54

Если просмотровщик писать на замену Миражу, то он же у меня заведомо хуже Миража получится. А если чисто для предпросмотра в wmfon, то зачем в дистре-минималке две дублирующих программы, и стоит ли дело труда? Уж лучше попробую, как время будет, слегка хакнуть Мираж wink.gif

Автор: kostyalamer 21.10.2010, 20:00

Цитата(IVK @ 21.10.2010, 19:54) *
Если просмотровщик писать на замену Миражу, то он же у меня заведомо хуже Миража получится. А если чисто для предпросмотра в wmfon, то зачем в дистре-минималке две дублирующих программы, и стоит ли дело труда? Уж лучше попробую, как время будет, слегка хакнуть Мираж wink.gif

Хакай, полезное и увлекательное дело good.gif Опакетим это безобразие и запихаем в наши сборки !

Автор: IVK 25.10.2010, 23:00

Вроде готово. Запускаешь wmfon, жмёшь "Просмотр", запускается Мираж, открываешь там нужную картинку, далее "Файл - Select", закрываешь Мираж, в wmfon жмёшь "Выбор фона" - и наслаждаешься новой картинкой на рабочем столе smile.gif Видимо, что-то можно улучшить, и с обновлением Миража проблема остаётся, но хотя бы в общем вопрос, похоже, решён. Модифицированные mirage и wmfon хотел выложить здесь, но почему-то неудачно. Константин, я тебе их лучше электронкой отправлю.

Автор: kostyalamer 25.10.2010, 23:10

Отлично ! отправляй smile.gif

Автор: IVK 26.10.2010, 15:50

Ещё немного подправил wmfon : в конец функции prosmotr дописал строку
f_name(event)
а кнопку "Выбор фона" убрал как ставшую лишней. Теперь при закрытии Миража wmfon меняет фоновую картинку автоматически.

Автор: kostyalamer 26.10.2010, 18:16

Цитата(IVK @ 26.10.2010, 15:50) *
Ещё немного подправил wmfon : в конец функции prosmotr дописал строку
f_name(event)
а кнопку "Выбор фона" убрал как ставшую лишней. Теперь при закрытии Миража wmfon меняет фоновую картинку автоматически.

То что надо, а то меня лишняя кнопка смущала, можно вот еще чего сделать твой хакнутый мираж переименовать например в mirage1 я его подложу в папку с прогой
и при опакечивании все это ляжет в папку /usr/share/wmfon, таким способом мы вообще уйдем от конфликтов с миражем. Присылай новую версию wmfon-а smile.gif

Автор: IVK 26.10.2010, 18:39

Вот он

 wmfon.py.tar.gz ( 1.22 килобайт ) : 1
 

Автор: kostyalamer 26.10.2010, 20:19

Цитата(IVK @ 26.10.2010, 18:39) *
Вот он

Отлично, теперь рассказывай куда подкладывать генно-модифицированный mirage.py , у себя в /usr/bin я вижу только mirage smile.gif

Автор: IVK 26.10.2010, 20:42

/usr/lib/python2.5/site-packages

Автор: kostyalamer 26.10.2010, 21:09

Подсунул туда вместо mirage.py , пока работать не хочет :

Код
[/home/k/wmfon-1.2/1] python -u "wmfon.py"
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1414, in __call__
    return self.func(*args)
  File "wmfon.py", line 83, in prosmotr
    f_name(event)
  File "wmfon.py", line 89, in f_name
    vybor(event)
  File "wmfon.py", line 64, in vybor
    strrnew=strru + fimg +strrd
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 12: ordinal not in range(128)

Автор: IVK 26.10.2010, 21:27

Ну это же wmfon не запускается, а не Мираж. У меня всё на ура идёт. Может, при архивировании/сжатии что-то поломалось? А, кстати, мой Мираж сам по себе ( python /usr/lib/python2.5/site-packages/mirage.py) запускается?

Автор: kostyalamer 26.10.2010, 21:40

Все запускается, эти ошибки появляются когда нажимаешь на кнопку выход в мираже, mirage.py запускается нормально smile.gif

Автор: IVK 26.10.2010, 21:49

Проверил аж несколько раз : сообщений об ошибках никаких, фон успешно заменяется.

Автор: kostyalamer 26.10.2010, 21:50

Дело темное, буду разбираться !

Автор: kostyalamer 27.10.2010, 8:49

Чудеса да и только, после перезагрузки компа все нормально работает smile.gif , никаких ошибок. Иван 2 предложения по-проге :
1) переименовать кнопку Просмотр в кнопку Выбрать фон
2) сделать кнопку Справка при нажатии на которую вываливается краткая инструкция по работе с прогой, главное напиши там о необходимости нажимать на Select в мираже для выбора картинки.
3) пока ты об этом думаешь, я подумаю как эту штуку пакетить.
PS Иван, отличная прога получилась, теперь ты настоящий кодер good.gif

Автор: IVK 27.10.2010, 18:59

Ну, настоящий или нет, а приятно, что получилось нечто хоть немного полезное smile.gif
Прилагаю обновлённый вариант wmfon'а. Справку, конечно, можно и подформатировать, но сейчас нет времени разбираться, как это делается.

 wmfon.py.tar.gz ( 1.54 килобайт ) : 2
 

Автор: kostyalamer 27.10.2010, 21:47

Отлично , со справкой есть 2 варианта сейчас объясню тебе как это делается в принципе, будет полезно на будущее прием простой но полезный, я такими штуками пользуюсь постоянно. Итак при нажатии на справку у тебя каждый раз открывается текстовое поле, а старое не закрывается.
В общем тебе надо отслеживать кол-во нажатий кнопки что-бы сделать из нее триггер на первое нажатие окно открывается, на второе закрывается
Делаешь какую либо переменную n и указываешь ее значение равной n= 2 в начале проги .В процедуре обработчика кнопок ( кстати не забудь указать в ней global n ) выполняешь
проверку четности :
global n
m = n%2 # остаток от деления на 2
if m == 0 :
....# открываем окно
else :
.... # закрываем окно
n= n+1
после чего выходим из процедуры.
Очень неплохо открывать справку в дочернем окне ( при этом лучше рамку с кнопкой закрытия у него отрубить , а то пользователь закроет его крестом и получится так что для получения следующего окна со справкой надо будет 2 раза нажимать на кнопку закрыть, ничего страшного в принципе , но бага )
Можно и в основном конечно, но тогда надо будет боюсь решать лишние проблемы с геометрией, для восстановления исходного р-ра окна. В общем нет предела совершенству smile.gif
Да я думаю кнопки выход и справка надо сделать такого-же р-ра как и остальные.
А прога получилась не просто полезная а очень полезная smile.gif , так что допиливай ее дальше по-мере возможности и в репу ей клубную и в репу по antique и в мою репу по WM-у ей будет прямая дорога good.gif
PS так как движок форума игнорирует несколько пробелов подряд заменил их на точки

Автор: IVK 28.10.2010, 17:58

Не успел выяснить, как справку пристегнуть к основному окну, а вообще получилось примерно так :

 wmfon.py.tar.gz ( 1.64 килобайт ) : 5
 

Автор: kostyalamer 28.10.2010, 21:50

Со справкой получилось все отлично , я нашел кстати в чем глюк с mirage:
Попробуй открыть папку с картинками с кирилическим именем например ~/Обои , на этом все рушится :

Код
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1414, in __call__
    return self.func(*args)
  File "wmfon.py", line 85, in prosmotr
    f_name(event)
  File "wmfon.py", line 91, in f_name
    vybor(event)
  File "wmfon.py", line 66, in vybor
    strrnew=strru + fimg +strrd
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 12: ordinal not in range(128)
<Tkinter.Event instance at 0xb6e4afac>
*** Exited with status 1 ***


в самом wmfon проблема решается так:

Код
os.path.expanduser('~')
         f = open(os.path.expanduser('~')+'/GNUstep/Defaults/WindowMaker','r',2)
         strr = f.read().decode('utf-8')
         f.close
         i = strr.find('WorkspaceBack = (')
         j = strr.find('\"',i)
         k = strr.find('\"',j+1)
         strru=strr[:j+1]
         strrd=strr[k:]
         strrnew=strru + fimg +strrd          
        
         f = open(os.path.expanduser('~')+'/GNUstep/Defaults/WindowMaker','w',2)
         f.write(strrnew.encode('utf-8'))
         f.close

видимо проблема где-то в mirage, при попытке записи пути файла.
надо подключить к ней модуль codecs и доработать запись имени файла, хотя возможно еще f_name косячит с кодировкой, погляди smile.gif

Автор: IVK 29.10.2010, 18:05

Мираж записывал имя файла нормально, так что в нём ничего менять не стал. А вот f_name исправил :

Код
def f_name(event):
        global fimg
        s = open("/tmp/s","r")
        fimg = unicode(s.read(), "utf8")
        vybor(event)


Теперь всё работает и тогда, когда картинки в каталоге с кириллическим именем.

Автор: kostyalamer 29.10.2010, 18:55

Отлично, на выходных постараюсь опакетить smile.gif

Автор: kostyalamer 30.10.2010, 17:34

Ну вот собрал пакетик, причем он с mirage совершенно не конфликтует, а наоборот, в нем mirage прописан в зависимостях. В общем хакерской программе хакерский пакет biggrin.gif
Просьба потестить после чего засуну во все наши репы :
http://kostyalamer.narod.ru/wmfon/wmfon-1.3-alt1.noarch.rpm
http://kostyalamer.narod.ru/wmfon/wmfon-1.3-alt1.src.rpm

Автор: IVK 30.10.2010, 18:13

Код
def prosmotr(event):
        pr = subprocess.Popen('/home/k/wmfon-1.3/mirage')
    pr.communicate()
    f_name(event)


/home/k/ - это зачем? При нажатии кнопки "Выбор фона" :

Код
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1414, in __call__
    return self.func(*args)
  File "wmfon.py", line 83, in prosmotr
    pr = subprocess.Popen('/home/k/wmfon-1.3/mirage')
  File "/usr/lib/python2.5/subprocess.py", line 594, in __init__
    errread, errwrite)
  File "/usr/lib/python2.5/subprocess.py", line 1097, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
<Tkinter.Event instance at 0xb6728aac>


Или я чего-то не понимаю?

Автор: kostyalamer 30.10.2010, 18:22

Да уж , осталось от экспериментов, сейчас поправлю !

Автор: kostyalamer 30.10.2010, 18:35

Поменял пакеты на исправленные, скачивай по тем же ссылкам.

Автор: IVK 30.10.2010, 18:48

Теперь работает, ошибок не заметно.

Автор: kostyalamer 30.10.2010, 19:13

Цитата(IVK @ 30.10.2010, 18:48) *
Теперь работает, ошибок не заметно.

Отлично, сейчас залью его в клубную репу и мою репу для WM-а, заодно подправлю статью на сайте и если успею в рассылку для Олега его отправлю.

Автор: kostyalamer 30.10.2010, 21:22

Залил куда мог wink.gif , и на сайт тоже : http://kostyalamer.narod.ru/wmfon/wmfon.html

Автор: IVK 30.10.2010, 21:31

Цитата(kostyalamer @ 30.10.2010, 21:22) *
http://kostyalamer.narod.ru/wmfon/wmfon.html

Приятно почитать smile.gif Только ведь прога мною не написана, а модифицирована (как вирусом biggrin.gif) или усовершенствована или что-то в этом роде.

Автор: kostyalamer 30.10.2010, 21:38

Эта версия написана точно тобой , так что принимай поздравления smile.gif , надо будет подумать к чему бы еще приложить твои кодерские способности !

Автор: IVK 30.10.2010, 21:52

У меня сейчас всяческие интернетовские соединения (завязанные большей частью на спутник) раскиданы как попало и автоматизированы самопальными мини-скриптами на shell; причём отчасти конфликтуют между собой, потому что сложно там всё : gprs задействован, спутник, локальный прокси, плюс перебои со связью добавляют проблем. Думаю написать на Питоне скрипт, который создаст единый интерфейс (графический, конечно) для всего этого хозяйства, в том числе для быстрого (нажатием кнопки) разрешения конфликтов. План, в принципе, уже составлен, только времени сейчас на программирование нет. Эта программа может и некоторым другим здесь пригодиться : спутниковая тарелка у нас в деревне - штука очень важная. Ну и для Antique, если нужно, готов поработать, только не прямо сейчас.

Автор: and 15.12.2010, 19:26

Тоже начал потихоньку осваивать питон. Сначала пробовал изучать С++ и QT, но здесь вырисовывается долгий и сложный вариант... А на питоне как то все прост, легко и сразу получается, т.е. производительность труда намного выше. В общем, наш метод... Может к январю не торопясь напишу программку по автоматизации приема данных с телеметрии.

Автор: IVK 15.12.2010, 20:21

Да, Питон в самом деле легко осваивается. Я, правда, сейчас от него отвлёкся (и то, о чём в предыдущем сообщении говорил, остановилось ещё на стадии совершенствовании shell-скриптов), но, когда более-менее свободное время появится, непременно опять займусь Питоном.

Автор: and 17.12.2010, 18:55

Продолжаю писать скриптик (пока в виндос smile.gif ) и возникли некие сложности.
Собственно скриптик представляет простейшую форму с кнопками, которые запускают 2 консольные программки. При запуске питон-скрипта одновременно появляется два окна, одно GUI, а второе окно консоли, в котором эти программки выводят сообщения.
Это удобно , но некрасиво как то. Окно консоли можно убрать, сменив расширение файла py на pyw. Но тогда теряется и информация от программок. Хотелось бы как то перенаправить вывод из консоли в текстовый виджет tkinter, т.е. сделать виртуальное окошко консоли, но никак не найду способа.


Автор: kostyalamer 17.12.2010, 19:45

Боюсь, что одного Tkinter-а для этой цели не хватит, нужно поглядеть в сторону модуля subprocess, в нем реализована возможность перехвата вывода консольных команд, в переменную или файл : http://wiki.dieg.info/doku.php/subprocess
в простейших случаях можно и модулем os обойтись :
http://forum.vingrad.ru/forum/topic-109919/view-all.html
есть и другой способ : http://www.pydev.ru/topic/213/?page=1#post-933
Ну а загнать из переменной или файла текст в поле формы это уже дело техники.

Автор: and 17.12.2010, 20:53

Спасибо, попробую.

Автор: and 11.9.2011, 8:57

После некоторого перерыва опять вернулся к питонам. И столкнулся со шрифтами. Почему то tkinter дает разные относительные размеры шрифтов в разных ос. Например, в виндовсе они слишком большие, в линуксе маленькие. Прикрутил к программе менюшку, позволяющую устанавливать разммр вручную, но может есть другое какое решение?
ЗЫ: наткнулся на малоизвестный проект GUI для tkinter, называется PAGE. http://page.sourceforge.net/#Documentation Если он окажется легким в освоении, то это очень упростит разработку небольших питоновских tk программок

Автор: IVK 13.9.2011, 19:04

Цитата(and @ 11.9.2011, 8:57) *
И столкнулся со шрифтами. Почему то tkinter дает разные относительные размеры шрифтов в разных ос. Например, в виндовсе они слишком большие, в линуксе маленькие. Прикрутил к программе менюшку, позволяющую устанавливать разммр вручную, но может есть другое какое решение?

Наверное, лучше спрашивать там, где много спецов по Питону. Я, помнится, там буквально тонул в подобных частностях, на которые непонятно где взять ответ, хотя в общем в Питоне вроде как всё просто и ясно biggrin.gif А сейчас им и заниматься некогда sad.gif

Автор: kostyalamer 13.9.2011, 22:30

Цитата(IVK @ 13.9.2011, 19:04) *
Наверное, лучше спрашивать там, где много спецов по Питону. Я, помнится, там буквально тонул в подобных частностях, на которые непонятно где взять ответ, хотя в общем в Питоне вроде как всё просто и ясно biggrin.gif А сейчас им и заниматься некогда sad.gif

Да, мне сейчас к сожалению тоже пока не до python-а.
А форум хороший вот : http://forum.script-coding.com/viewforum.php?id=16&p=1 там можно поспрашивать насчет шрифтов.

Автор: and 15.9.2011, 17:49

Спасибо, поспрашиваю. В том то и дело, что основы в любой области простые, а стоит чуть залезть в детали и начинается.

Автор: komcumir 12.10.2011, 12:46

Практически под влиянием этой темы сел изучать питон, написал lines, если есть у кого возможность потестите плиз )

 linespy.zip ( 94.84 килобайт ) : 6
 

Автор: ksa 12.10.2011, 13:40

Это игрушка чтоль ?
PS Какие зависимости ? Попробую затестить.

Автор: komcumir 12.10.2011, 14:03

Цитата(ksa @ 12.10.2011, 13:40) *
Это игрушка чтоль ?
PS Какие зависимости ? Попробую затестить.

да игрушка lines (в первом приближении) зависимостей кроме питона вроде бы нет, файл перезалил (забыл в первом реализовать одно из правил lines)

Автор: ksa 12.10.2011, 16:34

Цитата(komcumir @ 12.10.2011, 15:03) *
да игрушка lines (в первом приближении) зависимостей кроме питона вроде бы нет, файл перезалил (забыл в первом реализовать одно из правил lines)

Ну, тогда надо бы еще выводить "game over" при заполнении всего поля, а то сейчас игра просто висит и ни на что не реагирует в такой ситуации...
PS В остальном, вроде, играбельно.

Автор: kostyalamer 12.10.2011, 21:40

Цитата(komcumir @ 12.10.2011, 12:46) *
Практически под влиянием этой темы сел изучать питон, написал lines, если есть у кого возможность потестите плиз )

1) Погляди еще эту темку : http://forum.altlinux.org/index.php/topic,6765.msg96647.html#msg96647
2) Все работает smile.gif , еще бы расширить окно и добавить на него счетчик очков и показ следующих выпадающих шариков. И звуков бы не помешало каких-нибудь.

Автор: komcumir 13.10.2011, 9:44

Цитата(ksa @ 12.10.2011, 16:34) *
Ну, тогда надо бы еще выводить "game over" при заполнении всего поля, а то сейчас игра просто висит и ни на что не реагирует в такой ситуации...
PS В остальном, вроде, играбельно.


ну дык еще не доделана ), остальное уже по мелочи осталось ) главное было реализовать поиск пути и удаление шаров...

Автор: and 14.10.2011, 18:45

Для желающих поэкспериментировать с python3 на сервере 179 школы имеется инструкция по его установке в альт линукс
http://server.179.ru/wiki/?page=DenisKirienko/Python/UstanovkaNaAltLinux&v=5z2
Python3 установиться в каталог /usr/local/bin

Для его вызова используем команду python3
Чтобы она выполнялась добавим путь поиска /usr/local/bin в системную переменную PATH
Для этого открываем в домашнем каталоге файл .bash_profile
находим там строчку:
# User specific environment and startup programs
и добавляем после нее:
PATH="$HOME/bin: $PATH:/usr/local/bin"

Автор: and 15.10.2011, 19:09

Всем хороша связка Geany + Python, только нет отладчика. А очень было бы удобно походить по шагам, посмотреть как меняются переменные.
Вот http://dev.svetlyak.ru/debugger-with-blackjack интересный пост с видео про консольный отладчик pdbpp. Там же ссылка на страницу его автора. Хорошо бы эту программу опакетить.

Автор: komcumir 17.10.2011, 11:51

Новая версия linespy https://sourceforge.net/projects/linespy/files/linespy.0.0.5.zip/download Есть Гейм-овер считает очки, таймер.

Автор: and 17.10.2011, 20:25

Цитата(komcumir @ 17.10.2011, 11:51) *
Новая версия linespy https://sourceforge.net/projects/linespy/files/linespy.0.0.5.zip/download Есть Гейм-овер считает очки, таймер.

Ага. Потестил. Работает

Автор: and 17.10.2011, 20:53

Если какого-то из модулей python нет в репозитории альта, то это не значит, что его нельзя установить.
Ищем и ставим в synaptic пакет python-module-setuptools.
В этом пакете находится программа easy_install, которая ищет питон модуль по имени и устанавливает его из официального сайта python.

Например, надо поставить модуль xlrd для чтения exel файлов, которого нет в репозитории альта.
В консоли заходим в режим суперпользователя и командуем:
[root<>gravity ~]# easy_install xlrd

Ответ машины:

Searching for xlrd
Reading http://pypi.python.org/simple/xlrd/
Reading http://www.lexicon.net/sjmachin/xlrd.htm
Best match: xlrd 0.7.1
Downloading http://pypi.python.org/packages/source/x/xlrd/xlrd-0.7.1.zip#md5=851bd20873224d97cfb5ccca2d22b81c
Processing xlrd-0.7.1.zip
Running xlrd-0.7.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-A2ofKq/xlrd-0.7.1/egg-dist-tmp--9my5j
zip_safe flag not set; analyzing archive contents...
Adding xlrd 0.7.1 to easy-install.pth file
Installing runxlrd.py script to /usr/bin

Installed /usr/lib/python2.5/site-packages/xlrd-0.7.1-py2.5.egg
Processing dependencies for xlrd
Finished processing dependencies for xlrd

Итак, модуль успешно установлен.

Автор: IVK 26.12.2011, 20:08

Цитата(kostyalamer @ 25.12.2011, 17:24) *
Почитай интересную статейку на эту тему , не далее как вчера чуть-чуть допиливал wmfon, очень помогла:
http://asvetlov.blogspot.com/2011/03/subprocess.html
Кстати обновленный wmfon в репе, теперь mirage открывается не с пустым окном, а с изображениями из /usr/share/design-current/backgrounds/
посредством команды :
pr = subprocess.Popen(['/usr/share/wmfon/mirage','-R','/usr/share/design-current/backgrounds/'], shell=False)
в твоем случае наверное:
subprocess.call(['cd',' <некий каталог>'], shell=False)

Прошёл по ссылке, но у меня не то : я как раз использую строку+shell=True или список+shell=False.
Код
>>> subprocess.call(['cd','~'], shell=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/subprocess.py", line 470, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.6/subprocess.py", line 623, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
>>> subprocess.call(['cd ~'],shell=True)
0
>>> subprocess.call('pwd', shell=True)
/
0
>>>

В первом случае ошибка, во втором якобы ОК, а на деле каталог не меняется (Питон в данном случае запущен из / "
Причём другие команды (какие запускал), кроме cd, работают ведь нормально.

Автор: IVK 28.12.2011, 22:26

to kostyalamer
Костя, ты никогда не пробовал организовать обмен данными между питоновским скриптом и и вызванным из него Xterm'ом? В манах и инете кое-что есть на эту тему, но применить почему-то не получается. Сначала что-то типа

Код
a = subprocess.Popen('xterm', shell = True, stdin = subprocess.PIPE, stdout=subprocess.PIPE)

а потом хоть с communicate(), хоть без него - результата нет. То есть окошко Xterm появляется, но каких-либо признаков контакта его с моим скриптом не могу уловить wink.gif То же самое, если Питон в интерактивном режиме - соединиться с Xterm и тогда не получается.

Автор: kostyalamer 29.12.2011, 6:45

Цитата(IVK @ 28.12.2011, 22:26) *
to kostyalamer
Костя, ты никогда не пробовал организовать обмен данными между питоновским скриптом и и вызванным из него Xterm'ом? В манах и инете кое-что есть на эту тему, но применить почему-то не получается. Сначала что-то типа
Код
a = subprocess.Popen('xterm', shell = True, stdin = subprocess.PIPE, stdout=subprocess.PIPE)

а потом хоть с communicate(), хоть без него - результата нет. То есть окошко Xterm появляется, но каких-либо признаков контакта его с моим скриптом не могу уловить wink.gif То же самое, если Питон в интерактивном режиме - соединиться с Xterm и тогда не получается.

Делал, правда это было давно:
Код
f = subprocess.Popen('mplayer -slave -quiet -input file=/tmp/mpinfile cdda://%s' %trk, shell = True, stdout = subprocess.PIPE, stdin = subprocess.PIPE )
        
    print "1home info"
    n = f.stdout.readline(-1)#MPlayer 29766-4.4.1 (C) 2000-2009 MPlayer Tea
    print "1-"+ n
    n = f.stdout.readline(-1)#141 аудио & 305 видео кодеков
    print "2-"+ n
    n = f.stdout.readline(-1)#Terminal type `unknown' is not defined.
    print "3-"+ n
    n = f.stdout.readline(-1)#Пустая строка
    print "4-"+ n
    n = f.stdout.readline(-1)#Воспроизведение cdda://1.
    print "5-"+ n
    try:
       n = f.stdout.readline(-1)#Найден аудио CD с 19 дорожками. здесь ловить ошибку отсутствия диска !

архив с программой в прицепе, погляди там сам что к чему :
 wmcdplayer_1.0.tar.gz ( 3.83 килобайт ) : 1

Автор: and 21.1.2012, 18:06

Кстати, на ютубе имеется видеокурс по освоению питона с нуля http://www.youtube.com/watch?v=jMg12k-v75g
А еще питон изучают в Сколково smile.gif http://www.youtube.com/watch?v=5bh3NNYKO-0&feature=related

Автор: Skull 23.1.2012, 11:20

Цитата(and @ 21.1.2012, 17:06) *
А еще питон изучают в Сколково smile.gif http://www.youtube.com/watch?v=5bh3NNYKO-0&feature=related
Потому что хотят сделать кальку с MIT. smile.gif

Автор: kostyalamer 2.9.2012, 22:10

Нашел хорошую инфу по Tkinter-у good.gif может кому-нибудь пригодится :
http://ru.wikiversity.org/wiki/%CA%F3%F0%F1_%EF%EE_%E1%E8%E1%EB%E8%EE%F2%E5%EA%E5_Tkinter_%FF%E7%FB%EA%E0_Python

Автор: and 4.9.2012, 21:38

Цитата(kostyalamer @ 2.9.2012, 21:10) *
Нашел хорошую инфу по Tkinter-у good.gif может кому-нибудь пригодится :

Cпасибо, материал интересный.
Все-таки жалко, что для tkintera не разработан простой конструктор форм в духе Gambas или visual бейсика. Page все таки немного не то, его код надо существенно править ручками.
Еще наткнулся на проект для винды Visual Tkinter Python IDE http://sourceforge.net/projects/visualtkinter/ Судя по роликам с ютуба по задумке это самое то, но по исполнение похоже очень сырое. Официальный сайт не работает, для установки требуется dotnet, На моем компе оно не пошло, на работе половина работает, половина нет, например невозможно сменить имя кнопки - dotnet выбрасывает какой то exception. В общем, увы и ах dry.gif

Автор: tema 4.4.2017, 23:05

Перенесено из темы "http://forum.russ2.com/index.php?showtopic=4389&view=findpost&p=48779"

Долго ловил книгу на ОЗОНе. Поймал smile.gif
Теперь грызу Питон по книге smile.gif

 

Автор: tema 5.4.2017, 21:11

Пока не очень понял как работать с кнопками на форме... Тяжко в чужой программе сходу...

Автор: kostyalamer 5.4.2017, 21:39

Цитата(tema @ 5.4.2017, 21:11) *
Пока не очень понял как работать с кнопками на форме... Тяжко в чужой программе сходу...

Tkinter осваиваешь или PyQt ? Если tkinter , то вот хороший учебник : http://younglinux.info/tkinter.php , если Qt то это к Ивану smile.gif

Автор: tema 7.4.2017, 13:39

Я осваиваю то, что используется в ruleuser создаталем программы. Код там простой невизуальный который, но с кнопками я пока не знаю. Спасибо за ссылку!
Вроде исполльзуется gtk2

Автор: kostyalamer 7.4.2017, 21:37

Пожалуйста smile.gif , если gtk2 то вот хороший учебник по PyGTK :
http://pygtk.rosix.ru/%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA-pygtk-2-0/

Автор: tema 11.4.2017, 1:55

И ещё раз спасибо! smile.gif

Автор: Koi.v2 27.11.2020, 16:01

На самоизоляции решил научиться питону, и появились некоторые вопросы.

Нужно из строки:
kernel-image-std-def#1:5.4.68-alt1.1:p9+258798.40.5.2<>1601700122

Извлечь номер ядра то есть 5.4.68
Для этого я использую:

Код
re.findall(r'[0-9].[0-9].[0-9]{2}', x)[0]
Под этот шаблон подходит только одно выражение, но findall выдает список 1 выражение то что мне надо и еще 3 небольшие куски типа p9+258798 из-за этого я использую [0] что бы направить в переменную только нужное, это костыль.
х — это строка просто выше находится цикл for перебирающий список со строками.
Я пытался использовать функцию поиска с права до 1-вого совпадения, но результат def#1:5. Почему это происходит не пойму.

Для примера тип ядра извлекаю из строки так:
Код
re.findall(r'[a-z]{3}-[a-z]{3}')
Просто и без всяких костылей, но для цифр это не работает так же хорошо, притом проблема именно с цифрами.
=============

Еще один вопрос, он скорее всего совершенно нубский.

Есть команда:
Код
self.pushButton_DISTR.setDisabled(btn_off_on)

В нее хотелось бы вставить переменную вместо DISTR
Это прекрастно работает если в команде нет ссылки не экземпляр, но с ссылкой всегда выдает ошибку атрибута, видимо нужно как-то экранировать переменную, но как это сделать правильно пока не знаю.
Для теста можно сделать любую команду ссылкой на экземпляр и попробовать воткнуть в ее строку переменную например заменив любую букву.

Автор: ИВК 27.11.2020, 16:58

Ничего не помню sad.gif Конечно, если бы попрактиковаться сейчас в Питоне, то вспомнил бы, но такое в ближайшее время точно не светит mellow.gif

Автор: Koi.v2 27.11.2020, 19:51

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

Без экрана
f = re.findall(r'[0-9].[0-9].[0-9]{2}', s)

Код
Переменная S
kernel-image-std-def#1:5.4.68-alt1.1:p9+258798.40.5.2<>1601700122

Переменная F
['5.4.68', '9+2587', '5.2<>16', '017001']

То есть интерпретатор считает что я его прошу найти
0-9 ( цифру ) + ( любую фигню ) + 0-9 ( цифру ) + ( любую фигню ) + 0-9 ( 2 цифры )

С экраном
f = re.findall(r'[0-9]\.[0-9]\.[0-9]{2}', s)

Код
Переменная S
kernel-image-std-def#1:5.4.68-alt1.1:p9+258798.40.5.2<>1601700122

Переменная F
['5.4.68']


Самое прикольное что я знаю о необходимости экранировать точки в регулярках, но раз в мане было написано не надо, ну не спорить же с разработчиками языка, а у них оказывается семь пятниц на неделе всегда найдутся исключения. biggrin.gif

Автор: Koi.v2 28.11.2020, 17:16

Конечный вариант более унифицирован.

Код
def search_kernel(self):
        """Поиск ядра для обновления"""
        flavour = self.search_re(kernel_flavour=release())
        real_number = self.search_re(kernel_num=release())
        new_version = real_number
  
        search_version = run(
            f"apt-cache pkgnames kernel-image-{flavour}#",
            shell=True, stdout=PIPE, encoding='utf-8').stdout
        
        for x in search_version.splitlines():
            act = self.search_re(kernel_num=x)
            if act > new_version:
                new_version = act
        
        self.compare_kernel(new_version, real_number)


В self.compare_kernel переменные расходятся по разным функциям для частного применения, а в метод self.search_re выделил регулярки чтоб не калякать их каждый раз.

Код
def search_re(self, kernel_num='', kernel_flavour=''):
        """Извлечение номеров ядер и типа def"""
        search_num = re.compile(r'[2-9]\.[0-9]{1,2}\.?[0-9]{0,3}(?=-)')
        search_flavour = re.compile(r'[a-z]+-[def]{3}')
        
        if kernel_num:
            num_version = "".join(search_num.findall(kernel_num))
            return num_version
        elif kernel_flavour:
            flavour_type = "".join(search_flavour.findall(kernel_flavour))
            return flavour_type


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

Тестил на списке:
kernel-image-domU-std-def#1:5.4.68-alt1.1:p9+258798.40.5.2<>1601696113
kernel-image-old-def#1:4.19.128-alt2:p9+253518.100.2.1<>1592585800
kernel-image-std-def#1:5.4.68-alt1.1:p9+258798.40.5.2<>1601700122
kernel-image-un-def#1:5.7.19-alt1:p9+256869.100.1.1<>1598980297
kernel-image-domU-un-def#1:5.7.19-alt1:p9+256869.100.1.1<>1598544846
kernel-image-domU-old-def#1:4.19.128-alt2:p9+253518.100.2.1<>1592585511

И в резных вариантах release()

Все отлично извлекается.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)