Python 使用for循环为QScrollbars的valueChanged信号指定方法似乎不起作用
我试图使用for循环为QScrollbars的valueChanged信号分配方法,以使代码更干净。然而,这似乎并不正确。我做错了什么Python 使用for循环为QScrollbars的valueChanged信号指定方法似乎不起作用,python,pyqt,Python,Pyqt,我试图使用for循环为QScrollbars的valueChanged信号分配方法,以使代码更干净。然而,这似乎并不正确。我做错了什么 import sys from PyQt5.QtWidgets import QScrollBar, QDialog, QVBoxLayout, QApplication class MainWindow(QDialog): def __init__(self): super().__init__() self.lay
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循环时,对于两个滚动条,相同的名称会打印在值更改上
编辑:这是我的快照滑块方法
旧的:
def snap_滑块(滚动条):
x=np.modf(scrollbar.value()/scrollbar.singleStep())
如果x[0]<0.5:
滚动条。设置滑动位置(
int(x[1]*scrollbar.singleStep())
其他:
滚动条。设置滑动位置(
int((x[1]+1)*滚动条.singleStep())
新的:
def捕捉滑块(自身):
x=np.modf(self.sender().value()/self.sender().singleStep())
如果x[0]<0.5:
self.sender().setSliderPosition(
int(x[1]*self.sender().singleStep())
其他:
self.sender().setSliderPosition(
int((x[1]+1)*self.sender().singleStep())
这里有几件事,因为您正在努力使代码更干净:
- 您应该更喜欢使用
方法而不是sender()
函数lambda
- 最好将UI设置隔离在一个单独的函数中,您可以在其他地方调用该函数
方法也是一样:避免将其放在show()
方法中,因为您可能需要实例化\uuuu init\uuuu
主窗口而不显示它(例如:出于测试目的)
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_())
哇,太快了!非常感谢您的反馈!我不知道sender()方法,这使事情变得容易多了。例如,我正在编写一个snap_滑块方法,该方法会影响滚动条,但最初,我必须传递滚动条才能使其工作(请参见编辑的主要帖子)。这好多了!你能解释一下为什么它不能与lambda函数一起工作吗?看一看,这应该能回答你的问题它能!谢谢
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()))
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_())