aprendizaje PyQt4 --- línea de mano y escribir el código 3 de la interfaz (serie 2)

directorio

1. Crear un proyecto

2, con las manos para lograrlo

3, fragmento detallado


Esta serie de artículos antecedente opinión:

  1. aprendizaje PyQt4 --- la barra de menú (Addmenu) de 1, la barra de herramientas (AddToolbar), caja de herramientas edición de textos
  2. aprendizaje PyQt4 --- BoxLayout Diseño 2, la disposición GridLayout cuadrícula, diseño de interfaces para lograr la calculadora

Las dos secciones anteriores están preparando el camino, es el tercer capítulo, aquí estamos haciendo un gran billete, la parte delantera de los dos para integrar, interfaz de AI a una primera experiencia, el resultado final es el siguiente:

1. Crear un proyecto

Aquí accidentalmente crea una QDialog proyecto, de hecho, esta relación no es, aquí hay tres grupos de selección de proyectos para la diferencia, puede cuidadosamente después de seleccionar un proyecto, aquí en el uso de QDialog redacción de este proyecto.

Qt en QMainWindow, QWidget, diferencia QDialog:

  • QWidget es la clase base para todos los de la interfaz gráfica, que es una subclase de QWidget QMainWindow y son QDialog;
  • QMainWindow se proporciona un menú, la barra principal de herramientas de la ventana;
  • QDialog es el cuadro de diálogo, que se utiliza para la interacción a corto plazo con el usuario.

Mirar hacia atrás en los resultados finales de la figura anterior, aquí lo ponemos quería hacer una hermosa interfaz de usuario para su hermana pequeña bien diseñado, rico sentido del diseño de interfaz de usuario barra de combinación, que contiene los controles principales son los siguientes:

punto de vista de acabado, que se puede dividir en tres grandes piezas:

  1. sección de salida de la pantalla de impresión, definida como la izquierda Además,
  2. parte de entrada de parámetros, definida como la derecha
  3. la sección de botones de función, que se define como un botón

(1) La sección de salida de impresión, contiene izquierda dos

  1. label-- copia impresa
  2. lineEdit-- información de salida de la pantalla

(2) la sección de entrada de parámetros, a la derecha

  1. tasa de aprendizaje, y otras optimizaciones cinco etiqueta
  2. LineEdit correspondiente, o

(3) tres botones de función de botón pulsador

Con tantos, vamos a la línea delgada y el código que implementa la interfaz para lograr las funciones anteriores de la misma.

2, con las manos para lograrlo

Aquí no se consigue mediante un paso a paso, pero en lugar de todo el proceso es similar a la primera pantalla, y un tipo de sección, dichos puntos de vista general, como se describe en mayor parte de nuestra tercera sección. Ado, mira código global (proceso de implementación de código intermedio se ha descrito en varios segmentos que permitan alcanzar el objeto, como un comentario sobre la totalidad de las porciones de código).

__author__ = "lingjun"
# E-mail: [email protected]
# welcome to attention:小白CV

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

from PyQt4 import QtCore
from PyQt4 import QtGui
import sys

QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("utf8"))

class InputDlg(QtGui.QWidget):
    def __init__(self,parent=None):  
        super(InputDlg,self).__init__(parent)
        QtGui.QWidget.__init__(self,parent=None)
        # self.setGeometry(400,200,640,680)
        self.setWindowTitle(self.tr("自助训练系统"))

        train = QtGui.QPushButton(u'训练开始', self)
        self.connect(train, QtCore.SIGNAL("clicked()"), self.train_slot)    ######################

        test = QtGui.QPushButton(u'测试开始', self)
        self.connect(test, QtCore.SIGNAL("clicked()"), self.main)  #######################

        evaluate = QtGui.QPushButton(u'评估开始', self)
        self.connect(evaluate, QtCore.SIGNAL("clicked()"), self.evaluate_slot)#########################

        # train、test、evaluate水平布局
        bottomLayout = QtGui.QHBoxLayout()
        bottomLayout.addStretch()
        bottomLayout.addWidget(train)
        bottomLayout.addWidget(test)
        bottomLayout.addWidget(evaluate)

        #self.setLayout(bottomLayout)
    ##########################################################################
        label_print = QtGui.QLabel(self.tr("打印输出"))
        self.printTextEdit = QtGui.QTextEdit()

        leftLayout = QtGui.QVBoxLayout()
        leftLayout.addWidget(label_print)
        leftLayout.addWidget(self.printTextEdit)
    ###############################################################################

        label_lr=QtGui.QLabel(self.tr(u"学习率:"))
        label_opt=QtGui.QLabel(self.tr(u"优化方式:"))
        label_me=QtGui.QLabel(self.tr(u"最大迭代数:"))
        label_itr=QtGui.QLabel(self.tr(u"每迭代数保存模型:"))
        label_begin = QtGui.QLabel(self.tr(u"是否从头开始训练:"))

        self.lrLineEdit = QtGui.QLineEdit()

        self.optComboBox = QtGui.QComboBox()
        self.optComboBox.insertItem(0, self.tr("SGD"))
        self.optComboBox.insertItem(1, self.tr("Adam"))

        self.meLineEdit = QtGui.QLineEdit()

        self.itrComboBox = QtGui.QComboBox()
        self.itrComboBox.insertItem(0, self.tr("2"))
        self.itrComboBox.insertItem(1, self.tr("5"))

        self.beginComboBox = QtGui.QComboBox()
        self.beginComboBox.insertItem(0, self.tr("Yes"))
        self.beginComboBox.insertItem(1, self.tr("No"))
        self.checkpointLabel = QtGui.QLabel("0")
        self.connect(self.beginComboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.retrain_begin_num)

        # 右上侧信息网格布局
        rightLayout = QtGui.QGridLayout()
        rightLayout.addWidget(label_lr,0,0)
        rightLayout.addWidget(self.lrLineEdit,0,1)

        rightLayout.addWidget(label_opt,1,0)
        rightLayout.addWidget(self.optComboBox,1,1)

        rightLayout.addWidget(label_me,2,0)
        rightLayout.addWidget(self.meLineEdit,2,1)

        rightLayout.addWidget(label_itr,3,0)
        rightLayout.addWidget(self.itrComboBox,3,1)

        rightLayout.addWidget(label_begin, 4, 0)
        rightLayout.addWidget(self.beginComboBox, 4, 1)
        rightLayout.addWidget(self.checkpointLabel, 4, 2)
##################################################################
        # 把左部分、右部分、下部分进行网格布局
        mainLayout = QtGui.QGridLayout(self)
        mainLayout.setMargin(15)
        mainLayout.setSpacing(10)
        mainLayout.addLayout(leftLayout, 0, 0)
        mainLayout.addLayout(rightLayout, 0, 1)

        #mainLayout.addLayout(midLayout, 0, 2)
        mainLayout.addLayout(bottomLayout, 1, 0, 1, 2)
        mainLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)

    ########################################################################
    # Button_runs_slot
    ########################################################################
    def retrain_begin_num(self):
        checkpoint_num, ok = QtGui.QInputDialog.getInteger(self,self.tr("checkpoint_num"),
                                       self.tr("请输入模型开始步数:"),
                                       int(self.checkpointLabel.text()),0,150)
        if ok:
            self.checkpointLabel.setText(str(checkpoint_num))



    def test_slot(self):
        button = QtGui.QMessageBox.question(self, "Question",
                                      self.tr("正在测试,等稍等···?"))

    def evaluate_slot(self):
        button = QtGui.QMessageBox.question(self, "Question",
                                      self.tr("正在评估,等稍等···?"))

    def train_slot(self):
        lr_value = self.lrLineEdit.text()  # 获取文本框内容
        print(u'学习率=', lr_value)

        opt_value = self.optComboBox.currentText()  # 返回选中选项的文本
        print(u'优化方式=', opt_value)

        me_value = self.meLineEdit.text()  # 获取文本框内容
        print(u'最大迭代轮数=', me_value)

        itr_value = self.itrComboBox.currentText()
        print(u'每迭代{}保存模型'.format(itr_value))

        begin_value = self.beginComboBox.currentText()
        print(u'是否从0开始训练=', begin_value)

        checkpoint_value = self.checkpointLabel.text()
        print(u'继续训练,Epoch=', checkpoint_value)

        ###### QtGui.QTextEdit() 显示内容 ##########
        self.printTextEdit.setText(u'打印训练参数:\n' + u'学习率: ' + lr_value
                                   + '\n' + u'优化方式: ' + opt_value
                                   + '\n' + u'最大迭代轮数: ' + me_value
                                   + '\n' + u'每迭代步数保存模型: ' + itr_value
                                   + '\n' + u'是否从0开始训练: ' + begin_value
                                   + '\n' + u'继续训练,Epoch: ' + checkpoint_value)

        button = QtGui.QMessageBox.question(self, u"训练,打印学习率",
                                            self.tr("学习率={}".format(lr_value)),
                                            QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
                                            QtGui.QMessageBox.Ok)
        if button == QtGui.QMessageBox.Ok:
            self.tr("ok")
        elif button == QtGui.QMessageBox.Cancel:
            self.tr("bay")
        else:
            return

if __name__ == "__main__":
    app=QtGui.QApplication(sys.argv)

    s=InputDlg()
    s.show()
    app.exec_()

3, fragmento detallado

Orden, de abajo hacia arriba

(1) comenzó a partir de la parte inferior, los controles parte PushButton, extractos aquí, como sigue

        self.setWindowTitle(self.tr("自助训练系统"))

        train = QtGui.QPushButton(u'训练开始', self)
        self.connect(train, QtCore.SIGNAL("clicked()"), self.train_slot)    ######################

        test = QtGui.QPushButton(u'测试开始', self)
        self.connect(test, QtCore.SIGNAL("clicked()"), self.main)  #######################

        evaluate = QtGui.QPushButton(u'评估开始', self)
        self.connect(evaluate, QtCore.SIGNAL("clicked()"), self.evaluate_slot)#########################
  1. La primera consiste en establecer un título de la ventana (setWindowTitle) para toda la interfaz gráfica de usuario, hay poca integración de uno mismo, cuando en la clase de uso, lo que sería más común en la programación después de este punto es también para tener en cuenta
  2. Añadir un " inicio de entrenamiento botón" en PyQt en, QtGui se utiliza principalmente para la interfaz gráfica de usuario para la interfaz gráfica de usuario (Graphical User la interfaz ) controles en la definición, tales como botones, cuadros de texto. Hola siempre y cuando sea en la interfaz puede ser visto por mi madre, que está por definir; QtCore esto es lo contrario, a cargo de una hermosa flor (antiguo), una carga de contenidos, como la sección de transmisión de señales 3
  3. Con el botón, el botón también tienen que hacer ciertas funciones de trabajo. El siguiente es el uso de sólo el mecanismo mayoría de las señales qt representativos y ranuras, a continuación, echar un vistazo a una comparación del mecanismo de ranuras de señal de imagen de gráfico de barras (abajo). --- tren que establece el nombre del botón es, no hay un mecanismo dentro de la señal QtCore, en el que se hace clic en el gatillo aquí, la transmisión de la señal, que se define como una función de la aceptación de la función de tren-ranura (se requiere esta función en la siguiente definición, queremos que este botón es la definición de Diansha seca)

botones de función se definen, y que tres de ellos exactamente lo que será en forma de, o ser un pre-dispuestos, y que quien después. También hay necesidad de definir nosotros mismos, de la siguiente manera:

        # train、test、evaluate水平布局
        bottomLayout = QtGui.QHBoxLayout()
        bottomLayout.addStretch()
        bottomLayout.addWidget(train)
        bottomLayout.addWidget(test)
        bottomLayout.addWidget(evaluate)
  1. Ejemplos de un QtGui.QHBoxLayout (), este nivel se utiliza para el diseño
  2. Los tres botones definidos anteriormente tren, probar, evaluar usando complemento en
  3. De acuerdo con la idea anterior, ¿no se debe hacer, quién hace qué y una declaración addStretch? Mira lo que significa, dirigimos así: estiramiento, la tensión, se extendía sobre-y cuyo nombre significa lo mismo aquí, con el fin de hacer que el formato más atractivo después de la disposición, y deliberadamente lleno de un espacio en blanco.

(2) dejó definir pantalla

  1. label-- copia impresa
  2. lineEdit-- información de salida de la pantalla

Mira, de hecho, es esta línea de pensamiento entorno interfacial, no entra en detalles

Sin embargo, hay poca necesidad de prestar atención: métodos comúnmente utilizados son addWidget () y addLayout ()

  1. addWidget () para la inserción en el control de diseño
  2. addLayout () para insertar sub-diseño en la disposición
        label_print = QtGui.QLabel(self.tr("打印输出"))
        self.printTextEdit = QtGui.QTextEdit()

        leftLayout = QtGui.QVBoxLayout()
        leftLayout.addWidget(label_print)
        leftLayout.addWidget(self.printTextEdit)

Después de la adición es bueno o necesita ser establecido, tres y 1 se descarga, la disposición horizontal, esto es disposición apilable, vertical. En primer instancia, a continuación, añadir los controles en él. Que no parece ser muy simple de hacer

(3) una tercera porción de bloque parecía relativamente compleja, pero un vistazo más de cerca, de hecho, son sustancialmente similares. Programas como este, mirando a lo complejo, de hecho, no es un enfoque de procedimiento, y es simplemente un número.

        label_lr=QtGui.QLabel(self.tr(u"学习率:"))
        label_opt=QtGui.QLabel(self.tr(u"优化方式:"))
        label_me=QtGui.QLabel(self.tr(u"最大迭代数:"))
        label_itr=QtGui.QLabel(self.tr(u"每迭代数保存模型:"))
        label_begin = QtGui.QLabel(self.tr(u"是否从头开始训练:"))

        self.lrLineEdit = QtGui.QLineEdit()

        self.optComboBox = QtGui.QComboBox()
        self.optComboBox.insertItem(0, self.tr("SGD"))
        self.optComboBox.insertItem(1, self.tr("Adam"))

        self.meLineEdit = QtGui.QLineEdit()

        self.itrComboBox = QtGui.QComboBox()
        self.itrComboBox.insertItem(0, self.tr("2"))
        self.itrComboBox.insertItem(1, self.tr("5"))

        self.beginComboBox = QtGui.QComboBox()
        self.beginComboBox.insertItem(0, self.tr("Yes"))
        self.beginComboBox.insertItem(1, self.tr("No"))
        self.checkpointLabel = QtGui.QLabel("0")
        self.connect(self.beginComboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.retrain_begin_num)
  1. etiqueta desechable todas las partes necesarias se añaden a ella
  2. Este control se deja a la propia entrada del usuario, que se puede definir como LineEdit, puede estar vacío por defecto, hay un cuadro combinado tan selectiva detrás (los cuadros de lista y soltar hacia abajo), establezca la materia opcional, proyectos aquí insertados (Términos) , lo que implica principalmente dos, no hay mucho más que decir
  3. Un poco lugar diferente, cuadro de lista desplegable que se puede ajustar en el mecanismo de señalización, el código anterior se establece en "cuando el cambio de índice actual, que lo transmiten señales, ranura activado función retrain_begin_num"
  4. Puesto que la parte derecha, la dirección vertical también es horizontal, que está usando en una forma de malla en la estructura de líneas, (ajuste de la referencia en el presente documento: el aprendizaje PyQt4 --- una BoxLayout de distribución 2, la disposición de la rejilla GridLayout lograr diseño de la interfaz calculadora ) como se describe en este de esta manera:
        # 右上侧信息网格布局
        rightLayout = QtGui.QGridLayout()

        # addWidget用于在布局中插入控件
        # QGridLayout.addWidget(窗体, 起始行, 起始列, 占用行, 占用列, 对齐方式)
        rightLayout.addWidget(label_lr,0,0)
        rightLayout.addWidget(self.lrLineEdit,0,1)

        rightLayout.addWidget(label_opt,1,0)
        rightLayout.addWidget(self.optComboBox,1,1)

        rightLayout.addWidget(label_me,2,0)
        rightLayout.addWidget(self.meLineEdit,2,1)

        rightLayout.addWidget(label_itr,3,0)
        rightLayout.addWidget(self.itrComboBox,3,1)

        rightLayout.addWidget(label_begin, 4, 0)
        rightLayout.addWidget(self.beginComboBox, 4, 1)
        rightLayout.addWidget(self.checkpointLabel, 4, 2)

(4) delante de tres elementos, a saber, el nivel de la parte inferior de la disposición, la parte izquierda de la disposición vertical, la parte derecha de la disposición de la rejilla, puede decirse que cuanto más comúnmente utilizado qt recordar disposición abarca tanto y, finalmente, o se va a presentar en toda la interfaz, o no saben la relación entre ellos tres, tres de ellos aquí debe haber una definición clara de la relación, de la siguiente manera:

  • addLayout () para insertar sub-diseño en la disposición
        # 把左部分、右部分、下部分进行网格布局
        mainLayout = QtGui.QGridLayout(self)
        mainLayout.setMargin(15) # 表示控件与窗体的左右边距
        mainLayout.setSpacing(10) # 表示各个控件之间的上下间距
        mainLayout.addLayout(leftLayout, 0, 0)
        mainLayout.addLayout(rightLayout, 0, 1)

        #mainLayout.addLayout(midLayout, 0, 2)
        mainLayout.addLayout(bottomLayout, 1, 0, 1, 2)
        mainLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize) # 设置对话框大小固定,不允许用户改变

(5) una función de la porción de ranura implementado


Dijo caja principal de datos de interfaz gráfica de usuario junto a conseguirlo, y luego imprimir en el cuadro de visualización. Esto sería más común después de la aplicación

    def train_slot(self):
        lr_value = self.lrLineEdit.text()  # 获取文本框内容
        print(u'学习率=', lr_value)

        opt_value = self.optComboBox.currentText()  # 返回选中选项的文本
        print(u'优化方式=', opt_value)

        me_value = self.meLineEdit.text()  # 获取文本框内容
        print(u'最大迭代轮数=', me_value)

        itr_value = self.itrComboBox.currentText()
        print(u'每迭代{}保存模型'.format(itr_value))

        begin_value = self.beginComboBox.currentText()
        print(u'是否从0开始训练=', begin_value)

        checkpoint_value = self.checkpointLabel.text()
        print(u'继续训练,Epoch=', checkpoint_value)

        ###### QtGui.QTextEdit() 显示内容 ##########
        self.printTextEdit.setText(u'打印训练参数:\n' + u'学习率: ' + lr_value
                                   + '\n' + u'优化方式: ' + opt_value
                                   + '\n' + u'最大迭代轮数: ' + me_value
                                   + '\n' + u'每迭代步数保存模型: ' + itr_value
                                   + '\n' + u'是否从0开始训练: ' + begin_value
                                   + '\n' + u'继续训练,Epoch: ' + checkpoint_value)

OK, escapar, aquí hoy amigos

Blanco de CV: objetivos Público número centrarse en CV (visión por ordenador), AI (inteligencia artificial) campos relacionados con la tecnología, el contenido principal del artículo en todo el C ++, Python técnicas de aprendizaje automático (ML) de programación, la profundidad del aprendizaje (DL), procesamiento de imágenes OpenCV, etc. tecnología, explorar el fondo de las operaciones puntos, estudio y registro de trabajo comunes, problemas técnicos se aprende a asistente trabajo. Sólo se refiere a la tecnología, el intercambio de conocimientos campo plataforma de CV profesional.
 

 

 

Publicado 74 artículos originales · ganado elogios 64 · vistas 130 000 +

Supongo que te gusta

Origin blog.csdn.net/wsLJQian/article/details/99976078
Recomendado
Clasificación