Я делаю простую программу, которая читает некоторые данные из базы данных и отображает их в окне. Я решил использовать QGridLayout из PyQt5, но не могу go устранить несоответствие ширины надписей, размещенных на этом макете. Ниже приведена урезанная версия со случайными текстами вместо данных базы данных. Я бы хотел ВСЕГДА растягивать некоторые метки вправо, но иногда (в зависимости от текста) они занимают только часть пространства, предназначенного для них. Что я делаю не так? Примеры: Кнопка «Refre sh» изменяет текст на другой случайный тип, а также изменяет макет. Код:
import random
import string
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp, QApplication, QGridLayout, QLabel, QMainWindow, QPushButton, QWidget
class GardenHelperUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Garden Helper')
self.setFixedSize(800, 600)
self.generalLayout = QGridLayout()
self.bt_refresh = QPushButton('Refresh')
self._centralWidget = QWidget(self)
self.setCentralWidget(self._centralWidget)
self._centralWidget.setLayout(self.generalLayout)
self.status_bar = self.statusBar()
self.status_bar.showMessage('Ready')
self.tool_bar()
self.toolbar.addWidget(self.bt_refresh)
self.display_record()
def tool_bar(self):
exitAct = QAction(QIcon('img\exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Tools')
self.toolbar.addAction(exitAct)
self.bt_refresh.clicked.connect(self.display_record)
def display_record(self):
pl_namex = random_text(15)
en_namex = random_text(15)
lat_namex = random_text(15)
descx = random_text(200)
seedx = random_text(200)
watx = random_text(200)
likesx = random_text(200)
maintx = random_text(200)
self.clear_layout(self.generalLayout)
self.create_label(pl_namex, 1, 1, 2, 2, 3)
self.create_label(en_namex, 1, 4, 2, 2, 3)
self.create_label(lat_namex, 1, 7, 2, 2, 3)
self.create_label('Description:', 3, 1, 1, 2, 2)
self.create_label(descx, 3, 3, 2, 9)
self.create_label('Likes', 5, 1, 1, 2, 2)
self.create_label(likesx, 5, 3, 2, 9)
self.create_label('Seeding:', 7, 1, 1, 2, 2)
self.create_label(seedx, 7, 3, 2, 9)
self.create_label('Watering:', 9, 1, 1, 2, 2)
self.create_label(watx, 9, 3, 2, 9)
self.create_label('Maintenance:', 11, 1, 1, 2, 2)
self.create_label(maintx, 11, 3, 2, 9)
def create_label(self, label_text, pos_x: int, pos_y: int, rspan: int = 1, cspan: int = 1,
stylex: int = 1,
align=Qt.AlignLeft | Qt.AlignTop):
new_label = QLabel(label_text)
if stylex == 1:
new_label.setStyleSheet('font: 11pt Roboto Light; color: black; background-color: #E7ECB1; border-style: '
'solid; border-width: 1px; border-color: black')
elif stylex == 2:
new_label.setStyleSheet('font: 11pt Roboto Condensed; color: black')
elif stylex == 3:
new_label.setStyleSheet('font: 11pt Roboto Light Italic; color: #007E1F; background-color: #E2E2E2; '
'border-style: '
'solid; border-width: 0.5px; border-color: #969890')
new_label.setWordWrap(True)
self.generalLayout.addWidget(new_label, pos_x, pos_y, rspan, cspan, align)
def clear_layout(self, layout):
while layout.count() > 0:
item = layout.takeAt(0)
if not item:
continue
w = item.widget()
if w:
w.deleteLater()
def random_text(length):
text_list = []
letters = list(string.ascii_letters + string.digits + ' ' * 10)
for i in range(length):
text_list.append(letters[random.randint(0, len(letters) - 1)])
text_str = ''.join(text_list)
# print(text_str)
return text_str
def main():
garden_helper = QApplication(sys.argv)
window = GardenHelperUI()
window.show()
sys.exit(garden_helper.exec_())
if __name__ == '__main__':
main()