Найти - Пользователи
Полная версия: Как связать самодельный код с полученным кодом после QTDesigner?
Начало » GUI » Как связать самодельный код с полученным кодом после QTDesigner?
1 2 3 4
Holden
Сразу говорю, я не программист, а всего лишь пытаюсь для своей работы освоить азы и написать полезные программки,
поэтому просьба не забрасывать гнилыми помидорами, а помочь, если нетрудно.
Выбрал простой пример, который решается в 1 действие. Задаётся площадь, выбирается шаг. Делением площади на шаг получаем длину.
В самом питоне без GUI эту задачу решаю кодом который привожу ниже. (уверен что есть более изящные способы, но этот тоже работает)

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

def Length():
Step_type_list = ['Small', 'Medium', 'Large']
Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list.index(Step_type)]

Area = 100 # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
print(Result)

if __name__ == "__main__": Length()
Набросал в QT Designer, как должно выглядеть окно для пользователя. pyuic сгенерировал следующий код:

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

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Result, m:", None, QtGui.QApplication.UnicodeUTF8))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Вопрос заключается в том, как объединить эти два кода в один. В качестве ответа хорошо было бы получить итоговый код (в идеале с комментариями:) ).
возможно тут сигналы/слоты нужно использовать, но для подобной задачи примеров в сети не нашёл.
Holden
модераторы тему переместили из “Python для новичков”.
там можно глупые вопросы задавать, а тут можно нарваца на злых професоналов…
Studentik
from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.comboBox.activated.connect(self.on_combo_activated)
self.lineEdit_Area.textChanged.connect(self.on_input_textChanged)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Result, m:", None, QtGui.QApplication.UnicodeUTF8))

def on_combo_activated(self, index):
self.length()

def on_input_textChanged(self, string):
self.length()

def length(self):
Step_type_list = self.comboBox.currentIndex()
# Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list]

Area = int(self.lineEdit_Area.text()) # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
self.lineEdit_2.setText(str(Result))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Holden
Низкий поклон тебе, комрад!
работает. Буду разбираться, и пользоваться в дальнейшем.
truporez
Удобней хранить автоматически сгенерированный код отдельно, в таком случае вы всегда сможете изменить разметку окна без переноса функций.

mainwindow.py - сгенерирован автоматом:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
файл с вашими функциями

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from PyQt4 import QtCore, QtGui, Qsci
from mainwindow import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.comboBox.activated.connect(self.on_combo_activated)
self.lineEdit_Area.textChanged.connect(self.on_input_textChanged)

def on_combo_activated(self, index):
self.length()

def on_input_textChanged(self, string):
self.length()

def length(self):
Step_type_list = self.comboBox.currentIndex()
# Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list]

Area = int(self.lineEdit_Area.text()) # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
self.lineEdit_2.setText(str(Result))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())
Holden
Друзья, в примере вы мне показали, как активируются ComboBox и LineEdit.
Подскажите еще пожалуйста как оживить другие виджеты. Конкретно сейчас интересует chekbox.
Как будут выглядеть строки оживления для аналогичного примера с QTDesigner-ским кодом?
Если есть ссылка где доступно описаны такие варианты, киньте пожалуйста, чтоб я по отдельным виджетам не дёргал.
Все мои попытки найти что-то путёвое самостоятельно ничем хорошим не закончились.
http://zetcode.com/tutorials/pyqt4/widgets/
например из этой ссылки не получается удачно присобачить, чтоб работало.
Studentik
Дык Вы про signal/slot механизм поняли? Находите у виджета удобный сигнал и соединяете его со своим обработчиком…
http://doc.qt.nokia.com/4.7/qcheckbox.html#stateChanged
Holden
понять то может и поняли, но чтоб применить это понимание пока что без примеров не обойтись.
тут кагбэ синтаксис важен. по ссылке этой тоже раньше оказывался, но каюсь нихера не понимаю )) как можно воспользоваться этими выкладками?
оно для меня там в каком-то абстрактном виде, на примерах как-то более понятно. еще не дорос до того чтобы понимать как мне может помочь строка типа этой:
bool QCheckBox::event ( QEvent * e )

ps. Studentik, спасибо за помощь по всем предыдущим вопросам.
сори за нубизм.
Studentik
Разжевываю:
1) Открывайте справку по QCheckBox и внимательно посмотрите на единственный сигнал “stateChanged” и его аргументы
2) в своем коде сделайте функцию с аргументами, как у stateChanged
3) в своем коде где-то выполните your_check_box.stateChanged.connect(your_handler)
4) PROFIT!
Holden
Studentik
Разжевываю:
1) Открывайте справку по QCheckBox и внимательно посмотрите на единственный сигнал “stateChanged” и его аргументы
2) в своем коде сделайте функцию с аргументами, как у stateChanged
3) в своем коде где-то выполните your_check_box.stateChanged.connect(your_handler)
4) PROFIT!
Гран мэрси! Буду пробовать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB