Тёмный

Python и PyQt (QListWidget и QListView) сравнительный анализ, что выбрать? Часть 1 

PyScientist
Подписаться 4,5 тыс.
Просмотров 12 тыс.
50% 1

Опубликовано:

 

10 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 85   
@vladimirmorozoff8153
@vladimirmorozoff8153 5 лет назад
В PyCharm можно смещать сразу несколько строк, предварительно выделив их (Tab - вправо, Shift+Tab - влево). А вместо QMainWindow.__init__(self) можно уже просто писать super().__init__() (правда, это только в новых версиях Питона работает). Ну и новый способ подключения сигналов к методам, конечно, гораздо менее error-prone, менее заковыристый (-: button.clicked.connect(self.method) (Вы-то, Сергей, наверно, уже об этом знаете, но вдруг кому-то еще пригодится).
@PyScientist
@PyScientist 5 лет назад
Да с super это вы правильно заметили, так технически более верно делать! Чтобы не морочится с конструктором родителя при множественном наследовании. Работает токо в 3 - ке, в двушке будет class Child(base): def __init__(self) : super(Child, self). __init__() помню когда разбирал множественном наследование всю голову сломал себе)
@andreybelyaev5703
@andreybelyaev5703 2 года назад
Спасибо.. Тема годная
@АлександрВыскребцев
Спасибо, ваш урок помог мне!
@user-yd2tl1pl1k
@user-yd2tl1pl1k 6 лет назад
Отличный урок. Спасибо.
@PyScientist
@PyScientist 6 лет назад
Николай, продолжение и готовая программа с этим интерфейсом, которая Вас интересовала, в течении след недели будет. Там самое интересное.
@PyScientist
@PyScientist 6 лет назад
# -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(500, 500) MainWindow.setWindowTitle("Example QlistWidget") self.centralWidet = QtGui.QWidget(MainWindow) self.centralWidet.resize(500, 500) vbox = QtGui.QVBoxLayout(self.centralWidet) self.pushButton_add_element = QtGui.QPushButton() self.pushButton_add_element.setText('add element') self.pushButton_add_element.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_add_element) self.pushButton_refresh = QtGui.QPushButton() self.pushButton_refresh.setText('clear') self.pushButton_refresh.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_refresh) self.pushButton_set_unchecked = QtGui.QPushButton() self.pushButton_set_unchecked.setText('all unchecked') self.pushButton_set_unchecked.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_set_unchecked) self.pushButton_set_checked = QtGui.QPushButton() self.pushButton_set_checked.setText('all checked') self.pushButton_set_checked.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_set_checked) self.pushButton_invert_selected = QtGui.QPushButton() self.pushButton_invert_selected.setText('invert checked items') self.pushButton_invert_selected.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_invert_selected) self.pushButton_delete_selected = QtGui.QPushButton() self.pushButton_delete_selected.setText('delete selected item') self.pushButton_delete_selected.setMaximumSize(QtCore.QSize(150, 50)) vbox.addWidget(self.pushButton_delete_selected) self.list_widget = QtGui.QListWidget() self.list_widget.setMinimumSize(QtCore.QSize(100, 300)) self.list_widget.setWindowTitle('List Widget elements') vbox.addWidget(self.list_widget) vbox.addStretch(1) class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent=None, *args, **kwargs): QtGui.QMainWindow.__init__(self) self.setupUi(self) self.connect(self.pushButton_refresh, QtCore.SIGNAL('clicked()'), self.refresh) self.connect(self.pushButton_add_element, QtCore.SIGNAL('clicked()'), self.add_element) self.connect(self.pushButton_set_unchecked, QtCore.SIGNAL('clicked()'), self.uncheck_all_items_in_list) self.connect(self.pushButton_set_checked, QtCore.SIGNAL('clicked()'), self.check_all_items_in_list) self.connect(self.pushButton_invert_selected, QtCore.SIGNAL('clicked()'), self.invert_selected) self.connect(self.pushButton_delete_selected, QtCore.SIGNAL('clicked()'), self.delete_selected_item_from_list) def refresh(self): self.list_widget.clear() def add_element(self): item = QtGui.QListWidgetItem() item.setCheckState(QtCore.Qt.Checked) item.setIcon(QtGui.QIcon('.\icons\plot_icon.png')) elements_number = self.list_widget.count() item.setText('элемент списка №'+str(elements_number)) self.list_widget.addItem(item) def uncheck_all_items_in_list(self): item = self.list_widget.item for row in range(self.list_widget.count()): item(row).setCheckState(QtCore.Qt.Unchecked) def check_all_items_in_list(self): item = self.list_widget.item for row in range(self.list_widget.count()): item(row).setCheckState(QtCore.Qt.Checked) def invert_selected(self): item = self.list_widget.item for row in range(self.list_widget.count()): if item(row).checkState() == QtCore.Qt.Checked: item(row).setCheckState(QtCore.Qt.Unchecked) else: item(row).setCheckState(QtCore.Qt.Checked) def delete_selected_item_from_list(self): selected_item = self.list_widget.currentRow() self.list_widget.takeItem(selected_item) def main(): app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() app.exec_() main()
@victorrybakov5748
@victorrybakov5748 3 года назад
Добрый день, подскажите, пожалуйста, как авторизовать несколько аккаунтов на одном сайте в QWebEngineView(pyqt5) одновременно ?
@nicko6815
@nicko6815 4 года назад
Отличный урок!
@yarmik3d
@yarmik3d 6 лет назад
Это все конечно хорошо но было бы еще лучше если бы вы показали пример с дизайнер сборкой и подключение добавления item из другого файла , за труды большое спасибо, многое проясняется)
@PyScientist
@PyScientist 6 лет назад
Yaroslav Miklin Такой пример, если я правильно Вас понял у меня в программе имеется, там импортируется в список заголовки из таблицы, в 10-11 видео покажу по подробнее эту тему. Спасибо за внимание и комментарии.
@yarmik3d
@yarmik3d 6 лет назад
Интерфейс отдельным файлом питона от функционала весь день не могу понять как подключить в файле функционала создание item, по вашему видео не срабатывает программа завершает работу без вывода ошибки, с кнопками текстовым виджетом и леблами все понятно все работает но item никак не дается
@PyScientist
@PyScientist 6 лет назад
В качестве бэкенда в отдельном файле можно создать def add_element(self): item = QtGui.QListWidgetItem() # Cоздаем объект QListWigetItem item.setCheckState(QtCore.Qt.Checked) # Добавляем chekbox для объекта QListWigetItem и делаеи его выделенным item.setIcon(QtGui.QIcon('.\icons\well_icon.png')) # Добавляем объект иконки (Qicon) для объекта QListWigetItem elements_number = self.list_widget.count() item.setText("элемент списка #"+str(elements_number)) # Добавляем название для QListWigetItem self.list_widget.addItem(item) Далее в фронтенде просто зацепить эту функцию class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent=None, *args, **kwargs): QtGui.QMainWindow.__init__(self) self.setupUi(self) self.connect(self.pushButton_add_element, QtCore.SIGNAL('clicked()'), self.add_element_func) def add_element_func(self): add_element(self) Тогда фронтенд короче получается и лаконичнее) То что надо?
@yarmik3d
@yarmik3d 6 лет назад
Сработало но только в таком варианте: class winn2(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.ui = Ui_winn() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.add_item) def add_item(self): item = QtWidgets.QListWidgetItem() item.setText("element") self.ui.listWidget.addItem(item) спасибо большое
@PyScientist
@PyScientist 6 лет назад
Я думал вы хотите add_item(self) вывести из winn2 в отдельную функцию, но сейчас все верно у Вас если при добавлении итема ничего с данными не делается и длинного ничего писать не надо, то можно так.
@rustem6117
@rustem6117 5 лет назад
Добрый вечер, можно снова обратиться с вопросом. Вот код: from PySide2 import QtCore, QtGui, QtWidgets from adr_ui import Ui_Dialog import sys,os,platform #Create application app = QtWidgets.QApplication(sys.argv) #Create form and unit UI Dialog = QtWidgets.QDialog() ui = Ui_Dialog() ui.setupUi(Dialog) Dialog.show() #Определение пути к адресной книги if platform.platform().startswith('Windows'): book= os.path.join(os.getenv('HOMEDRIVE'),\ os.getenv('HOMEPATH'),\ "Адресная книга.txt") #Hook logic #Функция Добаления def write_to_txt(): ui.pushButton_5.setEnabled(False) inf = ui.lineEdit.text() inf = inf + ' ' with open(book,"a") as f: f.write(inf) ui.lineEdit.clear() ui.textEdit.append("Адрес успешно сохранён!") def adding(): ui.textEdit.append("Введите адрес") ui.pushButton_5.setEnabled(True) ui.pushButton_5.clicked.connect(write_to_txt) #Функция Чтения def reading(): ui.textEdit.append("Адресная книга:"+" ") with open(book) as f: while True: line = f.readline() if len(line)==0: break ui.textEdit.insertPlainText(line) def search(): print("прошло") req= ui.lineEdit.text() print(req) d = {} with open(book) as file: while True: line = file.readline() if len(line)==0: break txt = line.split() if len(line)!=0: key=txt[0] value=txt[1] d[key] = value print(d) print("прошло ещё раз") if req in d: ui.textEdit.append("Адрес"+" "+ req + ":"+" "+str(d[req])) ui.lineEdit.clear() print("прошло ещё раз to") def initilize_search(): ui.pushButton_5.setEnabled(True) ui.textEdit.append("Введите имя для поиска в адресной книге:") ui.pushButton_5.clicked.connect(search) #Нажатия на кнопки ui.pushButton_5.setEnabled(False) ui.pushButton_4.clicked.connect(adding)#Adding ui.pushButton_3.clicked.connect(reading)#Reading ui.pushButton_2.clicked.connect(initilize_search)#Search #Run main loop sys.exit(app.exec_()) Проблема такая: Например я использую функцию добавления, всё нормально, выводит "Адрес успешно сохранён", потом я снова хочу воспользоваться функцией добавления, ввожу адрес, нажимаю ввод и на вывод получаю "Адрес успешно сохранён Адрес успешно сохранён', при каждом следующем использовании этой функции, количество "Адрес успешно сохранён" увеличивается на 1. А ещё в текстовый документ адреса сохраняются не корректно, то есть у меня при вводе одного адреса, в текстовый документ сохраняется "адрес" + " ". И количество " " точно также увеличивается на 1. Вот скрин:i.imgur.com/yhRkzcN.png Буду очень рад помощи, спасибо заранее))
@fortunik_7286
@fortunik_7286 4 года назад
setCurrentRow / setCurrentItem странно работают, я хочу чтобы строчка, которая добавляется в лист виджет автоматически выделялась (синим цветом) (типа как будто кликнули на неё). Подскажите как сделать
@PyScientist
@PyScientist 4 года назад
Смотрите стили qss применяются по аналогии с css, у меня есть соответствующее видео, номер 12.2. там как раз про qss рассказывается.
@leon1595
@leon1595 5 лет назад
Было бы неплохо если бы вы рассказали как использовать QThread.
@PyScientist
@PyScientist 5 лет назад
День добрый, это видео в приоритете и на половину уже готово!
@leon1595
@leon1595 5 лет назад
@@PyScientist Жду с нетерпением.Очень нужно мне сейчас.
@Anna_Porosenok
@Anna_Porosenok 3 года назад
Скажите почему у меня в отдельном окне запускающемся qliswidget иконки показываются , а если я это окно открываю из другого главного окно и втавляю в mdi, то qlistwidget запускается но иконки напрочь отказываются показываться?
@PyScientist
@PyScientist 3 года назад
А кто такой mdi?
@Anna_Porosenok
@Anna_Porosenok 3 года назад
@@PyScientist mdi это тип модели окна, что бы создавать мультиокконный интерфейс
@Anna_Porosenok
@Anna_Porosenok 3 года назад
@@PyScientist что бы вас не путать, это не про вашу программу и вней проблема , а отдельно написанную мною, там я пытаюсь использовать qlistwidget всё работает но иконки не показываются, это если я создаю мультиоконный интерфейс используя окно типа mdi, а если я напишу типа как у вас отдельно програмку где только рабатотать с qlistwidget буду , то всё работает как надо и иконки показывает на против списка (у вас чек боксы в примере у меня без них)
@PyScientist
@PyScientist 3 года назад
Github репозиторий есть у вас?
@PyScientist
@PyScientist 3 года назад
Как вариант, забыли включить иконки для итемов qlistwidget
@SeoLemma
@SeoLemma 4 года назад
Отличный урок, спасибо! Только вот удаление не работает. Удаляет не те элементы, что выбраны, а последний элемент списка. И то по очереди и исключительно после того, как поклацал по кнопке "инвертировать".
@user-ll5sp2zg1n
@user-ll5sp2zg1n Год назад
Здравствуйте, подскажите, пожалуйста, как реализовать поиск в qlistwidget?
@PyScientist
@PyScientist Год назад
Добрый день. Можно сделать отдельное поле lineedit, для ввода запроса для поиска и кнопку для запуска поиска, соответственно. По циклу или генератору перебрать элементы в списке. Соответственно при нахождении совпадения установить вид на элемент подсветить его
@user-ll5sp2zg1n
@user-ll5sp2zg1n Год назад
@@PyScientist спасибо!
@user-cj8wg5gp5y
@user-cj8wg5gp5y 3 года назад
добрый день, а вы не знаете как и возможно ли следуйщее: в QListWidget в одну строку добавить несколько элементов и + чтоб при нажатии на них воспроизводилась функция (2е думаю не сложно найти, а 1е нигде не смог найти реализации на пайтоне, буду очень признателен за подсказку)
@PyScientist
@PyScientist 3 года назад
Добрый вечер, 1. Как вы себе представляете этот момент, не понял зачем в один моем помещать несколько элементов? 2. Сигнал (connect) на выделение элементов поставьте. При получении сигнала запускайте функцию. Это очень просто.
@user-cj8wg5gp5y
@user-cj8wg5gp5y 3 года назад
@@PyScientist Спасибо за ответ, не ожидал что так быстро) Суть задания: надо сделать подобную вещь livepage.pro/tools/keys/ но с большим функционалом. Ни с интерфейсом ни с JS я не работал ранее, так что пытаюсь реализовать на пайтоне через Qt Designer. Основное: нужно сделать чтоб при наведении на слово оно выделялось и я мог работать с ним как с объектом и задавать команду при нажатии. Я придумал только как списки с несколькими элементами (словами) для каждой фразы по отдельности. (фраза - строка списка, каждое слово - 1 из элементов). И вот я хз как делать несколько элементов в списке (в интерфейсе).
@rustem6117
@rustem6117 5 лет назад
Здравствуйте, у меня есть вопрос, но я думаю, что здесь будет неудобно объяснить. Может быть соц.сети?
@PyScientist
@PyScientist 5 лет назад
sergei-dmitriev@mail.ru, буду рад!
@PyScientist
@PyScientist 5 лет назад
День добрый посмотрел ваш код! первое, что я рекомендую сделать, это внимательно ознакомится с моим видео 4. А именно, как на основе Ui_Dialog сделать класс который можно будет менять! Под менять я имею ввиду в конструкторе этого класса настраивать функционал графического интерфейса. А также создавать методы этого класса с помощью которых можно будет управлять этим интерфейсом. Сейчас у Вас сразу же берется экземпляр класса вашего GUI и дальше по тексту на него наворачиваются функции, а затем вызовы. При крупной программе так работать будет трудно. Но этот все лирика, а если по существу, то Вы немного усложнили код и чуточку изобрели велосипед)) Вам поможет функция ui.pushButton_5.setEnabled(True) соответственно кнопка включена ui.pushButton_5.setEnabled(False) соответственно кнопка выключена код будет выглядеть следующим образом (см ниже )- немного разобрал ваш велосипед)). Еще рекомендация! Переходить на PyQt5, а лучше на pyside2 см. видео #14. Будут еще вопросы спрашивайте, буду рад ответить. from PyQt5 import QtCore, QtGui, QtWidgets import sys from ui import Ui_Dialog import sys,os,platform # Функция Добавления def write_to_txt(): inf = ui.lineEdit.text() print(ui.lineEdit.text()) inf = inf + " " with open(book, "a") as f: f.write(inf) f.close() ui.lineEdit.clear() ui.textEdit.append("Адрес успешно сохранён!") text = ui.lineEdit.text() ui.lineEdit.clear() def adding(): ui.textEdit.append("Введите адрес") ui.pushButton_5.setEnabled(True) # Функция Чтения def reading(): ui.textEdit.append("Адресная книга:" + " ") file = open(book, 'r', encoding='utf-8') lines = file.readlines() file.close() for line in lines: ui.textEdit.insertPlainText(str(line)) ui.pushButton_5.setEnabled(False) #Create application app = QtWidgets.QApplication(sys.argv) #Create form and unit UI Dialog = QtWidgets.QDialog() ui = Ui_Dialog() ui.setupUi(Dialog) Dialog.show() #Hook logic #Определение пути к адресной книги if platform.platform().startswith('Windows'): book= os.path.join(os.getenv('HOMEDRIVE'),\ os.getenv('HOMEPATH'),\ "Адресная книга.txt") #Нажатия на кнопки ui.pushButton_5.setEnabled(False) ui.pushButton_5.clicked.connect(write_to_txt) ui.pushButton_4.clicked.connect(adding)#Adding ui.pushButton_3.clicked.connect(reading)#Reading #ui.pushButton_2.clicked.connect(search)#Search #ui.pushButton.clicked.connect(writing)#Exit #Input #Run main loop sys.exit(app.exec_())
@rustem6117
@rustem6117 5 лет назад
@@PyScientist Огромное вам спасибо) Вы мне очень помогли! Я не мог это сделать 2 недели.Я просто не знал как это. И в интернете информации почти нет. Мне была очень необходима помощь профессионала и вы мне помогли! Спасибо огромное, за помощь и за ваши познавательные уроки!
@rustem6117
@rustem6117 5 лет назад
@@PyScientist Извините, а это же код на PyQt5? Я установил PyQt5 сделал ui.py из test.ui с помощью pyuic5. Использовал ваш код и при запуске программы ловлю ошибку: qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. В чём может быть проблема? Пробовал и через Pyside2 делать, но всё равно не получается. Ещё пробовал переустанавливать PyQt5 и pyside2 и снова ничего не получается, такая же ошибка
@PyScientist
@PyScientist 5 лет назад
Первое, проверьте как он импортирует модули PyQt5 через print() from PyQt5 import QtWidgets print('прошло вроде как' ) Если принят не сработает то Qt установлен некорректно. Код тут не причём. Попробуйте и Отпишите по результату!
@nik01aich
@nik01aich Год назад
где найти полный плейлист???
@PyScientist
@PyScientist Год назад
На какую тему?
@nik01aich
@nik01aich Год назад
@@PyScientist PyQt интересует
@nik01aich
@nik01aich Год назад
@@PyScientist просто в этом плейлисте видео начинается с "Python и PyQt (QListWidget и QListView) сравнительный анализ, что выбрать? Часть 1" я подозреваю что до этого должно быть не одно видео...
@nik01aich
@nik01aich Год назад
@@PyScientist так не подскажите можно ли найти все видео с самого начала?
@Ki-jn1mk
@Ki-jn1mk 5 лет назад
А где 2 часть?
@PyScientist
@PyScientist 5 лет назад
Все есть 9.2! см. в видео дальше
@user-oy5yc3dt6o
@user-oy5yc3dt6o 4 года назад
Может есть и кого нибудь этот код? Набор под диктовку тухлое дело. Очень много времени уходит. Да и не вникаешь толком. пока набираешь таким образом вручную можно кучу ошибок сделать, а потом разбирайся, выглядывай каждый символ. Сначала набираешь - а на это уходит в раза три больше времени ,чем длится само видео, а потом смотришь с паузами снова на набранный текст. Лучше загрузить в проект готовый текст, послушать объяснение : для чего что и как и на этой основе сваять подобное. И как мне кажется для новичков в QT, а этот урок открывающий, нужно начинать с работы в QT, c перетаскиванием элементов, а не с написания их внутри редактора. Набирал, набирал, что-то около 16 минут. полезли ошибки и пришлось все это забросить- не факт, что вообще заработает, а день впустую уйдет.
@PyScientist
@PyScientist 4 года назад
Исходный код первым комментарием), начните с 4-го видео, будет яснее, если посмотреть 2P ,то будет ясно от начала и до конца как программу сделать. Это видео нацелено именно на пояснения по поводу qlistwidget и qlistview.
@user-oy5yc3dt6o
@user-oy5yc3dt6o 4 года назад
Благодарю!
@user-oy5yc3dt6o
@user-oy5yc3dt6o 4 года назад
@@PyScientist Где можно посмотреть простую работу, как задаются обработчики кнопок и других событий. У вас загроможден код предыдущими уроками. Стоит чуть изменить кнопки или код и все уже не работает. AttributeError: 'MainWindow' object has no attribute 'connect' что мне с этим делать? это место где вы прописывали обработчик кнопки
@PyScientist
@PyScientist 4 года назад
Так видео не про кнопки) поэтому кода больше, все про кнопки можно найти через find например забиваешь название кнопки и поидее в Manwindow должен быть connect для нее сейчас уже не помню, вам какая кнопка нужна?
@user-oy5yc3dt6o
@user-oy5yc3dt6o 4 года назад
@@PyScientist Скажите, а если в ваших уроках рассмотрение использования события "двойной клик мышкой"? Что-то с первоначального взгляда там все сложно и совсем не так, как с обычным кликом. Хотя казалось бы почему подход должен быть другим?
Далее
ФОКУС -СВЕТОФОР
00:32
Просмотров 116 тыс.
Вопрос Ребром - Булкин
59:32
Просмотров 781 тыс.
ФОКУС -СВЕТОФОР
00:32
Просмотров 116 тыс.