实现窗口中对象的对齐,从另一个.py文件添加图形

所以,我想问你关于在PyQt5中更好地组织多个,,图。以前,我得到了一些帮助,使用网格来实现我放入的对象更好地对齐。buttonsTextBoxMy Window


但是,我试图编码的结局仍然有点远。


以下是我到目前为止所得到的:


from PyQt5 import QtWidgets, QtCore

from PyQt5.QtWidgets import *

import sys



class Okno(QMainWindow):

    def __init__(self):

        super(Okno, self).__init__()

        self.setGeometry(500, 500, 900, 500)

        self.setWindowTitle("My window")

        self.button1 = QtWidgets.QPushButton()

        self.button2 = QtWidgets.QPushButton()

        self.TextBox1 = QLineEdit(self)  # Parameter self - add text box to my Window "Okno"

        self.TextBox2 = QLineEdit(self)

        self.TextBox3 = QLineEdit(self)

        self.TextBox4 = QLineEdit(self)   # Baudrate

        self.TextBox5 = QLineEdit(self)   # Parity

        self.TB_TEMP_IN = QLineEdit(self)   # Temp_IN

        self.TB_TEMP_OUT = QLineEdit(self)   # Temp_OUT

        self.label1 = QtWidgets.QLabel()  # TextBox1, pressure_IN

        self.label2 = QtWidgets.QLabel()

        self.label3 = QtWidgets.QLabel()

        self.label4 = QtWidgets.QLabel()  # TextBox3, pressure_OUT

        self.label_TEMP_IN = QtWidgets.QLabel()

        self.label_TEMP_OUT = QtWidgets.QLabel()

        self.iniUI()


在添加更多对象时,我注意到的一件事是很难组织起来。如果我正确理解它的工作原理,我必须将网格扩展到10 x 6,但是对齐方式(左,中,右)不会以对齐顺序对对象进行排序,例如由绝对边界定义的行/列。Grid


至于按钮,文本框,...我应该能够对它们进行编程,我只是没有太多使用Windows应用程序的经验,而主要是做控制台应用程序。


但是,我应该如何将两个图形添加到中?我正在使用matplotlib.pyplot将它们绘制在另一个.py文件中,我使用熊猫从.xls文件加载部分数据,另一部分(数据输出)将通过串行(RS232)或TCP / IP接口接收。我必须实时绘制它们并能够存储它们(.txt或.csv,这并不重要)。My Window


您能否给我一些关于选择“我的窗口”的正确概念的提示,以实现我在下面附加的示例,并能够在将来“轻松”添加其他对象(如有必要)。


我绝对认为窗口中的对象越多,就越需要更好的组织,因为方法和类都变得很长。iniUI(self)Okno(QMainWindow)


我举了一个简单的例子来说明我想要实现的目标:

http://img1.mukewang.com/63298d3e000121b122741289.jpg

Helenr
浏览 67回答 1
1回答

紫衣仙女

在将微件添加到布局时设置构件的对齐方式不会影响构件的对齐方式,而只会影响它们在布局提供的空间中的对齐方式。此外,许多小部件会自动尝试扩展自己(如 QLabel 或项目视图)。例如,QLabel具有文本的左/垂直居中的默认对齐方式,因此您需要设置该对齐方式,但如果其他小部件允许,它仍将尝试扩展其可用空间。要获得所需的内容,您必须考虑小部件之间的间距,它们(这表示小部件在布局中使用时对其大小的“意愿”,如果它具有固定的大小,是否可以增长/扩展,是否可以缩小等)。sizePolicy由于您希望列之间留出一些空间,因此最简单的方法是在布局中保留空列,并使用 setColumnStretch() 在这些列上设置拉伸因子,以便它们尝试尽可能多地扩展。最后,对于复杂的结构,最好使用嵌套布局,这意味着您将为小部件设置一个主布局,并向其添加“子”布局,以便每个“部分”都有自己的布局管理器,独立于其他布局。在下面的示例中,我实现了如下结构:  +-------------- main vertical layout ---------------+    |                                                   |    |  +------------ button grid layout -------------+  |    |  |title|    |(empty)|      |(empty)|     |title|  |    |  +-----+----+-------+------+-------+-----+-----+  |    |  |label|edit|       |input |       |label|edit |  |    |  +-----+----+-------+------+-------+-----+-----+  |    |  |label|edit|       |input |       |label|edit |  |    |  +-----+----+-------+------+-------+-----+-----+  |    |  |label|edit|       |input |       |label|edit |  |    |  +-----+----+-------+------+-------+-----+-----+  |    +---------------------------------------------------+    |                                                   |    |  +---------- graph horizontal layout ----------+  |    |  |                      |                      |  |    |  |       left graph     |      right graph     |  |    |  |                      |                      |  |    |  +----------------------+----------------------+  |    +---------------------------------------------------+    |                                                   |    |  +--------- button horizontal layout ----------+  |    |  |        |                           |        |  |    |  | button |         (stretch)         | button |  |    |  |        |                           |        |  |    |  +--------+---------------------------+--------+  |    +---------------------------------------------------+ 以下是它的显示方式:这就是代码。请注意,我从初始化中删除了小部件创建(如果您使用函数,那么在其他地方创建它们没有多大意义)。initUifrom PyQt5 import QtWidgets, QtCorefrom matplotlib.figure import Figurefrom matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasimport sysclass Okno(QtWidgets.QMainWindow):    def __init__(self):        super(Okno, self).__init__()        self.setGeometry(500, 500, 900, 500)        self.setWindowTitle("My window")        self.iniUI()    def iniUI(self):        w = QtWidgets.QWidget()        self.setCentralWidget(w)        mainLayout = QtWidgets.QVBoxLayout(w)        grid = QtWidgets.QGridLayout()        mainLayout.addLayout(grid)        self.dataInputLabel = QtWidgets.QLabel('Data Input')        grid.addWidget(self.dataInputLabel, 0, 0)        self.dataInputLabel.setStyleSheet('color: red')        portSettingLabel = QtWidgets.QLabel('Port setting', alignment=QtCore.Qt.AlignCenter)        grid.addWidget(portSettingLabel, 0, 3)        self.dataOutputLabel = QtWidgets.QLabel('Data Output', alignment=QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)        grid.addWidget(self.dataOutputLabel, 0, 6)        self.dataOutputLabel.setStyleSheet('color: blue')        # set the vertical policy to Maximum for labels, so they don't try to        # expand themselves if there's more available space        for label in (self.dataInputLabel, portSettingLabel, self.dataOutputLabel):            label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)        grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 0)        self.inputPressure = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.inputPressure, 1, 1)        grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 0)        self.inputTemp = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.inputTemp, 2, 1)        grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 0)        self.inputHumidity = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.inputHumidity, 3, 1)        self.portEdit = QtWidgets.QLineEdit(placeholderText='Enter port')        grid.addWidget(self.portEdit, 1, 3)        self.baudEdit = QtWidgets.QLineEdit(placeholderText='Baudrate')        grid.addWidget(self.baudEdit, 2, 3)        self.parityEdit = QtWidgets.QLineEdit(placeholderText='Parity')        grid.addWidget(self.parityEdit, 3, 3)        grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 5)        self.outputPressure = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.outputPressure, 1, 6)        grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 5)        self.outputTemp = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.outputTemp, 2, 6)        grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 5)        self.outputHumidity = QtWidgets.QLineEdit(readOnly=True)        grid.addWidget(self.outputHumidity, 3, 6)        grid.setColumnStretch(2, 1)        grid.setColumnStretch(4, 1)        graphLayout = QtWidgets.QHBoxLayout()        mainLayout.addLayout(graphLayout)        # here insert your graphs...        self.graphLeft = FigureCanvas(Figure())        graphLayout.addWidget(self.graphLeft)        self.graphRight = FigureCanvas(Figure())        graphLayout.addWidget(self.graphRight)        buttonLayout = QtWidgets.QHBoxLayout()        mainLayout.addLayout(buttonLayout)        self.openButton = QtWidgets.QPushButton('Open file')        self.openButton.setMinimumWidth(150)        self.openButton.clicked.connect(self.open_file)        buttonLayout.addWidget(self.openButton)        # add an empty "stretch", which acts as an expanding spacer on box layouts        buttonLayout.addStretch()        self.exitButton = QtWidgets.QPushButton('Exit')        self.exitButton.clicked.connect(self.close)        buttonLayout.addWidget(self.exitButton)最后,考虑使用Qt Designer,这对于创建复杂的布局非常有用(或者,如果您仍然想通过代码完成所有操作,则至少在设计它们的过程中可视化它们)。请注意,在这种情况下,您应该遵循使用设计器的建议准则(最重要的是,永远不要编辑使用实用程序生成的python文件),或者使用模块中的(其中是要使用ui设置的小部件/窗口)。pyuicloadUi('yourguifile.ui', self)selfPyQt5.uic
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python