【发布时间】:2017-11-25 11:21:38
【问题描述】:
我使用两个小部件:QSpinBox 和 QLineEdit。 QSpinBox 小部件的valueChanged 插槽连接到update 函数。该函数由一个耗时的处理(一个带有计算的循环或一个time.sleep() 调用)和一个QLineEdit.setText() 调用组成。一开始,我认为它按预期工作,但我注意到当计算需要很长时间时,信号似乎被发射了两次。
下面是代码:
import time
from PyQt5.QtWidgets import QWidget, QSpinBox, QVBoxLayout, QLineEdit
class Window(QWidget):
def __init__(self):
# parent constructor
super().__init__()
# widgets
self.spin_box = QSpinBox()
self.line_edit = QLineEdit()
# layout
v_layout = QVBoxLayout()
v_layout.addWidget(self.spin_box)
v_layout.addWidget(self.line_edit)
# signals-slot connections
self.spin_box.valueChanged.connect(self.update)
#
self.setLayout(v_layout)
self.show()
def update(self, param_value):
print('update')
# time-consuming part
time.sleep(0.5) # -> double increment
#time.sleep(0.4) # -> works normally!
self.line_edit.setText(str(param_value))
if __name__ == '__main__':
from PyQt5.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
win = Window()
sys.exit(app.exec_())
update的另一个版本:
# alternative version, calculations in a loop instead of time.sleep()
# -> same behaviour
def update2(self, param_value):
print('update2')
for i in range(2000000): # -> double increment
x = i**0.5 * i**0.2
#for i in range(200000): # -> works normally!
# x = i**0.5 * i**0.2
self.line_edit.setText(str(param_value))
【问题讨论】:
-
我尝试了相同的代码,结果相同,并且 param_value 的递增?什么鬼......我真的很想看到答案:)
-
这特别烦人,因为如果你只是减小范围参数,它就可以工作......删除一个零就可以了。
-
我用
time.sleep代替time.sleep(0.4),它可以工作,而time.sleep(0.5)和更多则不能 -
我得到了同样的结果。我从来没有听说过这样的限制,我一定是做错了什么......
标签: python pyqt pyqt5 signals-slots qspinbox