как прокручивать виджеты в QScrollArea?
Я попробовал добавить в QVBoxLayout - QScrollArea и QScrollBar. В качестве layout'a указал виджет, а котором были добавлены player'ы (2 штуки).
При прокрутке виджеты множились. Если по простому, то нужно сделать QScrollArea и QScrollBar, при прокрутке которого, будут прокручиваться player'ы. Как это должно выглядеть, примерно (Виджеты съехали):
Что у меня получается:
Вот часть кода: Main.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys, os
import player
class Main(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.setFixedSize(750, 560)
self.p1 = player.player_1()
self.lay = QHBoxLayout(self)
self.lay.setContentsMargins(0,0,0,0)
self.scroll_area = QtWidgets.QScrollArea(self) # 2
self.scroll_area.setLayout(self.lay)
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scrollbar = QtWidgets.QScrollBar(Qt.Horizontal, self) # 3
self.scrollbar.setMaximum(250)
self.scrollbar.valueChanged.connect(self.sync_func) # 4
self.v_layout = QtWidgets.QVBoxLayout(self)
self.v_layout.addWidget(self.scroll_area)
self.v_layout.addWidget(self.scrollbar)
def sync_func(self):
self.scroll_area.horizontalScrollBar().setValue(self.scrollbar.value() * 1)
self.lay.addWidget(Sttings())
self.lay.addWidget(player.player_1())
self.lay.addWidget(player.player_1())
self.transition()
def transition(self):
player.reputation_perem = player.reputation_perem + (player.reputation_perem / 100 * 5)
player.money_perem = player.money_perem + player.income_perem
#reputation_perem_2 = reputation_perem_2 + (reputation_perem_2 / 100 * 5)
#income_perem_2 = income_perem_old_2 / 100 * (100 - (100 - reputation_perem_2))
#money_perem_2 = money_perem_2 + income_perem_2
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Main()
w.show()
file = QtCore.QFile("C:/for cheacher/3_mate_files/dark.qss")
file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text)
stream = QtCore.QTextStream(file)
app.setStyleSheet(stream.readAll())
sys.exit(app.exec_())
player.py:
money_perem = 0
income_perem_old = 500
income_perem = 0
credit_perem = 0
reputation_perem = 20
class player_1(QtWidgets.QWidget):
def __init__(self, parent=None):
global money_perem, credit_perem, reputation_perem, income_perem, income_perem_old
super(player_1, self).__init__(parent)
self.setFixedSize(350, 550)
# изображение
self.Label_ing = QLabel('', self)
self.img = QtGui.QPixmap('C:/py/Monopolya/polzovatel_1.png')
self.Label_ing.setPixmap(self.img)
self.Label_ing.move(75, 20)
# манипуляции
# Валюта
self.PB_money = QPushButton('Валюта ₽', self)
self.PB_money.move(15, 260)
self.PB_money.resize(150, 25)
self.PB_money.setStyleSheet('font: 13pt \'Arial Black\'')
self.PB_money.clicked.connect(self.money_func)
# Репутация
self.PB_reputation = QPushButton('Репутация ⓇⓅ', self)
self.PB_reputation.move(185, 260)
self.PB_reputation.resize(150, 25)
self.PB_reputation.setStyleSheet('font: 13pt \'Arial Black\'')
self.PB_reputation.clicked.connect(self.reputation_func)
# Кредит
self.PB_credit = QPushButton("Кредит", self)
self.PB_credit.move(15, 300)
self.PB_credit.resize(150, 25)
self.PB_credit.setStyleSheet('font: 13pt \'Arial Black\'')
self.PB_credit.clicked.connect(self.credit_func)
# Доход
self.PB_income = QPushButton('Доход', self)
self.PB_income.move(185, 300)
self.PB_income.resize(150, 25)
self.PB_income.setStyleSheet('font: 13pt \'Arial Black\'')
self.PB_income.clicked.connect(self.income_func)
# информация
self.Label_Money = QLabel(self)
self.Label_Money.move(50, 350)
self.Label_Money.resize(400, 25)
self.Label_Money.setStyleSheet("font: 15pt \'Arial Black\'")
self.Label_reputation = QLabel(self)
self.Label_reputation.move(50, 400)
self.Label_reputation.resize(400, 25)
self.Label_reputation.setStyleSheet("font: 15pt \'Arial Black\'")
self.Label_income = QLabel(self)
self.Label_income.move(50, 450)
self.Label_income.resize(400, 25)
self.Label_income.setStyleSheet("font: 15pt \'Arial Black\'")
self.Label_credit = QLabel(self)
self.Label_credit.move(50, 500)
self.Label_credit.resize(400, 25)
self.Label_credit.setStyleSheet("font: 15pt \'Arial Black\'")
self.t = QtCore.QTimer(interval=100)
self.t.timeout.connect(self.update_info)
self.t.start()
def update_info(self):
global money_perem, reputation_perem, income_perem, credit_perem, income_perem_old
income_perem = income_perem_old / 100 * (100 - (100 - reputation_perem))
self.Label_Money.setText('Деньги: ' + str(money_perem / 1000000) + ' ' + "млн ₽")
self.Label_reputation.setText('Репутация: ' + str(reputation_perem) + ' ' + 'ⓇⓅ')
self.Label_income.setText('Доход: ' + str(income_perem / 1000) + ' ' + '(' + str(income_perem_old / 1000) + ')' + ' тыс ₽')
self.Label_credit.setText('Кредит: ' + str(credit_perem / 1000000) + ' ' + 'млн ₽')
def credit_func(self):
self.cr = credit()
self.cr.show()
def money_func(self):
self.m = money()
self.m.show()
def reputation_func(self):
self.rep = reputation()
self.rep.show()
def income_func(self):
self.incom = income()
self.incom.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
file = QtCore.QFile("C:/for cheacher/3_mate_files/dark.qss")
file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text)
stream = QtCore.QTextStream(file)
app.setStyleSheet(stream.readAll())
w = player_1()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я отметил строки которые поменял. class Player_1 - теперь в макета. Никаких глобальных переменных. Поменяйте изображение и dark.qss на свое.
import sys #, os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
#import player
class Player_1(QtWidgets.QWidget):
def __init__(self, parent=None):
#- global money_perem, credit_perem, reputation_perem, income_perem, income_perem_old
super(Player_1, self).__init__(parent)
self.money_perem = 0;
self.income_perem_old = 500;
self.income_perem = 0;
self.credit_perem = 0;
self.reputation_perem = 20
self.setFixedSize(350, 550)
# изображение
self.Label_ing = QLabel('', self)
self.Label_ing.setPixmap(QtGui.QPixmap('head3.png').scaled(140, 140)) # !
#? манипуляции
# Валюта
self.PB_money = QPushButton('Валюта ₽', minimumHeight=50)
self.PB_money.clicked.connect(self.money_func)
# Репутация
self.PB_reputation = QPushButton('Репутация ⓇⓅ', minimumHeight=50)
self.PB_reputation.clicked.connect(self.reputation_func)
# Кредит
self.PB_credit = QPushButton("Кредит", minimumHeight=50)
self.PB_credit.clicked.connect(self.credit_func)
# Доход
self.PB_income = QPushButton('Доход', minimumHeight=50)
self.PB_income.clicked.connect(self.income_func)
# информация
self.Label_Money = QLabel(self)
self.Label_reputation = QLabel(self)
self.Label_income = QLabel(self)
self.Label_credit = QLabel(self)
# ++ vvv
self.grid_layout = QGridLayout(self)
self.grid_layout.addWidget(self.Label_ing, 0, 0, 2, 2, alignment=Qt.AlignCenter)
self.grid_layout.addWidget(self.PB_money, 2, 0)
self.grid_layout.addWidget(self.PB_reputation, 2, 1)
self.grid_layout.addWidget(self.PB_credit, 3, 0)
self.grid_layout.addWidget(self.PB_income, 3, 1)
self.grid_layout.addWidget(self.Label_Money, 4, 0, 1, 2)
self.grid_layout.addWidget(self.Label_reputation, 5, 0, 1, 2)
self.grid_layout.addWidget(self.Label_income, 6, 0, 1, 2)
self.grid_layout.addWidget(self.Label_credit, 7, 0, 1, 2)
# ++ ^^^
self.t = QtCore.QTimer(interval=1000) # 100
self.t.timeout.connect(self.update_info)
self.t.start()
def update_info(self):
#- global money_perem, reputation_perem, income_perem, credit_perem, income_perem_old
self.income_perem = self.income_perem_old / 100 * (100 - (100 - self.reputation_perem))
self.Label_Money.setText('Деньги: ' + str(self.money_perem / 1000000) + ' ' + "млн ₽")
self.Label_reputation.setText('Репутация: ' + str(self.reputation_perem) + ' ' + 'ⓇⓅ')
self.Label_income.setText('Доход: ' + str(self.income_perem / 1000) + ' ' + '(' + str(self.income_perem_old / 1000) + ')' + ' тыс ₽')
self.Label_credit.setText('Кредит: ' + str(self.credit_perem / 1000000) + ' ' + 'млн ₽')
def credit_func(self):
self.cr = credit()
self.cr.show()
def money_func(self):
self.m = money()
self.m.show()
def reputation_func(self):
self.rep = reputation()
self.rep.show()
def income_func(self):
self.incom = income()
self.incom.show()
class Main(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.setFixedSize(700, 600) # 750, 560
#
self.p1 = Player_1()
self.p2 = Player_1() # +
self.p3 = Player_1() # +
self.stting = QLabel("админ - панель") # ? Sttings()
self.stting.setFixedSize(350, 550)
# ++ vvv
self.widget = QWidget()
self.lay = QHBoxLayout(self.widget) # self
self.lay.setContentsMargins(0, 0, 0, 0)
self.lay.addWidget(self.stting)
self.lay.addWidget(self.p1) #Player_1())
self.lay.addWidget(self.p2) #Player_1())
self.lay.addWidget(self.p3) #Player_1())
# ++ ^^^
self.scroll_area = QtWidgets.QScrollArea(self)
#- self.scroll_area.setLayout(self.lay)
self.scroll_area.setWidget(self.widget)
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scrollbar = QtWidgets.QScrollBar(Qt.Horizontal, self)
# ? self.scrollbar.setMaximum(250)
self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())
self.scrollbar.valueChanged.connect(self.sync_func)
self.v_layout = QtWidgets.QVBoxLayout(self)
self.v_layout.addWidget(self.scroll_area)
self.v_layout.addWidget(self.scrollbar)
def sync_func(self):
self.scroll_area.horizontalScrollBar().setValue(self.scrollbar.value()) # ? * 1
self.transition()
def transition(self):
# player.reputation_perem = player.reputation_perem + (player.reputation_perem / 100 * 5)
# player.money_perem = player.money_perem + player.income_perem
self.p1.reputation_perem = self.p1.reputation_perem + (self.p1.reputation_perem / 100 * 5)
self.p1.money_perem = self.p1.money_perem + self.p1.income_perem
#reputation_perem_2 = reputation_perem_2 + (reputation_perem_2 / 100 * 5)
#income_perem_2 = income_perem_old_2 / 100 * (100 - (100 - reputation_perem_2))
#money_perem_2 = money_perem_2 + income_perem_2
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
app.setFont(QFont("Arial Black", 12, QFont.Bold))
w = Main()
w.show()
# file = QtCore.QFile("C:/for cheacher/3_mate_files/dark.qss")
file = QtCore.QFile("D:/_Qt/Python-Examples/_PyQt5/Style/BreezeStyleSheets/dark.qss") # !
file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text)
stream = QtCore.QTextStream(file)
app.setStyleSheet(stream.readAll())
sys.exit(app.exec_())


