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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2023, 21:29   #11
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

было интересно, но не смог опробовать
споткнулся на строке import win32gui # pip install win32gui - не встал модуль, сорри
Ципихович Эндрю вне форума Ответить с цитированием
Старый 15.12.2023, 21:35   #12
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Понял Ничего страшного
Esprit вне форума Ответить с цитированием
Старый 16.12.2023, 17:46   #13
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

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

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

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

PS: Это только догадки.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.12.2023, 02:27   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
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. Вроде работает с Вордом (форматированный текст, таблицы). Замечания: нет проверки на длину списка (можно надобавлять больше, чем поместится в окно); в текущем варианте одинаковый текст с разным форматированием нельзя сохранить.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.12.2023 в 02:31.
BDA на форуме Ответить с цитированием
Старый 17.12.2023, 19:15   #15
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
споткнулся на строке import win32gui # pip install win32gui - не встал модуль
подскажите правильной командой ставил "pip install win32gui" модуль?, посмотрел в сети по этому вопросу понял, что это связано с битностью ОС у меня 64 бита
Ципихович Эндрю вне форума Ответить с цитированием
Старый 17.12.2023, 19:27   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ципихович Эндрю, похоже, надо "pip install pywin32".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.12.2023, 20:07   #17
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

BDA, пока ваш совет не помог, а у Вас там слетели отступы, так имелось ввиду?
Код:
# кнопка очистки
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()
Ципихович Эндрю вне форума Ответить с цитированием
Старый 17.12.2023, 20:15   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
пока ваш совет не помог
Ну не знаю. У меня на другой версии питона (сначала запускал на 3.6, а потом на 3.10) заработал скрипт после добавления пакетов:
Код:
py -3.10 -m pip install keyboard pywin32
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
там слетели отступы
Нет, не слетали. Цикл только удаляет все кнопки, а потом они заново создаются.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.12.2023, 07:54   #19
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Код:
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 - аналог, ничего Не упустила?
поле для вывода инфы, под ним две кнопки Копировать и Очистить всё верно?, и как пользоваться?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 18.12.2023, 13:37   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
аналог, ничего Не упустила?
Внешне приложение похоже, но есть куча нюансов:
Размеры окна не зафиксированы, а размеры виджетов зафиксированы - окно можно растягивать, но с фиксированными виджетами получается некрасиво;
Зачем-то в виджет-список кладутся две пустые строки;
Текст забирается только из буфера обмена, а у исходного приложения из другого окна через буфер обмена;
Потерялась функция вставки в другое окно через буфер обмена сохраненного фрагмента;
Текст неверно проверяется на уникальность, selectedItems() возвращает выделенные "PyQt5.QtWidgets.QListWidgetIte m" объекты, которые, похоже, нельзя сравнивать с текстом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 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