我试图用一个for循环分配方法QScrollbars的信号的valueChanged,使我的代码更干净。然而,这似乎并没有正常工作。我究竟做错了什么?
import sys
from PyQt5.QtWidgets import QScrollBar, QDialog, QVBoxLayout, QApplication
class MainWindow(QDialog):
def __init__(self):
super().__init__()
self.layout = QVBoxLayout(self)
self.scrollbar1 = QScrollBar(self)
self.scrollbar2 = QScrollBar(self)
self.scrollbars = [self.scrollbar1, self.scrollbar2]
self.names = ['scrollbar 1', 'scrollbar 2']
self.layout.addWidget(self.scrollbar1)
self.layout.addWidget(self.scrollbar2)
for scrollbar, name in zip(self.scrollbars, self.names):
print(scrollbar, name)
scrollbar.valueChanged.connect(lambda: self.test(name))
# self.scrollbar1.valueChanged.connect(
# lambda: self.test(self.names[0])
# )
# self.scrollbar2.valueChanged.connect(
# lambda: self.test(self.names[1])
# )
self.show()
def test(self, scrollbar):
print(scrollbar)
if __name__ == '__main__':
app = QApplication(sys.argv)
GUI = MainWindow()
sys.exit(app.exec_())
分配方法“手动”就可以工作,即不同的名称被传递。然而,当for循环使用,对于滚动条相同的名称被印刷在一个值的变化。
编辑:这是我的snap_slider方法
旧:
def snap_slider(scrollbar):
x = np.modf(scrollbar.value() / scrollbar.singleStep())
if x[0] < 0.5:
scrollbar.setSliderPosition(
int(x[1] * scrollbar.singleStep()))
else:
scrollbar.setSliderPosition(
int((x[1]+1) * scrollbar.singleStep()))
新:
def snap_slider(self):
x = np.modf(self.sender().value() / self.sender().singleStep())
if x[0] < 0.5:
self.sender().setSliderPosition(
int(x[1] * self.sender().singleStep()))
else:
self.sender().setSliderPosition(
int((x[1] + 1) * self.sender().singleStep()))
这里有几件事情,因为你正试图使你的代码更加清晰:
sender()
方法的一个lambda
功能show()
方法同样的事情:避免将其放在__init__
方法,因为您可能需要实例化一个MainWindow
没有表现出它(例如:用于测试目的)这将使类似:
import sys
from PyQt5.QtWidgets import QScrollBar, QDialog, QVBoxLayout, QApplication
class MainWindow(QDialog):
def __init__(self):
super().__init__()
self.createWidgets()
def createWidgets(self):
self.layout = QVBoxLayout(self)
self.scrollbar1 = QScrollBar(self)
self.scrollbar2 = QScrollBar(self)
for widget in [self.scrollbar1, self.scrollbar2]:
widget.valueChanged.connect(self.test)
self.layout.addWidget(widget)
def test(self, event):
print(self.sender())
if __name__ == '__main__':
app = QApplication(sys.argv)
GUI = MainWindow()
GUI.show()
sys.exit(app.exec_())