Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2023, 22:16   #21
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
import keyboard
from tkinter import Tk, Button
import time
import win32gui
import win32api
import win32clipboard as cbd

spisok = []
sh = []
rtf_format = cbd.RegisterClipboardFormat("Rich Text Format")

def move(event):
    global hwnd
    hwnd = win32gui.GetForegroundWindow()
    if hwnd and hwnd != 0:
        sh.append(hwnd)
    if len(sh) > 20:
        del sh[0:15]

def b1(event):
    if hwnd != 0:
        win32gui.SetForegroundWindow(hwnd)
    else:
        win32gui.SetForegroundWindow(sh[-1])

def config_i(i):
    def config():
        cbd.OpenClipboard()
        cbd.EmptyClipboard()
        cbd.SetClipboardData(cbd.CF_UNICODETEXT, spisok[i][0])
        if spisok[i][1]:
            cbd.SetClipboardData(rtf_format, spisok[i][1])
        cbd.CloseClipboard()
        keyboard.press_and_release('ctrl+v')
    return config

def add_buttons(root):
    bt_params = {
        "width": 15,
        "height": 1,
        "font": ("Times New Roman", 12)
    }

    #кнопка копирования
    def _copy():
        if win32api.GetKeyboardLayout() == 68748313:
            keyboard.press_and_release("ctrl+с")
        else:
            keyboard.press_and_release("ctrl+c")

        time.sleep(0.1)
        cbd.OpenClipboard()
        text_data = cbd.GetClipboardData(cbd.CF_UNICODETEXT)
        try:
            rtf_data = cbd.GetClipboardData(rtf_format)
        except:
            rtf_data = None
        cbd.CloseClipboard()
        
        if text_data != "\r\n" and text_data not in (x[0] for x in spisok):
            spisok.append((text_data, rtf_data))
            i = len(spisok) - 1
            Button(root, text = text_data[:15].replace("\r\n", ""), bg = "white", command = config_i(i), **bt_params).place(x = 0, y = 30 * i)

    #кнопка очистки
    def _clear():
        for widget in root.winfo_children():
            widget.destroy()
        Button(root, text = "Копировать", bg = "#556B2F", command = _copy, **bt_params).place(x = 0, y = 315)
        Button(root, text = "Очистить", bg = "#556B2F", command = _clear, **bt_params).place(x = 150, y = 315)
        spisok.clear()
        cbd.OpenClipboard()
        cbd.EmptyClipboard()
        cbd.CloseClipboard()

    _clear()

def main():
    root = Tk()
    root.title("Advanced Сlipboard")
    root.geometry("296x350")
    root.resizable(width = False, height = False)
    root.attributes("-topmost", True)
    root.configure(bg = "lightblue")
    root.bind("<Motion>", move)
    root.bind("<Button-1>", b1)
    add_buttons(root)
    root.mainloop()

main()
Немного причесал и заменил pyperclip на win32clipboard. Вроде работает с Вордом (форматированный текст, таблицы). Замечания: нет проверки на длину списка (можно надобавлять больше, чем поместится в окно); в текущем варианте одинаковый текст с разным форматированием нельзя сохранить.
К сожалению, форматирование не копируется в этом варианте, а только текст. Но спасибо за такие старания!

Последний раз редактировалось Esprit; 19.12.2023 в 22:26.
Esprit вне форума Ответить с цитированием
Старый 19.12.2023, 22:21   #22
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

https://stackoverflow.com/questions/...d-using-python

Вот нашел код, который копирует html формат, но я не понимаю его, слишком сложный для меня, и не знаю, как его можно внедрить в эту программу
Esprit вне форума Ответить с цитированием
Старый 19.12.2023, 22:22   #23
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ципихович Эндрю, похоже, надо "pip install pywin32".
Я вроде бы так и устанавливал, у меня проблем не было
Esprit вне форума Ответить с цитированием
Старый 19.12.2023, 22:23   #24
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Не очень работает аналог

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
Код:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QListWidget
from PyQt5 import QtCore  # Import the QtCore module
from PyQt5.QtCore import QRect  # Import the QRect class

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Advanced Сlipboard")
        self.resize(296, 350)
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)  # Use QtCore.Qt instead of Qt

        # Кнопка копирования
        self.copy_button = QPushButton("Копировать", self)
        self.copy_button.setGeometry(QRect(0, 315, 150, 25))  # Use QRect class for setting geometry

        # Кнопка очистки
        self.clear_button = QPushButton("Очистить", self)
        self.clear_button.setGeometry(QRect(150, 315, 150, 25))

        # Список элементов буфера обмена
        self.list_widget = QListWidget(self)
        self.list_widget.setGeometry(QRect(0, 0, 296, 315))

        # Инициализация списка элементов буфера обмена
        self.list_widget.addItems(["", ""])

        # Обработчики событий
        self.copy_button.clicked.connect(self.on_copy_button_clicked)
        self.clear_button.clicked.connect(self.on_clear_button_clicked)

    def on_copy_button_clicked(self):
        # Получаем текст из буфера обмена
        clipboard = QApplication.clipboard()
        text = clipboard.text()

        # Добавляем текст в список элементов буфера обмена
        if text != "" and text not in self.list_widget.selectedItems():
            self.list_widget.addItem(text)

    def on_clear_button_clicked(self):
        # Очищаем список элементов буфера обмена
        self.list_widget.clear()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
нейросеть переписала на PyQt5 - аналог, ничего Не упустила?
поле для вывода инфы, под ним две кнопки Копировать и Очистить всё верно?, и как пользоваться?
Esprit вне форума Ответить с цитированием
Старый 19.12.2023, 22:25   #25
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Да я уже всю голову сломал с этим, никак не ждал проблемы с этой стороны

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Esprit

Так понимаю, что необходимо изменить подход к решению.
Сохранение текста не сохраняет команды форматирования, которые используются для показа вам красивого текста.

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

Как пример, язык разметок HTML работает с Web, но, в LaTeX используются другие команды форматирования.
Должен ли Word, понимать HTML?.
Да, htm- файл открывается в Word, но далеко не все команды форматирования от HTML им интерпретируются правильно и вполне возможно, что htm-файл открывается в определённой среде, не в среде для docx-файлов.

PS: Это только догадки.
Esprit вне форума Ответить с цитированием
Старый 19.12.2023, 23:11   #26
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Esprit Посмотреть сообщение
К сожалению, форматирование не копируется в этом варианте
Может быть на вашей системе формат по-другому называется. Можете скачать программу Free Clipboard Viewer, скопировать что-нибудь в буфер обмена и посмотреть доступные форматы в буфере c помощью этой программы. Попробуйте добавить html формат в код выше:
Код:
rtf_format = cbd.RegisterClipboardFormat("Rich Text Format")
html_format = cbd.RegisterClipboardFormat("HTML Format")
...
        cbd.SetClipboardData(cbd.CF_UNICODETEXT, spisok[i][0])
        if spisok[i][1]:
            cbd.SetClipboardData(rtf_format, spisok[i][1])
        if spisok[i][2]:
            cbd.SetClipboardData(html_format , spisok[i][2])
        cbd.CloseClipboard()
...
        text_data = cbd.GetClipboardData(cbd.CF_UNICODETEXT)
        try:
            rtf_data = cbd.GetClipboardData(rtf_format)
        except:
            rtf_data = None
        try:
            html_data = cbd.GetClipboardData(html_format)
        except:
            html_data = None
...
            spisok.append((text_data, rtf_data, html_data))
Или для проверки хотя бы:
Код:
# заменить
rtf_format = cbd.RegisterClipboardFormat("Rich Text Format")
# на
rtf_format = cbd.RegisterClipboardFormat("HTML Format")
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.12.2023, 00:03   #27
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Хорошо, посмотрю. HTML нужен, чтобы с сайтов копировать, а вот с word копировать нужно наверно с форматом RTF, как вы предложили, с этим потом тоже нужно работать.
Esprit вне форума Ответить с цитированием
Старый 20.12.2023, 00:23   #28
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Esprit Посмотреть сообщение
HTML нужен, чтобы с сайтов копировать
Понятно. Тогда действительно нужно добавить кусочки кода с html_format. Я проверял только Word - Advanced Сlipboard - Word.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.12.2023, 06:36   #29
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Да, с ворда на ворд я тоже попробовал вашу версию, это даже важнее, чем html, но у меня не сработало.
Esprit вне форума Ответить с цитированием
Старый 20.12.2023, 08:24   #30
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

мне тема интересна, так как сделал с помощью Python буфер обмена, но это встроено в Word и мне его нужно усовершенствовать, так вот прикладываю скрин - на нём то что имеется в Word из коробки....может ТС не в курсе
у меня сделано почти тоже самое, просто это окно буфера обмена Word в разных ситуациях является и этим окном и другим, чем мне надо
ТС поясните как вы это видите?, если вы работаете в Word, и где-то скопировали нужное и оно в Word вставилось не как хотелось бы, то нужно смотреть в сторону VBA, ну место где вы работаете может быть не Word, а МойОфис или Либре офис - без разницы у них тоже встроено что-то по подобию VBA, а то что обсуждается в теме даже если выстрелит будет неудобным в использовании - лишний НЕ удобный в пользовании костыль))
Изображения
Тип файла: jpg Ворд-буфер обмена.jpg (51.0 Кб, 3 просмотров)
Ципихович Эндрю на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование текста из RichEdit в EXCEL построчно с сохранением формата okunevskiy Общие вопросы Delphi 2 09.03.2016 16:04
перенести документ Word (таблица) в MS Excel c сохранением форматирования или обеспечить всплывающие подсказки в Word Serge_Bliznykov Microsoft Office Word 6 11.07.2011 11:02
Копирование значений и форматирования Eugenio Microsoft Office Excel 21 22.03.2010 19:28
Копирование таблицы без потери форматирования k1r1ch Microsoft Office Excel 3 09.07.2009 11:00
RichText1 с сохранением форматирования andrey4623 Общие вопросы Delphi 1 23.03.2008 21:06