Форум сайта python.su
Написал программу для сравнения шрифтов (см. скриншот).
1). Проблема в том, что при изменении размера шрифта ничего не происходит. Как думаете, в чём моя ошибка?
2). Актуален вопрос про список шрифтов
——
По работе программы:
Левый ЛистВью содержит список всех шрифтов ОСи, в правый ЛистВью попадают шрифты для сравнения (нажатие по шрифту во втором списке удаляет элемент данного списка).
# Python 3 #!/usr/bin/env python # -*- coding: utf-8 -*- version = '2017.11.25' # Начало разработки import sys, os from PyQt4 import QtCore, QtGui from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox, QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy, QGroupBox, QFileDialog, QMainWindow, QPlainTextEdit, QStandardItem, QStandardItemModel, QListView, QListWidget, QFontComboBox, QFontDatabase) from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor from PyQt4.QtCore import QSize # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt") # ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ path_dir = '' # путь основного каталога path_f = '' # путь открытого файла # ГРАФИКА class Window(QMainWindow): def __init__(self, parent=None, *args, **kwargs): QMainWindow.__init__(self, parent) super().__init__(parent, QtCore.Qt.Window) self.setMinimumSize(400, 300) # Ширина и высота окна self.resize(500, 500) # шир / выс окна self.setWindowTitle('Сравнение шрифтов – '+version) # Заголовок self.setWindowIcon(QIcon('icon.png')) # Иконка # ПОДКЛЮЧЕНИЕ СТИЛЕЙ '''sss = open('res/dark_blue.stylesheet', 'r') self.styleData = sss.read() sss.close() self.setStyleSheet(self.styleData)''' # Статус бар self.statusBar() # Пункты меню m_open_dir = QAction(QIcon('res_picture/apple_green.png'), 'Открыть директорию', self) #m_open_dir.triggered.connect(self.open_dir) m_settings = QAction(QIcon('res_picture/apple_green.png'), 'Настройки', self) #m_settings.triggered.connect(self.settings) # Меню программы menubar = self.menuBar() file_1 = menubar.addMenu('&Файл') file_1.addAction(m_open_dir) file_1.addAction(m_settings) file_2 = menubar.addMenu('&О программе') file_2.addAction('О программе') # БЛОК РАЗМЕТКИ grid_os = QGridLayout() # создание сетки grid_os.setSpacing(5) m = 6 # всего столбцов # --- --- self.pole_1 = QLineEdit() self.pole_1.setPlaceholderText('Введите текст') grid_os.addWidget(self.pole_1, 0,0,1,m-2) self.box_size = QComboBox() self.box_size.addItems(['10','12','14','16','18','20','28','40']) self.box_size.setCurrentIndex(5) self.box_size.setToolTip('Выбрать размер шрифта') self.box_size.activated[str].connect(self.on_start) #self.box_size.currentIndexChanged.connect(self.on_start) grid_os.addWidget(self.box_size, 0,m-2) self.button_vvod = QPushButton('Ввод') self.button_vvod.clicked.connect(self.on_start) grid_os.addWidget(self.button_vvod, 0,m-1) # --- --- lbl_1 = QLabel('<center>+ шрифт</center>') grid_os.addWidget(lbl_1, 1,0) lbl_2 = QLabel('<center>– шрифт</center>') grid_os.addWidget(lbl_2, 1,1) lbl_3 = QLabel('<center>Результат</center>') grid_os.addWidget(lbl_3, 1,2,1,m-2) # --- --- self.list_view_1 = QListView() grid_os.addWidget(self.list_view_1, 2,0) self.list_view_2 = QListView() self.list_view_2.clicked.connect(self.on_del) grid_os.addWidget(self.list_view_2, 2,1) self.pole_vivod = QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) grid_os.addWidget(self.pole_vivod, 2,2,1,m-2) # --- --- self.box_font = QFontComboBox() #self.box_font.setToolTip('Выбрать шрифт') #self.box_font.activated[str].connect(self.on_start) #grid_os.addWidget(self.box_font, 3,0) # настройка grid_os.setColumnStretch(2, 1) # расширение правой части; индекс/растяж grid_os.setColumnMinimumWidth(3,200) # --- frame_os = QFrame() frame_os.setFrameShape(1) frame_os_lay = QVBoxLayout(frame_os) frame_os_lay.addLayout(grid_os) self.setCentralWidget(frame_os) # ==================== self.lst_1 = [] self.lst_2 = [] self.model_list_2 = None self.on_start() self.on_start_lst_1() # ЛОГИКА def on_start(self): def aps(i): # aps(список) i = ''.join(map(str, i)) data.append(str(i)) data = [] self.pole_vivod.setText('') # ДАННЫЕ text = self.pole_1.text() if text == '': text = 'Введите текст' siz = int(self.box_size.currentText()) print(siz) # ХОД for i in range(len(self.lst_2)): aps(['<font face="',self.lst_2[i],'" size=',siz,'>',text,'</font>', '<br>(',self.lst_2[i],')']) # ВЫВОД ОТЧЁТОВ self.pole_vivod.setText('<hr>'.join(data)) print('<br>'.join(data)) self.pole_vivod.moveCursor(QTextCursor.Start) def on_start_lst_1(self): # формирование первого списка self.box_font for i in range(len(self.box_font)): self.lst_1.append(self.box_font.itemText(i)) # из комбобокса model_list_1 = QStandardItemModel(self.list_view_1) for i in range(len(self.lst_1)): item = QStandardItem(self.lst_1[i]) model_list_1.appendRow(item) self.list_view_1.setModel(model_list_1) self.list_view_1.clicked.connect(self.on_in_lst_2) def on_in_lst_2(self): # отправить в список 2 index_row_1 = self.list_view_1.currentIndex().row() self.lst_2.append(self.lst_1[index_row_1]) self.lst_2.sort() self.model_list_2 = QStandardItemModel(self.list_view_2) for i in range(len(self.lst_2)): item = QStandardItem(self.lst_2[i]) self.model_list_2.appendRow(item) self.list_view_2.setModel(self.model_list_2) self.on_start() def on_del(self): # удалить шрифт из второго списка index_row_2 = self.list_view_2.currentIndex().row() self.lst_2.pop(index_row_2) self.model_list_2.takeRow(index_row_2) # удалить строку из модели self.list_view_2.setModel(self.model_list_2) # установить новую модель self.on_start() # обновить поле вывода # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.move(40, 20) # сдвиг окна от верхнего левого угла экрана window.show() # запускает окно sys.exit(app.exec_())
Отредактировано Kyrym (Ноя. 26, 2017 12:56:56)
Прикреплённый файлы:
Сравнение шрифтов – 2017.11.25_005.png (143,9 KБ)
Офлайн
мда, конечно радует что вы освоили метод строк join, а теперь откройте для себя еще и format , тогда вот этот ужас:
def aps(i): # aps(список) i = ''.join(map(str, i)) data.append(str(i)) .... for i in range(len(self.lst_2)): aps(['<font face="',self.lst_2[i],'" size=',siz,'>',text,'</font>','<br>(',self.lst_2[i],')'])
for i in range(len(self.lst_2)): data.append('<font face="{}", size={}>{}</font><br>({})'.format(self.lst_2[i], siz, text, self.lst_2[i]))
Kyrymошибка в том что это не размер в точках(pt), а ХЗ вобщем в чем… но это что-то имеет градацию размера от 1 до 7 , и если значение больше 7 оно более не увеличивает.
Проблема в том, что при изменении размера шрифта ничего не происходит. Как думаете, в чём моя ошибка?
self.box_size.addItems(['1','2','3','4','5','6','7','8', '9'])
siz = int(self.box_size.currentText())
[code python][/code]
Отредактировано PEHDOM (Ноя. 28, 2017 18:14:08)
Офлайн
PEHDOMТак я хотел избежать лишних кавычек, хотя, как выяснилось, их итак не будет.
зачем вы переводите в int?
PEHDOMДа, забыл я об этом. Переписал код через “p style”. Теперь работает, как задумано.
ошибка в том что это не размер в точках(pt), а ХЗ вобщем в чем… но это что-то имеет градацию размера от 1 до 7
PEHDOMПро формат я знаю, просто мне как-то не сильно с ним удобно. Хотя конкретно в данном случае - да, format упростит общую конструкцию.
а теперь откройте для себя еще и format
# Python 3 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys, os from PyQt4 import QtCore, QtGui from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox, QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy, QGroupBox, QFileDialog, QMainWindow, QPlainTextEdit, QStandardItem, QStandardItemModel, QListView, QListWidget, QFontComboBox, QFontDatabase) from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor from PyQt4.QtCore import QSize # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0;") # ГРАФИКА class Window(QMainWindow): def __init__(self, parent=None, *args, **kwargs): QMainWindow.__init__(self, parent) super().__init__(parent, QtCore.Qt.Window) self.setMinimumSize(400, 300) # Ширина и высота окна self.resize(800, 500) # шир / выс окна self.setWindowTitle('Сравнение шрифтов – '+version) # Заголовок self.setWindowIcon(QIcon('icon.png')) # Иконка # Статус бар self.statusBar() # Меню программы menubar = self.menuBar() file_2 = menubar.addMenu('&О программе') file_2.addAction('Пусто') # БЛОК РАЗМЕТКИ grid_os = QGridLayout() # создание сетки grid_os.setSpacing(5) m = 6 # всего столбцов # --- --- self.pole_1 = QLineEdit() self.pole_1.setPlaceholderText('Введите текст') grid_os.addWidget(self.pole_1, 0,0,1,m-2) self.box_size = QComboBox() self.box_size.addItems(['10','12','14','16','18','20','28','40','60']) self.box_size.setCurrentIndex(6) self.box_size.setToolTip('Выбрать размер шрифта') self.box_size.activated[str].connect(self.on_start) grid_os.addWidget(self.box_size, 0,m-2) self.button_vvod = QPushButton('Ввод') self.button_vvod.clicked.connect(self.on_start) grid_os.addWidget(self.button_vvod, 0,m-1) # --- --- lbl_1 = QLabel('<center>+ шрифт</center>') grid_os.addWidget(lbl_1, 1,0) lbl_2 = QLabel('<center>– шрифт</center>') grid_os.addWidget(lbl_2, 1,1) lbl_3 = QLabel('<center>Результат</center>') grid_os.addWidget(lbl_3, 1,2,1,m-2) # --- --- self.list_view_1 = QListView() grid_os.addWidget(self.list_view_1, 2,0) self.list_view_2 = QListView() self.list_view_2.clicked.connect(self.on_del) grid_os.addWidget(self.list_view_2, 2,1) self.pole_vivod = QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) grid_os.addWidget(self.pole_vivod, 2,2,1,m-2) # --- --- # настройка grid_os.setColumnStretch(2, 1) # расширение правой части; индекс/растяж grid_os.setColumnMinimumWidth(3,200) # --- frame_os = QFrame() frame_os.setFrameShape(1) frame_os_lay = QVBoxLayout(frame_os) frame_os_lay.addLayout(grid_os) self.setCentralWidget(frame_os) # ==================== self.lst_1 = [] # список всех шрифтов системы self.lst_2 = [] # список избранных шрифтов self.model_list_2 = None # Автозапуск функций self.on_start() self.on_start_lst_1() # ЛОГИКА def on_start(self): text = self.pole_1.text() if text == '': text = 'Введите текст' siz = self.box_size.currentText() # размер шрифта #print(siz) data = [] for i in range(len(self.lst_2)): data.append('<p style="font-family:{}; font-size:{}px; margin-top:0px; margin-bottom:0px">{}</p>\ <p style="font-size:14px; margin-top:0px; margin-bottom:0px">({})</p>\ '.format(self.lst_2[i], siz, text, self.lst_2[i])) # ВЫВОД self.pole_vivod.setText('<hr>'.join(data)) #print('<br>'.join(data)) self.pole_vivod.moveCursor(QTextCursor.Start) def on_start_lst_1(self): # формирование первого списка obj_font = QtGui.QFontDatabase() # объект класса базы шрифтов self.lst_1 = obj_font.families() # list_font model_list_1 = QStandardItemModel(self.list_view_1) for i in range(len(self.lst_1)): item = QStandardItem(self.lst_1[i]) model_list_1.appendRow(item) self.list_view_1.setModel(model_list_1) self.list_view_1.clicked.connect(self.on_in_lst_2) def on_in_lst_2(self): # отправить в список 2 index_row_1 = self.list_view_1.currentIndex().row() row_1 = self.lst_1[index_row_1] if self.lst_2.count(row_1) == 1: # не допустить повторы pass else: self.lst_2.append(row_1) self.lst_2.sort() self.model_list_2 = QStandardItemModel(self.list_view_2) for i in range(len(self.lst_2)): item = QStandardItem(self.lst_2[i]) self.model_list_2.appendRow(item) self.list_view_2.setModel(self.model_list_2) self.on_start() def on_del(self): # удалить шрифт из второго списка index_row_2 = self.list_view_2.currentIndex().row() self.lst_2.pop(index_row_2) self.model_list_2.takeRow(index_row_2) # удалить строку из модели self.list_view_2.setModel(self.model_list_2) # установить новую модель self.on_start() # обновить поле вывода # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.move(40, 20) # сдвиг окна от верхнего левого угла экрана window.show() sys.exit(app.exec_())
Отредактировано Kyrym (Ноя. 28, 2017 20:34:17)
Офлайн