Перейти к содержимому

Setobjectname pyqt что это такое

  • автор:

Как обратится к ‘name’ объектов PyQt через цикл c подменой цифры в имени объекта?

Как обратиться к имени объектов, например label_1 , label_2 , label_3 ,
где будет перебирать цикл элементы через id переменную self.label_( id ).setText() ? Есть у данного способа минусы и посоветуете ли вы так делать?

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(230, 230) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label_1 = QtWidgets.QLabel(self.centralwidget) self.label_1.setGeometry(QtCore.QRect(30, 20, 47, 13)) self.label_1.setObjectName("label_1") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(30, 40, 47, 13)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(30, 60, 47, 13)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(30, 80, 47, 13)) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(30, 100, 47, 13)) self.label_5.setObjectName("label_5") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(20, 130, 181, 41)) self.pushButton.setObjectName("pushButton") self.lineEdit_1 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_1.setGeometry(QtCore.QRect(70, 20, 113, 20)) self.lineEdit_1.setObjectName("lineEdit_1") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(70, 40, 113, 20)) self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setGeometry(QtCore.QRect(70, 60, 113, 20)) self.lineEdit_3.setObjectName("lineEdit_3") self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_4.setGeometry(QtCore.QRect(70, 80, 113, 20)) self.lineEdit_4.setObjectName("lineEdit_4") self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_5.setGeometry(QtCore.QRect(70, 100, 113, 20)) self.lineEdit_5.setObjectName("lineEdit_5") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 230, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.pushButton.clicked.connect(self.wrt_parametr) # как преобразовать функцию ниже в цикл с обращением к имени объектов? def wrt_parametr(self): self.label_1.setText(self.lineEdit_1.text()) self.label_2.setText(self.lineEdit_2.text()) self.label_3.setText(self.lineEdit_3.text()) self.label_4.setText(self.lineEdit_4.text()) self.label_5.setText(self.lineEdit_5.text()) #for id in range(5): #self.label_(id).setText(self.lineEdit_(id).text()) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_1.setText(_translate("MainWindow", "1")) self.label_2.setText(_translate("MainWindow", "2")) self.label_3.setText(_translate("MainWindow", "3")) self.label_4.setText(_translate("MainWindow", "4")) self.label_5.setText(_translate("MainWindow", "5")) self.pushButton.setText(_translate("MainWindow", "Присвоить значения")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) 

PyQt GUI with setObjectName on all components to enable functional testing

Inspired by Test-Driven Development with Python by Harry Percival, I’m trying to implement functional testing of a PyQt GUI. I’m finding that, in order for tests to find the GUI components, I need the actual code to include lots of .setObjectName lines as a «hook». This makes the actual program code very redundant. For example:

 modelsWidget = QWidget() modelsWidget.setObjectName('modelswidget') modelsLayout = QVBoxLayout() modelsLayout.setObjectName('modelslayout') twoSingletButton = QRadioButton('Two uncoupled spin-1/2 nuclei') twoSingletButton.setObjectName('twosingletbutton') abButton = QRadioButton('Two coupled spin-1/2 nuclei\n ("AB quartet)') abButton.setObjectName('abbutton') 

and then the functional tests would look up components by name, e.g.:

def test_view_switch(self): """The user clicks on the radio button for the AB model, and sees that the view has changed to that for the AB model.""" initialView = self.ui.stackedWidget.currentWidget() abButton = self.getToolbar.findChild(QRadioButton, 'abbutton') abButton.click() finalView = self.ui.stackedWidget.currentWidget() assert initialView is not finalView assert finalView.objectName() == 'ABwidget' 

(OK, that’s probably poor craftsmanship, with two asserts in a single test, but it demonstrates the nature of the test strategy.) I don’t see a good way around this. It’s a lot more direct to use a statement such as:

self.Gui.findChild (QDoubleSpinBox, 'va') 
self.Gui.stackedWidget.currentWidget.layout.itemAtPosition(2, i).widget() 

in the tests. The former is assuming that the main code uses the same widget names, and the latter is assuming that the main code uses the exact same hierarchy to place a widget. Neither may truly be mandatory to provide the desired «look/feel» of the GUI. Am I going about functional testing a PyQt GUI the wrong way? Is there a more proper way for a test to find, or refer to, GUI components?

Python-сообщество

[RSS Feed]

  • Начало
  • » GUI
  • » PyQt — пару вопросов

#1 Май 29, 2007 16:54:59

well От: Зарегистрирован: 2006-11-20 Сообщения: 163 Репутация: 0 Профиль Отправить e-mail

PyQt — пару вопросов

Всем привет, у меня возникла проблема при работе с PyQt, создаю форму в Qt Designer:

перегоняю её в код Питона командой:

pyuic4.bat face.ui > face.py

генерится следующий код в вайл face.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'D:\Python\QT\face.ui'
#
# Created: Tue May 29 16:13:47 2007
# by: PyQt4 UI code generator 4.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(QtCore.QSize(QtCore.QRect(0,0,604,367).size()).expandedTo(MainWindow.minimumSizeHint()))

self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")

self.tabWidget = QtGui.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(230,0,381,436))
self.tabWidget.setObjectName("tabWidget")

self.tab = QtGui.QWidget()
self.tab.setObjectName("tab")

self.textBrowser_2 = QtGui.QTextBrowser(self.tab)
self.textBrowser_2.setGeometry(QtCore.QRect(9,9,357,193))
self.textBrowser_2.setObjectName("textBrowser_2")

self.textBrowser = QtGui.QTextBrowser(self.tab)
self.textBrowser.setGeometry(QtCore.QRect(9,208,357,192))
self.textBrowser.setObjectName("textBrowser")
self.tabWidget.addTab(self.tab,"")

self.horizontalLayout = QtGui.QWidget(self.centralwidget)
self.horizontalLayout.setGeometry(QtCore.QRect(0,10,231,22))
self.horizontalLayout.setObjectName("horizontalLayout")

self.hboxlayout = QtGui.QHBoxLayout(self.horizontalLayout)
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")

self.label = QtGui.QLabel(self.horizontalLayout)
self.label.setObjectName("label")
self.hboxlayout.addWidget(self.label)

self.lineEdit = QtGui.QLineEdit(self.horizontalLayout)
self.lineEdit.setObjectName("lineEdit")
self.hboxlayout.addWidget(self.lineEdit)

self.horizontalLayout_2 = QtGui.QWidget(self.centralwidget)
self.horizontalLayout_2.setGeometry(QtCore.QRect(0,120,231,22))
self.horizontalLayout_2.setObjectName("horizontalLayout_2")

self.hboxlayout1 = QtGui.QHBoxLayout(self.horizontalLayout_2)
self.hboxlayout1.setMargin(0)
self.hboxlayout1.setSpacing(6)
self.hboxlayout1.setObjectName("hboxlayout1")

self.label_5 = QtGui.QLabel(self.horizontalLayout_2)
self.label_5.setObjectName("label_5")
self.hboxlayout1.addWidget(self.label_5)

self.lineEdit_3 = QtGui.QLineEdit(self.horizontalLayout_2)
self.lineEdit_3.setObjectName("lineEdit_3")
self.hboxlayout1.addWidget(self.lineEdit_3)

self.label_4 = QtGui.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(0,40,61,20))
self.label_4.setObjectName("label_4")

self.widget_2 = QtGui.QWidget(self.centralwidget)
self.widget_2.setGeometry(QtCore.QRect(0,60,220,51))
self.widget_2.setObjectName("widget_2")

self.label_3 = QtGui.QLabel(self.widget_2)
self.label_3.setGeometry(QtCore.QRect(0,10,152,20))
self.label_3.setObjectName("label_3")

self.spinBox = QtGui.QSpinBox(self.widget_2)
self.spinBox.setGeometry(QtCore.QRect(160,10,44,18))
self.spinBox.setObjectName("spinBox")

self.spinBox_2 = QtGui.QSpinBox(self.widget_2)
self.spinBox_2.setGeometry(QtCore.QRect(160,30,44,18))
self.spinBox_2.setObjectName("spinBox_2")

self.label_2 = QtGui.QLabel(self.widget_2)
self.label_2.setGeometry(QtCore.QRect(0,30,152,20))
self.label_2.setObjectName("label_2")

self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(60,40,171,20))
self.lineEdit_2.setObjectName("lineEdit_2")
#MainWindow.setCentralWidget(self.centralwidget)

self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0,0,604,24))
self.menubar.setObjectName("menubar")

self.menu = QtGui.QMenu(self.menubar)
self.menu.setObjectName("menu")
#MainWindow.setMenuBar(self.menubar)

self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
#MainWindow.setStatusBar(self.statusbar)

self.action = QtGui.QAction(MainWindow)
self.action.setObjectName("action")

self.action_2 = QtGui.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addSeparator()
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())

self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "IP-адрес машины:", None, QtGui.QApplication.UnicodeUTF8))
self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Адрес:", None, QtGui.QApplication.UnicodeUTF8))
self.label_4.setText(QtGui.QApplication.translate("MainWindow", "ID машины:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Число пакетов для проверки:", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Процент потерь:", None, QtGui.QApplication.UnicodeUTF8))
self.menu.setTitle(QtGui.QApplication.translate("MainWindow", "Файл", None, QtGui.QApplication.UnicodeUTF8))
self.action.setText(QtGui.QApplication.translate("MainWindow", "Настройки", None, QtGui.QApplication.UnicodeUTF8))
self.action_2.setText(QtGui.QApplication.translate("MainWindow", "Выход", None, QtGui.QApplication.UnicodeUTF8))

запускаю все следующим кодом:

import sys
from face import Ui_MainWindow
from PyQt4 import QtCore, QtGui

class WellForm(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
fmMain = WellForm()
fmMain.show()
sys.exit(app.exec_())

врезультате, мне приходится коментить 3 строки в коде face.py чтобы запустилось, но вид сильно колбасится. Не знаете, что нитак?

Отредактировано (Янв. 21, 2009 12:19:50)

Как обновлять окно PyQt во время выполнения длительного цикла из другого модуля

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

rick1177
Новичок

Пользователь
Июн 19, 2022 2 0 1
Windows 11
Python 3.10
Спойлер: pip list

Package Version
—————— ————
beautifulsoup4 4.11.1
bs4 0.0.1
certifi 2022.5.18.1
charset-normalizer 2.0.12
cycler 0.11.0
fake-useragent 0.1.11
fonttools 4.33.3
idna 3.3
kiwisolver 1.4.3
lxml 4.9.0
matplotlib 3.5.2
numpy 1.22.4
packaging 21.3
pandas 1.4.2
Pillow 9.1.1
pip 22.1.2
psycopg2 2.9.3
pyparsing 3.0.9
pypiwin32 223
PyQt5 5.15.6
PyQt5-Qt5 5.15.2
PyQt5-sip 12.10.1
PyQt5-stubs 5.15.6.0
PyQt5Designer 5.14.1
PySide2 5.15.2.1
python-dateutil 2.8.2
pytz 2022.1
pywin32 304
requests 2.28.0
scipy 1.8.1
setuptools 58.1.0
shiboken2 5.15.2.1
six 1.16.0
soupsieve 2.3.2.post1
urllib3 1.26.9
win10toast 0.9

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

Спойлер: main.py

import sys import FormClasses from PyQt5 import QtWidgets import random import time def send_messages (self): for i in range(5): a=random.randint(1, 3) time.sleep(a) temp_text = f"Привет ".format(str(i)) self.send_logs(text_to_send=temp_text, red=255, green=0, blue=0, text_schema="\033[31m", mes_type="info", self_=self) def main(): app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication window = FormClasses.ExampleApp() # Создаём объект класса ExampleApp window.show() # Показываем окно app.exec_() # и запускаем приложение if __name__ == '__main__': main() # то запускаем функцию main()

Спойлер: FormClasses.py

from PyQt5 import QtWidgets, QtGui import StartForm import random import main import datetime import main class ExampleApp(QtWidgets.QMainWindow, StartForm.Ui_MainWindow): def __init__(self): # Это здесь нужно для доступа к переменным, методам # и т.д. в файле design.py super().__init__() self.count=0 self.setupUi(self) # Это нужно для инициализации нашего дизайна self.pushButton_UpdateTitles.clicked.connect(self.start_update_titels) # назначение на кнопку self.progressBar.setMinimum(1) self.progressBar.setValue(1) def setText_in_plainTextEditLogger_change_color (self, red: int = 0, green: int = 0, blue: int = 0): color = QtGui.QColor(red, green, blue) color_format = self.plainTextEditLogger.currentCharFormat() color_format.setForeground(color) self.plainTextEditLogger.setCurrentCharFormat(color_format) def setText_in_plainTextEditLogger(self, changefontonred=False, text: str = "", red: int = 0, green: int = 0, blue: int = 0): self.plainTextEditLogger.moveCursor(QtGui.QTextCursor.Start) if self.count!=1: text = text+'\n' if changefontonred ==True: self.setText_in_plainTextEditLogger_change_color(red,green,blue) self.plainTextEditLogger.insertPlainText(text) def send_logs(self, text_to_send = "", red=0, green=0, blue=0, text_schema = "", mes_type = "info", self_=None): t = datetime.datetime.now() current_time = t.strftime('%d.%m.%Y %H:%M:%S') print((text_schema+"<>").format(str(current_time) + ": "+text_to_send)) text_to_send = str(current_time+": ") + text_to_send if self_ is not None: self.setText_in_plainTextEditLogger(changefontonred=True, text=text_to_send, red = red, green=green, blue = blue) def start_update_titels(self): main.send_messages(self)

Спойлер: StartForm.py

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'StartForm.ui' # # Created by: PyQt5 UI code generator 5.15.6 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(400, 500) MainWindow.setMinimumSize(QtCore.QSize(400, 500)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.pushButton_UpdateTitles = QtWidgets.QPushButton(self.centralwidget) self.pushButton_UpdateTitles.setMinimumSize(QtCore.QSize(0, 30)) self.pushButton_UpdateTitles.setObjectName("pushButton_UpdateTitles") self.verticalLayout.addWidget(self.pushButton_UpdateTitles) self.plainTextEditLogger = QtWidgets.QPlainTextEdit(self.centralwidget) self.plainTextEditLogger.setStyleSheet("QPlainTextEdit\n" "") self.plainTextEditLogger.setObjectName("plainTextEditLogger") self.verticalLayout.addWidget(self.plainTextEditLogger) self.progressBar = QtWidgets.QProgressBar(self.centralwidget) self.progressBar.setProperty("value", 1) self.progressBar.setObjectName("progressBar") self.verticalLayout.addWidget(self.progressBar) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Парсинг eLibrary")) self.pushButton_UpdateTitles.setText(_translate("MainWindow", "Update Titles"))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *