python - 使用 for 循环将方法分配给 QScrollbars 的 valueChanged 信号似乎不起作用
问题描述
我正在尝试使用 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
函数 - 将 UI 设置隔离在一个单独的函数中是一种很好的做法,您可以在其他地方调用该函数
- 方法相同
show()
:避免将其放入__init__
方法中,因为您可能需要实例化 aMainWindow
而不显示它(例如:出于测试目的)
这会给出类似的东西:
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_())
推荐阅读
- python - 从python中的字符串中删除数字
- android - 使用带有 android 的 sheet api 添加一行
- java - TelephonyManager getstate() 在 android 中返回零
- python - python 正则表达式试图匹配字符串中第二次出现的一组单词
- php - PHP 使用 FWRITE 和 SSH2 上传多个文件
- bash - 按名称显示文件的内容
- python - 如何在z之后增加字母字符而不获取特殊字符?
- python - 在 Jupyter Notebook Python 3.7.1 中执行函数后变量被更改
- typescript - 如何在 Angular 应用程序中使用 gltf-validator 包
- c# - 如何为方法 MongoDB.Bson.Serialization.BsonSerializer.Deserialize 自定义映射字段名称或类型