Найти - Пользователи
Полная версия: примеры из urwid tutorial и проблема с установкой
Начало » Python для новичков » примеры из urwid tutorial и проблема с установкой
1 2
antib
Доброго времени суток.
Взялся вникать в руководство по urwid и столкнулся с тем, что примеры из этого руководства не запускаются. На чём запускаю: ОС - linux mint debian edition, Python 3.2.3 (default, Jun 25 2012, 23:10:56) on linux2 и IPython 0.13.1. Библиотека urwid поставлена из репов, согласно aptitude версия 1.0.1-2.
Например копипастю такое:
import urwid
def exit_on_q(key):
    if key in ('q', 'Q'):
        raise urwid.ExitMainLoop()
palette = [
    ('banner', '', '', '', '#ffa', '#60d'),
    ('streak', '', '', '', 'g50', '#60a'),
    ('inside', '', '', '', 'g38', '#808'),
    ('outside', '', '', '', 'g27', '#a06'),
    ('bg', '', '', '', 'g7', '#d06'),]
placeholder = urwid.SolidFill()
loop = urwid.MainLoop(placeholder, palette, unhandled_input=exit_on_q)
loop.screen.set_terminal_properties(colors=256)
loop.widget = urwid.AttrMap(placeholder, 'bg')
loop.widget.original_widget = urwid.Filler(urwid.Pile([]))
div = urwid.Divider()
outside = urwid.AttrMap(div, 'outside')
inside = urwid.AttrMap(div, 'inside')
txt = urwid.Text(('banner', " Hello World "), align='center')
streak = urwid.AttrMap(txt, 'streak')
pile = loop.widget.base_widget # .base_widget skips the decorations
for item in [outside, inside, streak, inside, outside]:
     pile.contents.append((item, pile.options()))
loop.run()

Первые примеры не запускались, ругаясь на код типа u'какой-то текст', но это исправлялось стиранием u перед кавычками. Этот пример при попытке запуска пишет такое:
AttributeError                            Traceback (most recent call last)
/usr/lib/python3/dist-packages/IPython/utils/py3compat.py in execfile(fname, glob, loc)
     74     def execfile(fname, glob, loc=None):
     75         loc = loc if (loc is not None) else glob
---> 76         exec(compile(open(fname, 'rb').read(), fname, 'exec'), glob, loc)
     77 
     78     # Refactor print statements in doctests.
/home/antib/Документы/Py/urwid4.py in <module>()
     25 pile = loop.widget.base_widget # .base_widget skips the decorations
     26 for item in [outside, inside, streak, inside, outside]:
---> 27      pile.contents.append((item, pile.options()))
     28 
     29 loop.run()

import urwid
def menu_button(caption, callback):
    button = urwid.Button(caption)
    urwid.connect_signal(button, 'click', callback)
    return urwid.AttrMap(button, None, focus_map='reversed')
def sub_menu(caption, choices):
    contents = menu(caption, choices)
    def open_menu(button):
        return top.open_box(contents)
    return menu_button([caption, '...'], open_menu)
def menu(title, choices):
    body = [urwid.Text(title), urwid.Divider()]
    body.extend(choices)
    return urwid.ListBox(urwid.SimpleFocusListWalker(body))
def item_chosen(button):
    response = urwid.Text(['You chose ', button.label, '\n'])
    done = menu_button('Ok', exit_program)
    top.open_box(urwid.Filler(urwid.Pile([response, done])))
def exit_program(button):
    raise urwid.ExitMainLoop()
menu_top = menu('Main Menu', [
    sub_menu('Applications', [
        sub_menu('Accessories', [
            menu_button('Text Editor', item_chosen),
            menu_button('Terminal', item_chosen),
        ]),
    ]),
    sub_menu('System', [
        sub_menu('Preferences', [
            menu_button('Appearance', item_chosen),
        ]),
        menu_button('Lock Screen', item_chosen),
    ]),
])
class CascadingBoxes(urwid.WidgetPlaceholder):
    max_box_levels = 4
    def __init__(self, box):
        super(CascadingBoxes, self).__init__(urwid.SolidFill('/'))
        self.box_level = 0
        self.open_box(box)
    def open_box(self, box):
        self.original_widget = urwid.Overlay(urwid.LineBox(box),
            self.original_widget,
            align='center', width=('relative', 80),
            valign='middle', height=('relative', 80),
            min_width=24, min_height=8,
            left=self.box_level * 3,
            right=(self.max_box_levels - self.box_level - 1) * 3,
            top=self.box_level * 2,
            bottom=(self.max_box_levels - self.box_level - 1) * 2)
        self.box_level += 1
    def keypress(self, size, key):
        if key == 'esc' and self.box_level > 1:
            self.original_widget = self.original_widget[0]
            self.box_level -= 1
        else:
            return super(CascadingBoxes, self).keypress(size, key)
top = CascadingBoxes(menu_top)
urwid.MainLoop(top, palette=[('reversed', 'standout', '')]).run()
ответ:
antib@silentbox:~/Документы/Py$ ipython3 urwid8.py 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/usr/lib/python3/dist-packages/IPython/utils/py3compat.py in execfile(fname, glob, loc)
     74     def execfile(fname, glob, loc=None):
     75         loc = loc if (loc is not None) else glob
---> 76         exec(compile(open(fname, 'rb').read(), fname, 'exec'), glob, loc)
     77 
     78     # Refactor print statements in doctests.
/home/antib/Документы/Py/urwid8.py in <module>()
     29         sub_menu('Accessories', [
     30             menu_button('Text Editor', item_chosen),
---> 31             menu_button('Terminal', item_chosen),
     32         ]),
     33     ]),
/home/antib/Документы/Py/urwid8.py in sub_menu(caption, choices)
      7 
      8 def sub_menu(caption, choices):
----> 9     contents = menu(caption, choices)
     10     def open_menu(button):
     11         return top.open_box(contents)
/home/antib/Документы/Py/urwid8.py in menu(title, choices)
     15     body = [urwid.Text(title), urwid.Divider()]
     16     body.extend(choices)
---> 17     return urwid.ListBox(urwid.SimpleFocusListWalker(body))
     18 
     19 def item_chosen(button):
AttributeError: 'module' object has no attribute 'SimpleFocusListWalker'

попробовал поставить urwid с стайта разработчика.
antib@silentbox:~/Документы/Py/urwid-1.1.1$ sudo python3 setup.py build
[sudo] password for antib: 
running build
running build_py
running build_ext
building 'urwid.str_util' extension
gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -fPIC -I/usr/include/python3.2mu -c source/str_util.c -o build/temp.linux-x86_64-3.2/source/str_util.o
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-3.2/source/str_util.o -o build/lib.linux-x86_64-3.2/urwid/str_util.cpython-32mu.so
antib@silentbox:~/Документы/Py/urwid-1.1.1$ sudo python3 setup.py install
running install
Checking .pth file support in /usr/local/lib/python3.2/dist-packages/
/usr/bin/python3 -E -c pass
TEST PASSED: /usr/local/lib/python3.2/dist-packages/ appears to support .pth files
running bdist_egg
running egg_info
writing urwid.egg-info/PKG-INFO
writing top-level names to urwid.egg-info/top_level.txt
writing dependency_links to urwid.egg-info/dependency_links.txt
reading manifest file 'urwid.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'urwid.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
running build_ext
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/text_layout.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/html_fragment.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/font.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/listbox.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/raw_display.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/display_common.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/container.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/old_str_util.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/command_map.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/tests.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/graphics.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/compat.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/canvas.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/escape.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/split_repr.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/treetools.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/decoration.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/vterm_test.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/monitored_list.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/web_display.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/str_util.cpython-32mu.so -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/lcd_display.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/curses_display.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/signals.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/__init__.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/version.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/util.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/widget.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/wimp.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/vterm.py -> build/bdist.linux-x86_64/egg/urwid
copying build/lib.linux-x86_64-3.2/urwid/main_loop.py -> build/bdist.linux-x86_64/egg/urwid
byte-compiling build/bdist.linux-x86_64/egg/urwid/text_layout.py to text_layout.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/html_fragment.py to html_fragment.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/font.py to font.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/listbox.py to listbox.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/raw_display.py to raw_display.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/display_common.py to display_common.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/container.py to container.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/old_str_util.py to old_str_util.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/command_map.py to command_map.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/tests.py to tests.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/graphics.py to graphics.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/compat.py to compat.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/canvas.py to canvas.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/escape.py to escape.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/split_repr.py to split_repr.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/treetools.py to treetools.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/decoration.py to decoration.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/vterm_test.py to vterm_test.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/monitored_list.py to monitored_list.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/web_display.py to web_display.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/lcd_display.py to lcd_display.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/curses_display.py to curses_display.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/signals.py to signals.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/__init__.py to __init__.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/version.py to version.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/util.py to util.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/widget.py to widget.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/wimp.py to wimp.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/vterm.py to vterm.cpython-32.pyc
byte-compiling build/bdist.linux-x86_64/egg/urwid/main_loop.py to main_loop.cpython-32.pyc
creating stub loader for urwid/str_util.cpython-32mu.so
byte-compiling build/bdist.linux-x86_64/egg/urwid/str_util.py to str_util.cpython-32.pyc
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying urwid.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying urwid.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying urwid.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying urwid.egg-info/not-zip-safe -> build/bdist.linux-x86_64/egg/EGG-INFO
copying urwid.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
writing build/bdist.linux-x86_64/egg/EGG-INFO/native_libs.txt
creating dist
creating 'dist/urwid-1.1.1-py3.2-linux-x86_64.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing urwid-1.1.1-py3.2-linux-x86_64.egg
creating /usr/local/lib/python3.2/dist-packages/urwid-1.1.1-py3.2-linux-x86_64.egg
Extracting urwid-1.1.1-py3.2-linux-x86_64.egg to /usr/local/lib/python3.2/dist-packages
Adding urwid 1.1.1 to easy-install.pth file
Installed /usr/local/lib/python3.2/dist-packages/urwid-1.1.1-py3.2-linux-x86_64.egg
Processing dependencies for urwid==1.1.1
Finished processing dependencies for urwid==1.1.1
antib@silentbox:~/Документы/Py/urwid-1.1.1$ python3

Пакет установился, но при запуске в питоне:

Python 3.2.3 (default, Jun 25 2012, 23:10:56) 
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urwid
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urwid/__init__.py", line 24, in <module>
    from urwid.widget import (FLOW, BOX, FIXED, LEFT, RIGHT, CENTER, TOP, MIDDLE,
  File "urwid/widget.py", line 694
    def __init__(self,div_char=u" ",top=0,bottom=0):
                                  ^
SyntaxError: invalid syntax
>>> 

Как это забороть и чем ему u перед кавычками не нравиться?
ZAN
Дело в том, что в третьем питоне юникод u'' строки убрали, а обычные строки ‘' стали юникод строками.
Но с версии питона 3.3 для обратной совместимости, u’' строки вернули обратно. Так что либо запускайте библиотеку под вторым питоном, либо обновите третий до версии 3.3
antib
urwid ругается не только на u, но ещё и на поддержку метода append в виджете и т.п.

Я уже поставил себе питон 3.3 из тарболла с помощью checkinstall и теперь полсистемы почернело отвалилось, а удалять этот пакет аптитуда никакими силами не желает. Но да, запущенный новый питон ругается по другим проблемам. Видимо, придёся переставлять ось и ждать пока нынешний питон и урвид попадут в репы дебиан тестинг (вроде лмде на них основан).

Или переставлять и искать мануал по старой версии urwid.
ZAN
Попробуйте запустить его не с третьего, а со второго питона тогда.
В дебиане (и других, в общем-то, дистрах) можно поставить два питона.
sudo apt-get install python2
запускать питон коммандой python2
Раз вы установили из исходников при помощи checkinstall, то менджер пакетов должен нормально это удалить.
Попробуйте сделать это с помощью dpkg.
antib
У меня уже было два питона. Второй и третий сосуществовали нормально. Я попробовал поставить параллельно третий питон и урвид с сайтов разработчиков. Я ковыряюсь с питоном для собственного удовольствия и учить 2-й и 3-й параллельно сил и времени не хватит. Снести лишний python не получилось - всё ваще отвалилось. Короче, ось я переставил. Убирать лишний питон с dpkg не успел попробовать. synaptic и aptitude с этим не справились, есть причины, по которым это мог сделать dpkg?

И главное, как мне разбираться с urwid, если в репах та версия, которая не совместима с тем питоном3 и урвидом, что у меня есть. Поставить urwid с сайта я уже пробовал, это решило часть проблем. Ставить питон с python.org оказалось чревато.
ZAN
antib
Убирать лишний питон с dpkg не успел попробовать. synaptic и aptitude с этим не справились, есть причины, по которым это мог сделать dpkg?
synaptic и aptitude - это всего-лишь фронтенды, использующие dpkg
Я полагаю, что aptitude мог не показать причину, по которой он не хотел удалять питон. Но dpkg - обязательно бы ее показал.
Судя по всему, вы попытались просто снести питон, от которого зависело куча других пакетов, чтобы после этого поставить старый. Aptitude/synaptic трекают зависимости, поэтому по цепочке пришлось бы сносить пол системы. Но можно было удалить пакет с помощью dpkg с ключом force (игнорировать зависимости), а потом ставить старый. А можно было (что предпочтительней, на самом деле) просто сделать downgrade при помощи apt-get.
http://askubuntu.com/questions/138284/how-to-downgrade-a-package-via-apt-get
antib
Cинаптик показывал, что имеет место неразрешимый конфликт, и рекомендовал прогнать
apt-get install -f
Прогонял, но эффекта не возымело.

LMDE не 100% совместим с убунту (вычитанный там способ ручного удаления не помог, например).
На счёт даунгрейда может пригодиьтся для общего развития, но на счёт конкретной моей задачи я пока не понял. Искать и учить старый мануал, чтоб потом переучиваться на новый - не привлекает. Я не настолько всё схватываю.

Возможно ли поднять версии python3 и urwid до последних, чтоб при этом ничего не отвалилось из остальной оси?
ZAN
Проапдейтить можно, но раз пока вы не очень умеете разруливать зависимости пакетного менеджера, то есть такой вариант.
Ставите питон из исходников, но не в /usr/local/lib, а вообще в каталог с вашими проектами, к примеру - /home/antib/Projects/my_wild_python_experiment. Настраиваете этот питон для работы с virtualenv и в случае чего - просто удалите каталог.
antib
Уловил, спасибо.
man что?
antib
Ставлю python3 и urwid в отдельную папку, чтоб не покорёжить версию python3 для нужд ОС. Качаю архивы с оф.сайтов с сырцами. Потом ставлю пакет из репов tk-dev (и всё, что ему нужно для щастья)т.к. без него idle3 не поползёт.
./configure --prefix /home/antib/alt_python
./make
./make install
Теперь в ~/alt-python/bin лежат питон и айдл, они запускаются нормально.

Urwid просто так не ставится. Если, скопировать папку urwid в питонскую lib, то при попытке импорта происходит:
>>> import urwid
Traceback (most recent call last):
  File "", line 1, in 
  File "./urwid/__init__.py", line 24, in 
    from urwid.widget import (FLOW, BOX, FIXED, LEFT, RIGHT, CENTER, TOP, MIDDLE,
  File "./urwid/widget.py", line 24, in 
    from urwid.util import (MetaSuper, decompose_tagmarkup, calc_width,
  File "./urwid/util.py", line 46
    except ValueError, e:
                     ^
SyntaxError: invalid syntax

Установка urwid'ского setup.py нуждается в setuptools. Чтобы поставить urwid в папку альтерантивного питона надо и setuptools туда поставить?
Или есть третий путь установки urwid?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB