我有一个用 PyQt5 制作的小型 GUI,它基本上由一个实时绘图和两个用于停止和恢复的按钮组成。我想每 measure_interval
毫秒更新一次绘图。在我的脚本中,我将其设置为 1000(1 秒)。程序开始正常工作,但是当我按“停止”按钮然后按“开始”恢复时,计时器似乎在加速,即使其时间间隔没有改变。事实上,每当我按下“开始”按钮时,绘图就会加速(即使之前没有停止)。所以我相信错误就在那里,尽管我无法发现它。这是我的代码:
import numpy as np
from matplotlib.backends.qt_compat import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
global measure_interval
super(ApplicationWindow, self).__init__()
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
# Canvas
dynamic_canvas = FigureCanvas(Figure(figsize=(10, 10)))
self._dynamic_ax = dynamic_canvas.figure.subplots()
self._timer = dynamic_canvas.new_timer(measure_interval, [(self._update_window, (), {})])
self._timer.start()
# Buttons
button_stop = QtWidgets.QPushButton('Stop', self)
button_stop.clicked.connect(self._timer.stop)
button_start = QtWidgets.QPushButton('Start', self)
button_start.clicked.connect(self._timer.start)
# Layout
layout = QtWidgets.QVBoxLayout(self._main)
layout.addWidget(dynamic_canvas)
layout.addWidget(button_stop)
layout.addWidget(button_start)
def _update_window(self):
global x, y, win_size, count_iter
# Update variables
x.append(x[count_iter] + 0.01)
y.append(np.random.random())
idx_inf = max([count_iter-win_size, 0])
count_iter += 1
# Plot
self._dynamic_ax.clear()
self._dynamic_ax.plot(x[idx_inf:count_iter], y[idx_inf:count_iter],'-o', color='b')
self._dynamic_ax.figure.canvas.draw()
#%%
if __name__ == "__main__":
measure_interval = 1000 # milisegs
win_size = 100 # maximum window size (samples)
y = [np.random.random()]
x = [0]
count_iter = 0
qapp = QtWidgets.QApplication([])
app = ApplicationWindow()
app.show()
qapp.exec_()
最佳答案
按下开始按钮时,计时器间隔会重置为0
。
这是因为 .start()
函数采用一个参数 interval
,该参数旨在设置计时器的间隔。
但是,当直接使用 start()
作为按钮的 clicked
信号的回调时,将提供一些状态 False
到回调。因此,本质上,当按下按钮时,您会调用 start(False)
。这与 python 中的 start(0)
相同,因此间隔设置为 0
。
为了避免这种情况,您可以使用 lambda 函数并确保在不带参数的情况下调用 start()
,在这种情况下,它将记住初始设置的间隔并使用它。
button_start.clicked.connect(lambda : self._timer.start())
关于python - 为什么按下 PyQt 按钮时 matplotlib 的计时器会加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51595337/