Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2009 17:35:56

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с Windows Clipboard

Нужно читать и устанавливать текст в буфере обмена из Питона.
Насколько я понял, проблема обычно решается через “import win32clipboard”

Но этого модуля у меня нет. Я поискал, нашел, что такой есть в pywin32. Но у меня питон третий, а пекаджи пивина есть только до 2.6 и ниже.

А что есть для третьего питона?



Офлайн

#2 Июнь 3, 2009 18:52:19

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с Windows Clipboard

http://osdir.com/ml/python.ctypes/2003-08/msg00047.html
По ссылке пример как работать с буфером обмена с помощью ctypes, к сожалению там сбито форматирование, хотя восстановить его в данном случае не трудно.

offtop
Сбылись опасения аналитиков ЛОРа, я впервые пострадал от сбитого форматирования:)



Отредактировано (Июнь 3, 2009 19:05:30)

Офлайн

#3 Июнь 4, 2009 11:51:09

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с Windows Clipboard

О, спасибо за ссылку. Правда, модуля win32con.py у меня не нашлось, я качнул тут и допилил, чтобы заработало под 3й питон. Не факт, что правильно.

Ну и до кучи запощу работающее на python3 решение:

from ctypes import *

# instead of import win32con:
CF_TEXT = 1
GHND = 66

# dll usage example:
OpenClipboard = windll.user32.OpenClipboard
EmptyClipboard = windll.user32.EmptyClipboard
GetClipboardData = windll.user32.GetClipboardData
SetClipboardData = windll.user32.SetClipboardData
CloseClipboard = windll.user32.CloseClipboard
GlobalLock = windll.kernel32.GlobalLock
GlobalAlloc = windll.kernel32.GlobalAlloc
GlobalUnlock = windll.kernel32.GlobalUnlock
memcpy = cdll.msvcrt.memcpy

# two very useful routines:
def GetClipboardText():
text = ""
if OpenClipboard(c_int(0)):
hClipMem = GetClipboardData(c_int(CF_TEXT))
GlobalLock.restype = c_char_p
text = GlobalLock(c_int(hClipMem))
GlobalUnlock(c_int(hClipMem))
CloseClipboard()
return text

def SetClipboardText(text):
buffer = c_buffer(text)
bufferSize = sizeof(buffer)
hGlobalMem = GlobalAlloc(c_int(GHND), c_int(bufferSize))
GlobalLock.restype = c_void_p
lpGlobalMem = GlobalLock(c_int(hGlobalMem))
memcpy(lpGlobalMem, addressof(buffer), c_int(bufferSize))
GlobalUnlock(c_int(hGlobalMem))
if OpenClipboard(0):
EmptyClipboard()
SetClipboardData(c_int(CF_TEXT), c_int(hGlobalMem))
CloseClipboard()


# --- entry point, usage example: -----------------------------
SetClipboardText("test text")
print('[' + GetClipboardText() + ']')
С нормальными отступами и без импорта win32con.py (хотя по-хорошему этот модуль под win всё равно понадобится)



У меня ещё есть пара “дурацких вопросов” про Python3 под windows:
1) как производится поиск модулей по import? Например, написал я .py-файл, в нём кучка функций. Могу я его (куда-?) положить и делать import из любого моего скрипта (на этом компьютере, конечно)?
2) Насколько я понял, когда делаешь import, то надо вызывать модуль.функция(). А можно ли “импортнуть” так, чтобы вызывать эту функцию без указания модуля, просто как функция()? При отсутствии конфликтов имён, конечно.



Офлайн

#4 Июнь 4, 2009 13:13:33

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с Windows Clipboard

1) как производится поиск модулей по import? Например, написал я .py-файл, в нём кучка функций. Могу я его (куда-?) положить и делать import из любого моего скрипта (на этом компьютере, конечно)?
2) Насколько я понял, когда делаешь import, то надо вызывать модуль.функция(). А можно ли “импортнуть” так, чтобы вызывать эту функцию без указания модуля, просто как функция()? При отсутствии конфликтов имён, конечно.
1. sys.path - список путей, по которым питон ищет модули.
2. from sys import path, copyright



Офлайн

#5 Июнь 4, 2009 17:03:42

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с Windows Clipboard

Dimka665
1) как производится поиск модулей по import? Например, написал я .py-файл, в нём кучка функций. Могу я его (куда-?) положить и делать import из любого моего скрипта (на этом компьютере, конечно)?
Можно класть модули опр. папку, например d:\dev\python\modules и прописать эту папку в переменной окружения PYTHONPATH.



Отредактировано (Июнь 4, 2009 17:05:17)

Офлайн

#6 Июнь 4, 2009 18:08:12

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Проблема с Windows Clipboard

Тогда уж стоит потратить немного времени на изучение setuptools и делать нормальные пакеты

Поправка: для py3k только distutils. Немного не то, но все же съедобно



Отредактировано (Июнь 4, 2009 18:10:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version