Ein einfacher Artikel zum Einstieg in PyQt5

1. Einführung in PyQt5

PyQt ist ein Toolkit zum Erstellen von GUI-Anwendungen. Es handelt sich um eine gelungene Fusion der Programmiersprache Python und der Qt-Bibliothek. Die Qt-Bibliothek ist eine der leistungsstärksten. PyQt wurde von Phil Thompson entwickelt.

PyQt implementiert einen Python-Modulsatz. Es verfügt über mehr als 300 Klassen und fast 6000 Funktionen und Methoden. Es handelt sich um ein plattformübergreifendes Toolkit, das auf allen gängigen Betriebssystemen, einschließlich UNIX, Windows und Mac, läuft. PyQt verwendet Doppellizenzen, und Entwickler können zwischen GPL- und kommerziellen Lizenzen wählen. Zuvor konnte die GPL-Version nur unter Unix verwendet werden. Ab Version 4 von PyQt kann die GPL-Lizenz auf allen unterstützten Plattformen verwendet werden.

Sie sind in mehrere Module unterteilt. Das QtCore-Modul enthält zentrale Nicht-GUI-Funktionalität. Dieses Modul ist für Zeit, Dateien und Verzeichnisse, verschiedene Datentypen, Streams, URLs, MIME-Typen, Threads oder Prozesse. Das QtGui-Modul enthält grafische Komponenten und zugehörige Klassen wie Schaltflächen, Fenster, Statusleisten, Symbolleisten, Bildlaufleisten, Bitmaps, Farben, Schriftarten usw. Das QtNetwork-Modul enthält Klassen für die Netzwerkprogrammierung. Diese Klassen ermöglichen das Schreiben von TCP/IP- und UDP-Clients und -Servern. Sie machen die Netzwerkprogrammierung einfacher und portabler. QtXml enthält Klassen für die Arbeit mit XML-Dokumenten. Dieses Modul stellt Implementierungen der SAX- und DOM-APIs bereit. Das QtSvg-Modul stellt Klassen zur Anzeige von SVG-Dateien bereit. Scalable Vector Graphics (SVG) ist eine XML-Sprache zur Beschreibung zweidimensionaler Grafiken und Grafikanwendungen. Das QtOpenGL-Modul verwendet die OpenGL-Bibliothek zum Rendern von 3D- und 2D-Grafiken. Dieses Modul kann die GUI-Bibliothek und die OpenGL-Bibliothek von Qt nahtlos integrieren. Das QtSql-Modul stellt Klassen für die Arbeit mit Datenbanken bereit.

2. Einfache Bedienung

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget

print(QT_VERSION_STR)						# 查看当前Pyqt版本号

if __name__ == '__main__':
    app = QApplication(sys.argv)            # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
    w = QWidget()							# 创建窗口
    w.setWindowTitle("First PyQt")          # 设置窗口标题名称
    print(QT_VERSION_STR)                   # 获取版本号
    w.show()                                # 展示窗口
    app.exec()                              # 程序进入循环等待状态

3. QPushButton-Taste

from PyQt5.QtWidgets import QPushButton

if __name__ == '__main__':
  app = QApplication(sys.argv)            # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
  w = QWidget()                           # 创建的一个窗口

  w.setWindowTitle("First PyQt")          # 设置窗口标题名称
  btn = QPushButton("left Click")         # 在窗口里面添加控件
  btn.setParent(w)                        # 把当前按钮显示在W窗口 否则不会显示

  w.show()                                # 展示窗口
  app.exec()                              # 程序进入循环等待状态

4. QLabel-Klartext

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('One Label')
    label = QLabel('Username: ', w)            # 创建一个纯文本Label 显示在W上面
    label.setGeometry(200, 200, 300, 300)      # 设置窗口大小
    w.show()
    app.exec()

5.QLineEdit-Eingabefeld

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()

    w.setWindowTitle('one OLineEdit')

    user = QLabel('账号:', w)
    word = QLabel('密码:', w)
    user.setGeometry(20, 20, 30, 20)
    word.setGeometry(20, 50, 60, 20)

    edit1 = QLineEdit(w)												# 实例化输入框
    edit2 = QLineEdit(w)
    edit1.setPlaceholderText('请输入您的账号')			# 文本提示内容
    edit2.setPlaceholderText('请输入您的密码')
    edit1.setGeometry(55, 20, 200, 20)
    edit2.setGeometry(55, 50, 200, 20)

    btn = QPushButton('登录', w)
    btn.setGeometry(100, 80, 70, 30)

    w.show()
    app.exec()

6. Stellen Sie die Fensterposition ein

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()

    w.setWindowTitle('one OLineEdit')
    center_pointer = QDesktopWidget().availableGeometry().center()      # 调整窗口在屏幕正中间显示
   	# print(center_pointer)           	# PyQt5.QtCore.QPoint(742, 462)     
    x = center_pointer.x()
    y = center_pointer.y()
    # w.move(x-150, y-150)          	# 如果有设置窗口大小 需要减去xy一半的值 保证在中间
    
    # print(w.frameGeometry())                        # PyQt5.QtCore.QRect(0, 0, 640, 480)  依次																												是窗口位置 及窗口高宽
    # print(w.frameGeometry().getRect())              # (0, 0, 640, 480)
    # print(type(w.frameGeometry().getRect()))        # <class 'tuple'>	

    old_x, old_y, width, height = w.frameGeometry().getRect()
    w.move(x - width / 2, y - height / 2)				# 减去设置的窗口大小一般 居中

    w.show()
    app.exec()

7. Ändern Sie das Fenstersymbol

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('setIcon')
    w.setWindowIcon(QIcon('111.png'))
    w.show()
    app.exec()

8. PyQt-Layout

在QT里面布局分为四个大类: QBoxLayout、QGridLayout、QFormLayout、QStackedLayOut
						  表格          网格			表单			抽屉式‘
						  
盒子布局分为两个子类 QHBoxLayOut 、 QVBoxLayOut 负责垂直和水平布局

1> Vertikales Layout

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()          # 调用父类的init方法

        self.resize(300, 300)       # 设置大小
        self.setWindowTitle('Vertical LayOut')      # 设置标题
        layout = QVBoxLayout()      # 创建垂直对象

        btn1 = QPushButton('No.1')  # 创建按钮添加到布局
        layout.addWidget(btn1)

        btn2 = QPushButton('NO.2')
        layout.addWidget(btn2)

        btn3 = QPushButton('NO.3')
        layout.addWidget(btn3)

        # layout.addStretch(2)       # 添加伸缩器 每一个按钮前加上一个则平均分配 如果不写也则也是平均分

        self.setLayout(layout)      # 让当前窗口使用当前排列规则布局


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

2> Horizontales Layout

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGroupBox, QRadioButton, QHBoxLayout


class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        container = QVBoxLayout()       # 创建垂直布局

        hobby_box = QGroupBox('爱好')     # 分组
        v_layout = QVBoxLayout()
        btn1 = QRadioButton('抽烟')       # 添加单选框
        btn2 = QRadioButton('喝酒')
        btn3 = QRadioButton('烫头')

        v_layout.addWidget(btn1)         # 添加到布局中
        v_layout.addWidget(btn2)
        v_layout.addWidget(btn3)

        hobby_box.setLayout(v_layout)           # 容器使用当前V布局

        gender_box = QGroupBox('性别')
        h_layout = QHBoxLayout()

        btn4 = QRadioButton('boys')
        btn5 = QRadioButton('girls')
        btn6 = QRadioButton('gays')

        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)
        h_layout.addWidget(btn6)

        gender_box.setLayout(h_layout)          # 容器使用当前H布局

        container.addWidget(hobby_box)          # 把爱好添加到容器当中
        container.addWidget(gender_box)         # 把性别添加到容器当中

        self.setLayout(container)           	# 设置当前窗口显示容器内容


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

9. Einfache Pyqt-Anmeldung

import time, json, sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi('./untitled1.ui')
        # print(self.ui)
        # print(self.ui.__dict__)     # 获取当前UI可使用的对象
        # print(self.ui.label.text())    # 获取Label内容
        self.username = self.ui.lineEdit
        self.password = self.ui.lineEdit_2
        self.login_btn = self.ui.pushButton
        self.forget_btn = self.ui.pushButton_2
        self.text = self.ui.textBrowser

        self.login_btn.clicked.connect(self.login)  	# 绑定信号与槽函数

        self.password.setEchoMode(QLineEdit.Password)  # 把当前密码设置成隐藏

    def login(self):
        username = self.username.text()
        password = self.password.text()

        for i in range(3):
            print('正在登录服务器...... %d' % (i + 1))
            time.sleep(1)

        if username == 'Like' and password == '123':
            self.text.setText('欢迎%s登录!' % username)
            self.text.repaint()
        else:
            self.text.setText('当前用户名密码错误!')
            self.text.repaint()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.ui.show()
    app.exec()

10. Verwendung von PyQt-Threads

import sys
import time
from PyQt5 import uic

from PyQt5.Qt import QApplication, QWidget, QThread


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(5):
            print('MyThread线程 %d 正在执行' % (i + 1))
            time.sleep(1)


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi('./untitled2.ui')
        print(self.ui.__dict__)

        text = self.ui.lineEdit
        btn1 = self.ui.pushButton
        btn2 = self.ui.pushButton_2

        btn1.clicked.connect(self.click_1)
        btn2.clicked.connect(self.click_2)

    def click_1(self):
        for i in range(5):
            print('CLick1线程%d' % (i + 1))
            time.sleep(1)

    def click_2(self):
        self.mythread = MyThread()      # 创建线程      不加self的话引用技数为0则会回收 就会报错
        self.mythread.start()           # 启动线程


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.ui.show()
    app.exec()

11. QtDiaLog

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton


class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        left_btn = QPushButton('Left', self)
        right_btn = QPushButton('right', self)

        left_btn.setGeometry(0, 0, 100, 30)
        right_btn.setGeometry(50, 50, 100, 30)

        self.setWindowTitle('对话框')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyDialog()
    w.show()
    app.exec()

12.QtMainWindow

import sys

from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        label = QLabel('This is Title')
        label.setStyleSheet("font-size:20px; color: red; background-color:pink;")

        menu = self.menuBar()
        menu.setNativeMenuBar(False)

        file_menu = menu.addMenu('File')                # 添加一级标题
        file_menu.addAction('New Object...')
        file_menu.addAction('save as')
        file_menu.addAction('Open')
        
        file_menu = menu.addMenu('Edit')     # 添加一级标题
        file_menu.addAction('Cut')
        file_menu.addAction('Copy')
        file_menu.addAction('Paste')

        label.setGeometry(200, 200, 300, 300,)
        
        self.setCentralWidget(label)        # 设置窗口在中心位置显示


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

13. Benutzerdefiniertes QT-Signal

import sys, time
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.Qt import pyqtSignal


class MyWindow(QWidget):
    signal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.resize(300, 200)
        btn = QPushButton("开始检查", self)
        btn.setGeometry(0, 0, 200, 200)

        btn.clicked.connect(self.check)

        self.signal.connect(self.my_solt)

    def check(self):
        for i, ip in enumerate(['192.168.1.%d' % x for x in range(1, 255)]):
            msg = '正在检查 %s 上的漏洞' % ip
            print(msg)
            if i % 5 == 0:
                self.signal.emit(msg + 'Look One Bug')
            # else:
            #     self.signal.emit('')
            #     time.sleep(0.01)
 
    def my_solt(self, msg):
        print('>>>>', msg)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

Supongo que te gusta

Origin blog.csdn.net/MeiJin_/article/details/131132134
Recomendado
Clasificación