1. 程式人生 > >Python GUI教程三:佈局

Python GUI教程三:佈局

Python GUI 教程三:佈局

摘要:這篇文章是Python GUI教程系列的第三篇,將介紹Qt程式設計中的佈局概念及其在Python環境下的實現

作者:yooongchun
微信公眾號:yooongchun小屋
這裡寫圖片描述

  • STEP 1:認識佈局

    • 佈局是程式元件在介面上的排布規律,比如我們常看到的退出按鈕在一個介面的右上角
    • Qt提供了多種佈局方式,包括:絕對定位(畫素座標位置)、框佈局、網格佈局
  • STEP 2:絕對定位佈局

    • 絕對定位佈局,顧名思義,就是通過給出物件放置在介面上的絕對畫素座標位置來安排介面
    
    # -*- coding: utf-8 -*-
    
    
    """
    該程式實現一個絕對定位佈局器
    Author: yooongchun
    Time: 2018-05-07
    """
    import sys from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication,QWidget,QLabel from PyQt5.QtGui import QIcon # 絕對定位佈局 class AbsoLoca(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 = QLabel('Hello,it\'s an absolute layout.'
    , self) lbl1.move(50, 50) self.setGeometry(500, 500, 500, 300) self.setWindowTitle('Absolute') self.show() if __name__=="__main__": app = QApplication(sys.argv) ex = AbsoLoca() sys.exit(app.exec_())

    這裡寫圖片描述

  • STEP 3:框佈局

    • 框佈局指的是按照你的介面大小讓程式元件來自適應水平或者垂直方向的位置及大小
    
    # -*- coding: utf-8 -*-
    """ 該程式實現一個框佈局器 Author: yooongchun Time: 2018-05-02 """ import sys from PyQt5.QtWidgets import QPushButton, QAction, qApp, QApplication,QWidget,QLabel,QHBoxLayout,QVBoxLayout from PyQt5.QtGui import QIcon # 框佈局 class BoxLoca(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): okButton = QPushButton("OK") cancelButton = QPushButton("Cancel") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(500, 500, 500, 400) self.setWindowTitle('Buttons') self.show() if __name__=="__main__": app = QApplication(sys.argv) ex = BoxLoca() sys.exit(app.exec_())

    這裡寫圖片描述

  • STEP 4:網格佈局

    • 網格佈局將介面按照網格進行劃分,然後將元件放置到對應網格中
    
    # -*- coding: utf-8 -*-
    
    
    """
    該程式實現一個網格佈局器
    Author: yooongchun
    Time: 2018-05-07
    """
    import sys
    from PyQt5.QtWidgets import QPushButton, QAction, qApp, QApplication,QWidget,QLabel,QGridLayout
    from PyQt5.QtGui import QIcon
    
    
    # 網格佈局
    
    class GridLoca(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            grid = QGridLayout()
            self.setLayout(grid)
            names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=',
                     '+']
            positions = [(i, j) for i in range(5) for j in range(4)]
            for position, name in zip(positions, names):
                if name == '':
                    continue
                button = QPushButton(name)
                grid.addWidget(button, *position)
    
            self.move(1200, 750)
            self.setWindowTitle('Calculator')
            self.show()
    if __name__=="__main__":
        app = QApplication(sys.argv)
        ex = GridLoca()
        sys.exit(app.exec_())

    這裡寫圖片描述

  • STEP 5:佈局複合使用:以上幾種佈局器可以綜合起來一起使用,以設計出更加複雜的介面邏輯

    
    # -*- coding: utf-8 -*-
    
    
    """
    該程式實現佈局器的複合使用
    Author: yooongchun
    Time: 2018-05-02
    """
    
    import sys
    from PyQt5.QtWidgets import QPushButton,QWidget,QLineEdit,QTextEdit, QAction, qApp, QApplication,QWidget,QLabel,QGridLayout
    from PyQt5.QtGui import QIcon
    
    
    # 控制元件複合使用
    
    class MoreLoca(QWidget):
      def __init__(self):
          super().__init__()
          self.initUI()
    
      def initUI(self):
          title = QLabel('Title')
          author = QLabel('Author')
          review = QLabel('Review')
    
          titleEdit = QLineEdit()
          authorEdit = QLineEdit()
          reviewEdit = QTextEdit()
    
          grid = QGridLayout()
          grid.setSpacing(10)
    
          grid.addWidget(title, 1, 0)
          grid.addWidget(titleEdit, 1, 1)
    
          grid.addWidget(author, 2, 0)
          grid.addWidget(authorEdit, 2, 1)
    
          grid.addWidget(review, 3, 0)
          grid.addWidget(reviewEdit, 3, 1, 5, 1)
    
          self.setLayout(grid)
    
          self.setGeometry(500, 500, 1500, 1200)
          self.setWindowTitle('Review')
          self.show()
    
    if __name__=="__main__":
      app = QApplication(sys.argv)
      ex = MoreLoca()
      sys.exit(app.exec_())

    這裡寫圖片描述