В PyCharm можно смещать сразу несколько строк, предварительно выделив их (Tab - вправо, Shift+Tab - влево). А вместо QMainWindow.__init__(self) можно уже просто писать super().__init__() (правда, это только в новых версиях Питона работает). Ну и новый способ подключения сигналов к методам, конечно, гораздо менее error-prone, менее заковыристый (-: button.clicked.connect(self.method) (Вы-то, Сергей, наверно, уже об этом знаете, но вдруг кому-то еще пригодится).
Да с super это вы правильно заметили, так технически более верно делать! Чтобы не морочится с конструктором родителя при множественном наследовании. Работает токо в 3 - ке, в двушке будет class Child(base): def __init__(self) : super(Child, self). __init__() помню когда разбирал множественном наследование всю голову сломал себе)
Это все конечно хорошо но было бы еще лучше если бы вы показали пример с дизайнер сборкой и подключение добавления item из другого файла , за труды большое спасибо, многое проясняется)
Yaroslav Miklin Такой пример, если я правильно Вас понял у меня в программе имеется, там импортируется в список заголовки из таблицы, в 10-11 видео покажу по подробнее эту тему. Спасибо за внимание и комментарии.
Интерфейс отдельным файлом питона от функционала весь день не могу понять как подключить в файле функционала создание item, по вашему видео не срабатывает программа завершает работу без вывода ошибки, с кнопками текстовым виджетом и леблами все понятно все работает но item никак не дается
В качестве бэкенда в отдельном файле можно создать 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) Тогда фронтенд короче получается и лаконичнее) То что надо?
Сработало но только в таком варианте: 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) спасибо большое
Я думал вы хотите add_item(self) вывести из winn2 в отдельную функцию, но сейчас все верно у Вас если при добавлении итема ничего с данными не делается и длинного ничего писать не надо, то можно так.
Добрый вечер, можно снова обратиться с вопросом. Вот код: 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 Буду очень рад помощи, спасибо заранее))
setCurrentRow / setCurrentItem странно работают, я хочу чтобы строчка, которая добавляется в лист виджет автоматически выделялась (синим цветом) (типа как будто кликнули на неё). Подскажите как сделать
Скажите почему у меня в отдельном окне запускающемся qliswidget иконки показываются , а если я это окно открываю из другого главного окно и втавляю в mdi, то qlistwidget запускается но иконки напрочь отказываются показываться?
@@PyScientist что бы вас не путать, это не про вашу программу и вней проблема , а отдельно написанную мною, там я пытаюсь использовать qlistwidget всё работает но иконки не показываются, это если я создаю мультиоконный интерфейс используя окно типа mdi, а если я напишу типа как у вас отдельно програмку где только рабатотать с qlistwidget буду , то всё работает как надо и иконки показывает на против списка (у вас чек боксы в примере у меня без них)
Отличный урок, спасибо! Только вот удаление не работает. Удаляет не те элементы, что выбраны, а последний элемент списка. И то по очереди и исключительно после того, как поклацал по кнопке "инвертировать".
Добрый день. Можно сделать отдельное поле lineedit, для ввода запроса для поиска и кнопку для запуска поиска, соответственно. По циклу или генератору перебрать элементы в списке. Соответственно при нахождении совпадения установить вид на элемент подсветить его
добрый день, а вы не знаете как и возможно ли следуйщее: в QListWidget в одну строку добавить несколько элементов и + чтоб при нажатии на них воспроизводилась функция (2е думаю не сложно найти, а 1е нигде не смог найти реализации на пайтоне, буду очень признателен за подсказку)
Добрый вечер, 1. Как вы себе представляете этот момент, не понял зачем в один моем помещать несколько элементов? 2. Сигнал (connect) на выделение элементов поставьте. При получении сигнала запускайте функцию. Это очень просто.
@@PyScientist Спасибо за ответ, не ожидал что так быстро) Суть задания: надо сделать подобную вещь livepage.pro/tools/keys/ но с большим функционалом. Ни с интерфейсом ни с JS я не работал ранее, так что пытаюсь реализовать на пайтоне через Qt Designer. Основное: нужно сделать чтоб при наведении на слово оно выделялось и я мог работать с ним как с объектом и задавать команду при нажатии. Я придумал только как списки с несколькими элементами (словами) для каждой фразы по отдельности. (фраза - строка списка, каждое слово - 1 из элементов). И вот я хз как делать несколько элементов в списке (в интерфейсе).
День добрый посмотрел ваш код! первое, что я рекомендую сделать, это внимательно ознакомится с моим видео 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_())
@@PyScientist Огромное вам спасибо) Вы мне очень помогли! Я не мог это сделать 2 недели.Я просто не знал как это. И в интернете информации почти нет. Мне была очень необходима помощь профессионала и вы мне помогли! Спасибо огромное, за помощь и за ваши познавательные уроки!
@@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 и снова ничего не получается, такая же ошибка
Первое, проверьте как он импортирует модули PyQt5 через print() from PyQt5 import QtWidgets print('прошло вроде как' ) Если принят не сработает то Qt установлен некорректно. Код тут не причём. Попробуйте и Отпишите по результату!
@@PyScientist просто в этом плейлисте видео начинается с "Python и PyQt (QListWidget и QListView) сравнительный анализ, что выбрать? Часть 1" я подозреваю что до этого должно быть не одно видео...
Может есть и кого нибудь этот код? Набор под диктовку тухлое дело. Очень много времени уходит. Да и не вникаешь толком. пока набираешь таким образом вручную можно кучу ошибок сделать, а потом разбирайся, выглядывай каждый символ. Сначала набираешь - а на это уходит в раза три больше времени ,чем длится само видео, а потом смотришь с паузами снова на набранный текст. Лучше загрузить в проект готовый текст, послушать объяснение : для чего что и как и на этой основе сваять подобное. И как мне кажется для новичков в QT, а этот урок открывающий, нужно начинать с работы в QT, c перетаскиванием элементов, а не с написания их внутри редактора. Набирал, набирал, что-то около 16 минут. полезли ошибки и пришлось все это забросить- не факт, что вообще заработает, а день впустую уйдет.
Исходный код первым комментарием), начните с 4-го видео, будет яснее, если посмотреть 2P ,то будет ясно от начала и до конца как программу сделать. Это видео нацелено именно на пояснения по поводу qlistwidget и qlistview.
@@PyScientist Где можно посмотреть простую работу, как задаются обработчики кнопок и других событий. У вас загроможден код предыдущими уроками. Стоит чуть изменить кнопки или код и все уже не работает. AttributeError: 'MainWindow' object has no attribute 'connect' что мне с этим делать? это место где вы прописывали обработчик кнопки
Так видео не про кнопки) поэтому кода больше, все про кнопки можно найти через find например забиваешь название кнопки и поидее в Manwindow должен быть connect для нее сейчас уже не помню, вам какая кнопка нужна?
@@PyScientist Скажите, а если в ваших уроках рассмотрение использования события "двойной клик мышкой"? Что-то с первоначального взгляда там все сложно и совсем не так, как с обычным кликом. Хотя казалось бы почему подход должен быть другим?