Reputation: 15
In my program I wanted to have UI in PyQt with multiple sliders with labels for input data collection.
They are very similar so I have made a class to create them easily.
Class code:
class MySlider(QWidget):
def make_slider(self, name, posx, posy, maxi, mini, font_size, orientation):
self.label = QLabel(name, parent=self)
self.label.setGeometry(posx - 30, posy - 45, 100, 40)
self.label.setFont(QtGui.QFont("Sanserif", font_size))
self.slider = QSlider(parent=self)
self.slider.setOrientation(orientation)
self.slider.setTickPosition(QSlider.TicksBelow)
self.slider.setMaximum(maxi)
self.slider.setMinimum(mini)
self.slider.setTickInterval(1)
self.slider.move(posx, posy)
self.label2 = QLabel(str(mini), parent=self)
self.label2.setFont(QtGui.QFont("Sanserif", font_size))
self.label2.setGeometry(posx, posy + 90, 50, 20)
self.slider.valueChanged.connect(self.changed_value)
def changed_value(self):
wartosc = self.slider.value()
self.label2.setText(str(wartosc))
Then I create 3 instances in my MainWindow.
self.bumping_slider = MySlider(self)
self.bumping_slider.make_slider((" Kołek\nbumpingowy"), 500, 95, 10, 1, 12, Qt.Vertical)
self.column_slider = MySlider(self)
self.column_slider.make_slider((" Liczba\n kolumn"), 590, 95, 6, 1, 12, Qt.Vertical)
self.test_slider = MySlider(self)
self.test_slider.make_slider((" Liczba\n czegos"), 680, 95, 6, 1, 12, Qt.Vertical)
When I write the code directly in MainWindow class definition sliders work correctly. But when I use my created class the problem is that changed_value function always works for the last slider only. The other ones are blocked and I cant even move the silder and change it's value in app window. App runs without any errors. I can't find what the problem is so the function changed_value would work separatly for each instance.
Full code:
import sys
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MySlider(QWidget):
def __init__(self, parent=None):
super(MySlider, self).__init__(parent)
def make_slider(self, name, posx, posy, maxi, mini, font_size, orientation):
"""posx,posy,font_size,max,min = int orientation = Qt.Horizontal or Vertical,name = str name of slider"""
self.label = QLabel(name, self)
self.label.setGeometry(posx - 30, posy - 45, 100, 40) # 210,60
self.label.setFont(QtGui.QFont("Sanserif", font_size))
self.slider = QSlider(self)
self.slider.setOrientation(orientation)
self.slider.setTickPosition(QSlider.TicksBelow)
self.slider.setMaximum(maxi)
self.slider.setMinimum(mini)
self.slider.setTickInterval(1)
self.slider.move(posx, posy)
self.label2 = QLabel(str(mini), self)
self.label2.setFont(QtGui.QFont("Sanserif", font_size))
self.label2.setGeometry(posx, posy + 90, 50, 20)
self.slider.valueChanged.connect(self.changed_value)
def changed_value(self):
print(self)
wartosc = self.slider.value()
self.label2.setText(str(wartosc))
class Window(QWidget):
"""kreowanie klasy okna"""
def __init__(self):
super().__init__()
self.setWindowTitle("Kalkulator liczby kombinacji")
self.setGeometry(1700, 600, 750, 320)
self.setWindowIcon(QtGui.QIcon("icon.png"))
self.test_slider2 = MySlider(self)
self.test_slider2.make_slider((" Liczba\n czegos"), 140, 95, 6, 1, 12, Qt.Vertical)
self.test_slider3 = MySlider(self)
self.test_slider3.make_slider((" Liczba\n czegos"), 230, 95, 6, 1, 12, Qt.Vertical)
self.test_slider4 = MySlider(self)
self.test_slider4.make_slider((" Liczba\n czegos"), 320, 95, 6, 1, 12, Qt.Vertical)
self.test_slider5 = MySlider(self)
self.test_slider5.make_slider((" Liczba\n czegos"), 410, 95, 6, 1, 12, Qt.Vertical)
self.bumping_slider = MySlider(self)
self.bumping_slider.make_slider((" Kołek\nbumpingowy"), 500, 95, 10, 1, 12, Qt.Vertical)
self.column_slider = MySlider(self)
self.column_slider.make_slider((" Liczba\n kolumn"), 590, 95, 6, 1, 12, Qt.Vertical)
self.test_slider = MySlider(self)
self.test_slider.make_slider((" Liczba\n czegos"), 680, 95, 6, 1, 12, Qt.Vertical)
self.show()
app = QApplication(sys.argv)
app.setStyle("Fusion")
window = Window()
sys.exit(app.exec())
Upvotes: 1
Views: 387
Reputation: 13651
Paste your widgets into the layout:
import sys
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MySlider(QWidget):
def __init__(self, name, maxi, mini, font_size, orientation, parent=None):
super(MySlider, self).__init__(parent)
self.setMinimumSize(100, 200) # +++
# def make_slider(self, name, posx, posy, maxi, mini, font_size, orientation):
# """posx,posy,font_size,max,min = int orientation = Qt.Horizontal or Vertical,name = str name of slider"""
self.label = QLabel(name, self)
# self.label.setGeometry(posx - 30, posy - 45, 100, 40) # 210,60
self.label.setFont(QtGui.QFont("Sanserif", font_size))
self.slider = QSlider(self)
self.slider.setOrientation(orientation)
self.slider.setTickPosition(QSlider.TicksBelow)
self.slider.setMaximum(maxi)
self.slider.setMinimum(mini)
self.slider.setTickInterval(1)
# self.slider.move(posx, posy)
self.label2 = QLabel(str(mini), self)
self.label2.setFont(QtGui.QFont("Sanserif", font_size))
# self.label2.setGeometry(posx, posy + 90, 50, 20)
self.slider.valueChanged.connect(self.changed_value)
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.label, alignment = Qt.AlignCenter)
self.layout.addWidget(self.slider, alignment = Qt.AlignCenter)
self.layout.addWidget(self.label2, alignment = Qt.AlignCenter)
self.layout.addStretch()
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def changed_value(self, val): # + val
print(val)
# wartosc = self.slider.value()
# self.label2.setText(str(wartosc))
self.label2.setNum(val) # + val
class Window(QWidget):
# """kreowanie klasy okna"""
def __init__(self):
super().__init__()
self.setWindowTitle("Kalkulator liczby kombinacji")
# self.setGeometry(100, 60, 750, 320)
self.resize(750, 300)
self.setWindowIcon(QtGui.QIcon("icon.png"))
self.layout = QHBoxLayout(self) # +++
self.layout.addStretch()
self.test_slider2 = MySlider("Liczba\nczegos", 6, 1, 12, Qt.Vertical, self)
# self.test_slider2.make_slider((" Liczba\n czegos"), 140, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.test_slider2) # +++
self.test_slider3 = MySlider("Liczba\nczegos",6, 1, 12, Qt.Vertical, self)
# self.test_slider3.make_slider((" Liczba\n czegos"), 230, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.test_slider3) # +++
self.test_slider4 = MySlider("Liczba\nczegos",6, 1, 12, Qt.Vertical, self)
# self.test_slider4.make_slider((" Liczba\n czegos"), 320, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.test_slider4) # +++
self.test_slider5 = MySlider("Liczba\nczegos",6, 1, 12, Qt.Vertical, self)
# self.test_slider5.make_slider((" Liczba\n czegos"), 410, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.test_slider5) # +++
self.bumping_slider = MySlider("Kołek\nbumpingowy", 10, 1, 12, Qt.Vertical, self)
# self.bumping_slider.make_slider((" Kołek\nbumpingowy"), 500, 95, 10, 1, 12, Qt.Vertical)
self.layout.addWidget(self.bumping_slider) # +++
self.column_slider = MySlider("Liczba\nkolumn", 6, 1, 12, Qt.Vertical, self)
# self.column_slider.make_slider((" Liczba\n kolumn"), 590, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.column_slider) # +++
self.test_slider = MySlider("Liczba\nczegos", 6, 1, 12, Qt.Vertical, self)
# self.test_slider.make_slider((" Liczba\n czegos"), 680, 95, 6, 1, 12, Qt.Vertical)
self.layout.addWidget(self.test_slider) # +++
self.layout.addStretch()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle("Fusion")
window = Window()
window.show()
sys.exit(app.exec())
Upvotes: 1