LINUX.ORG.RU

Проблемы после обновления до Python 3.3.0

 


0

1

Система Linux crunchbang 3.2.0-0.bpo.4-686-pae #1 SMP Debian 3.2.39-2~bpo60+1 i686 GNU/Linux (основана на стабильной ветке Debian Squeeze).

Установил дополнительные пакеты *-dev, необходимые для модулей. Создал каталог в /opt. Старый python 2.6 не удалял, только заменил симлинк /usr/bin/python и создал симлинк /usr/bin/idle. Сделал ./configure --prefix=/opt/python3.3.0. Все собралось без проблем, указания на то, что не хватает модулей, не было. Поменял путь python в скриптах. Пробую запустить скрипт, который уже успешно работал в винде с python 3.3 и в линуксе с python 2.6. Суть его в том, что надо создать элемент tkinter Text, вставить в него текст из буфера обмена и производить дальнейшие манипуляции. Запускаю. Получаю следующее: http://i068.radikal.ru/1303/c6/08cc84a29d0a.png. Как видно, какая-то проблема с шрифтами (может быть, дело в том, что для tkinter я шрифт напрямую не указывал, только его размер). Но это не так важно. Хуже то, что теперь я не могу вставить текст из буфера обмена в этот элемент tkinter (что характерно, копирование из него все еще работает). Копирование/вставка осуществлялись посредством самого tkinter, специально для этого я ничего не делал. В чем может быть проблема? Может быть, некорректно установил?

Скрипт такой:

# Текстовое поле (крупное)
def text_field(title):
	root, res = tk.Tk(), [None]
	# Обратить внимание, что get() работает по-разному для Text и Entry 
	def callback(): res[0] = entry.get(1.0,tk.END); root.destroy()
	root.title(title)
	scrollbar = tk.Scrollbar(root,jump=0)
	# Маленькое окно: entry=tk.Text(root,width=40,height=15,font="12")
	entry=tk.Text(root,font="12",wrap=tk.WORD,yscrollcommand=scrollbar.set)
	# Позволяет использовать мышь для управления скроллбаром
	scrollbar.config(command=entry.yview)
	scrollbar.pack(side=tk.RIGHT,fill=tk.Y)
	entry.pack()
	# Выход по нажатию Enter
	entry.bind('<Return>', lambda e: callback())
	# Выход по клику кнопки
	ok = tk.Button(root, text=u'Ввести и выйти',command=callback)
	ok.pack()
	# Выход по нажатию Enter и Пробел на кнопке (навигация по Shift+Tab)
	ok.bind('<Return>', lambda e:callback())
	entry.focus_set()
	root.mainloop()
	return res[0]
Для работы с Python 3.3 пришлось везде поставить 'tk.'

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

# Текстовое поле в одну строку
def text_field_small(title):
	root, res = tk.Tk(), [None]
	def callback(): res[0] = entry.get(); root.destroy()
	root.title(title)
	entry = tk.Entry(root,font="12")
	entry.pack()
	# Выход по нажатию Enter
	entry.bind('<Return>', lambda e: callback())
	# Выход по клику кнопки
	ok = tk.Button(root, text=u'Ввести и выйти', command=callback)
	ok.pack()
	# Выход по нажатию Enter и Пробел на кнопке
	ok.bind('<Return>', lambda e:callback())
	entry.focus_set()
	root.mainloop()
	return res[0]
Неужели tk.Text сломали? Или оно сломано у меня? Может ли кто-нибудь проверить первый скрипт?

Deleted

Последнее исправление: Deleted (всего исправлений: 2)

почему б вместо Tk. не сделать просто

from tkinter import *
в python3 весь текст юникод, u'йцукен' не нужен, просто 'йцукен'.

Неужели tk.Text сломали?

УМВР, сам недавно tkinter использовал с python3, все в порядке было и c виндой и под онтопиком. Эти куски тоже работают нормально.

Странно что оно вообще запустилось с этим u

x = u'лол'
  File "<stdin>", line 1
    x = u'лол'
                ^
SyntaxError: invalid syntax

Что-то ты там намутил.

crunchy_crow
()
Ответ на: комментарий от crunchy_crow

SyntaxError: invalid syntax

?

>>> x = u'лол'
>>> print(x)
лол

в python3 весь текст юникод, u'йцукен' не нужен, просто 'йцукен'.

Знаю, скрипт просто изначально делался для python2. В python3 и scrolled_text уже есть, вроде scrollbar отдельно писать не нужно.

from tkinter import *

Точно, спасибо.

Эти куски тоже работают нормально.

А вставку в текстовое поле из буфера обмена через Ctrl+V проверяли?

Deleted
()
Ответ на: комментарий от Deleted

может проще поставить из репозитория python3

Там хоть 3.1.3 но думаю работать все должно нормально. Может даже в crunchbang какой-то свой репозиторий есть и там более новая версия

crunchy_crow
()
Ответ на: комментарий от crunchy_crow

подозреваю даже что проблема может быть из-за того что отсутствует пакет python3-tk (который также в репозиториях есть)

crunchy_crow
()
Ответ на: комментарий от crunchy_crow

Спасибо! Действительно, из репозитория нормально встал (и зачем только я в /opt устанавливал?..) Кстати, на u'Hello' теперь действительно ругается (но 'u' уже не нужно).

Deleted
()
Ответ на: комментарий от crunchy_crow

from tkinter import *

Note that in general the practice of importing * from a module or package is frowned upon, since it often causes poorly readable code. However, it is okay to use it to save typing in interactive sessions.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

я согласен, но для tkinter это по моему единственный выход и наоборот облегчает читабельность, так что это исключение.

to use Tkinter all you need is a simple import statement:

import tkinter

Or, more often:

from tkinter import *

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

crunchy_crow
()
Ответ на: комментарий от risenshnobel

Спасибо, я так понял там никакого профита кроме обратной совместимости. Спорное решение - такой «универсальный» код будет бросать SyntaxError поскольку большинство дистрибутивов все еще на 3.2

crunchy_crow
()

Если вам нужен внесистемный питон, то используйте pythonbrew

redbaron ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.